From 19a34e910261a9397735fafc9faa2ce75ae53985 Mon Sep 17 00:00:00 2001 From: obucina <11353193+obucina@users.noreply.github.com> Date: Sat, 21 Mar 2020 09:47:46 +0100 Subject: [PATCH] Revert "Merge develop branch changes(GPOS+graphene updates) into SONs branch" --- .gitignore | 1 - .gitmodules | 3 +- CMakeDoxyfile.in | 279 ---- Doxyfile | 2 +- libraries/app/CMakeLists.txt | 4 +- libraries/app/api.cpp | 65 +- libraries/app/application.cpp | 29 +- libraries/app/database_api.cpp | 351 +--- libraries/app/impacted.cpp | 369 +++++ libraries/app/include/graphene/app/api.hpp | 60 +- .../app/include/graphene/app/application.hpp | 8 +- .../app/include/graphene/app/database_api.hpp | 101 +- .../include/graphene/app}/impacted.hpp | 4 +- libraries/chain/CMakeLists.txt | 2 - libraries/chain/account_evaluator.cpp | 83 +- libraries/chain/account_object.cpp | 19 +- libraries/chain/asset_evaluator.cpp | 72 +- libraries/chain/asset_object.cpp | 16 +- libraries/chain/balance_evaluator.cpp | 1 - .../chain/committee_member_evaluator.cpp | 10 +- libraries/chain/db_balance.cpp | 11 +- libraries/chain/db_block.cpp | 215 +-- libraries/chain/db_debug.cpp | 2 +- libraries/chain/db_getter.cpp | 32 +- libraries/chain/db_init.cpp | 94 +- libraries/chain/db_maint.cpp | 506 ++---- libraries/chain/db_management.cpp | 14 +- libraries/chain/db_market.cpp | 20 +- libraries/chain/db_notify.cpp | 28 +- libraries/chain/db_update.cpp | 102 +- libraries/chain/db_witness_schedule.cpp | 12 +- libraries/chain/genesis_state.cpp | 69 - libraries/chain/hardfork.d/GPOS.hf | 4 - .../include/graphene/chain/account_object.hpp | 96 +- .../include/graphene/chain/asset_object.hpp | 108 +- .../include/graphene/chain/balance_object.hpp | 2 - .../include/graphene/chain/block_database.hpp | 2 - .../graphene/chain/block_summary_object.hpp | 4 - .../graphene/chain/budget_record_object.hpp | 17 +- .../include/graphene/chain/buyback_object.hpp | 2 - .../graphene/chain/chain_property_object.hpp | 4 +- .../chain/committee_member_object.hpp | 5 +- .../graphene/chain/confidential_object.hpp | 9 +- .../chain/include/graphene/chain/config.hpp | 5 +- .../chain/include/graphene/chain/database.hpp | 45 +- .../include/graphene/chain/exceptions.hpp | 16 - .../include/graphene/chain/fba_object.hpp | 5 +- .../include/graphene/chain/fork_database.hpp | 5 - .../include/graphene/chain/genesis_state.hpp | 81 +- .../graphene/chain/global_property_object.hpp | 4 +- .../chain/immutable_chain_parameters.hpp | 7 +- .../include/graphene/chain/market_object.hpp | 4 - .../chain/operation_history_object.hpp | 19 +- .../graphene/chain/proposal_object.hpp | 5 +- .../graphene/chain/protocol/account.hpp | 22 +- .../graphene/chain/protocol/address.hpp | 12 +- .../graphene/chain/protocol/assert.hpp | 3 - .../include/graphene/chain/protocol/asset.hpp | 4 - .../graphene/chain/protocol/asset_ops.hpp | 27 - .../graphene/chain/protocol/authority.hpp | 3 - .../graphene/chain/protocol/balance.hpp | 4 - .../include/graphene/chain/protocol/base.hpp | 5 - .../include/graphene/chain/protocol/block.hpp | 5 - .../graphene/chain/protocol/buyback.hpp | 2 - .../chain/protocol/chain_parameters.hpp | 34 +- .../chain/protocol/committee_member.hpp | 7 - .../graphene/chain/protocol/confidential.hpp | 7 - .../graphene/chain/protocol/custom.hpp | 3 - .../include/graphene/chain/protocol/ext.hpp | 1 - .../include/graphene/chain/protocol/fba.hpp | 3 - .../graphene/chain/protocol/fee_schedule.hpp | 3 - .../graphene/chain/protocol/market.hpp | 11 +- .../include/graphene/chain/protocol/memo.hpp | 3 - .../graphene/chain/protocol/operations.hpp | 2 - .../graphene/chain/protocol/proposal.hpp | 8 - .../chain/protocol/special_authority.hpp | 2 - .../graphene/chain/protocol/transaction.hpp | 5 - .../graphene/chain/protocol/transfer.hpp | 6 - .../include/graphene/chain/protocol/types.hpp | 30 +- .../graphene/chain/protocol/vesting.hpp | 20 +- .../include/graphene/chain/protocol/vote.hpp | 9 +- .../chain/protocol/withdraw_permission.hpp | 10 - .../graphene/chain/protocol/witness.hpp | 6 - .../graphene/chain/protocol/worker.hpp | 3 - .../include/graphene/chain/pts_address.hpp | 11 +- .../chain/special_authority_object.hpp | 2 - .../graphene/chain/transaction_object.hpp | 4 +- .../chain/vesting_balance_evaluator.hpp | 1 - .../graphene/chain/vesting_balance_object.hpp | 8 +- .../chain/withdraw_permission_object.hpp | 2 - .../include/graphene/chain/witness_object.hpp | 4 +- .../chain/witness_schedule_object.hpp | 3 - .../include/graphene/chain/worker_object.hpp | 5 +- libraries/chain/proposal_evaluator.cpp | 15 +- libraries/chain/proposal_object.cpp | 4 +- libraries/chain/protocol/account.cpp | 16 - libraries/chain/protocol/address.cpp | 5 +- libraries/chain/protocol/assert.cpp | 10 +- libraries/chain/protocol/asset.cpp | 11 +- libraries/chain/protocol/asset_ops.cpp | 29 - libraries/chain/protocol/authority.cpp | 3 - libraries/chain/protocol/block.cpp | 5 - libraries/chain/protocol/committee_member.cpp | 11 - libraries/chain/protocol/confidential.cpp | 13 +- libraries/chain/protocol/custom.cpp | 5 - libraries/chain/protocol/fee_schedule.cpp | 4 - libraries/chain/protocol/market.cpp | 9 - libraries/chain/protocol/memo.cpp | 4 - libraries/chain/protocol/operations.cpp | 5 - libraries/chain/protocol/proposal.cpp | 9 - libraries/chain/protocol/small_ops.cpp | 44 - libraries/chain/protocol/tournament.cpp | 1 - libraries/chain/protocol/transaction.cpp | 5 - libraries/chain/protocol/transfer.cpp | 7 - libraries/chain/protocol/vote.cpp | 2 - .../chain/protocol/withdraw_permission.cpp | 11 +- libraries/chain/protocol/witness.cpp | 6 - libraries/chain/protocol/worker.cpp | 4 - libraries/chain/pts_address.cpp | 11 +- libraries/chain/small_objects.cpp | 72 - libraries/chain/special_authority.cpp | 5 - libraries/chain/vesting_balance_evaluator.cpp | 118 +- libraries/chain/vesting_balance_object.cpp | 40 +- libraries/chain/worker_evaluator.cpp | 2 +- libraries/egenesis/egenesis_none.cpp | 2 - libraries/fc | 2 +- libraries/net/CMakeLists.txt | 1 - .../net/include/graphene/net/message.hpp | 14 +- .../include/graphene/net/peer_connection.hpp | 7 +- .../include/graphene/net/peer_database.hpp | 8 +- libraries/net/message.cpp | 29 - libraries/net/message_oriented_connection.cpp | 34 +- libraries/net/node.cpp | 24 +- libraries/net/peer_connection.cpp | 13 +- libraries/net/peer_database.cpp | 11 - libraries/plugins/CMakeLists.txt | 2 - .../account_history_plugin.cpp | 7 +- .../accounts_list/accounts_list_plugin.cpp | 2 +- .../affiliate_stats_plugin.cpp | 2 +- libraries/plugins/bookie/bookie_plugin.cpp | 10 +- .../delayed_node/delayed_node_plugin.cpp | 2 +- .../plugins/elasticsearch/CMakeLists.txt | 23 - .../elasticsearch/elasticsearch_plugin.cpp | 622 ------- .../elasticsearch/elasticsearch_plugin.hpp | 289 ---- libraries/plugins/es_objects/CMakeLists.txt | 23 - libraries/plugins/es_objects/es_objects.cpp | 401 ----- .../graphene/es_objects/es_objects.hpp | 113 -- libraries/plugins/snapshot/CMakeLists.txt | 2 - .../include/graphene/snapshot/snapshot.hpp | 1 - libraries/plugins/snapshot/snapshot.cpp | 5 - libraries/utilities/CMakeLists.txt | 1 - libraries/utilities/elasticsearch.cpp | 190 --- .../graphene/utilities/elasticsearch.hpp | 68 - .../wallet/include/graphene/wallet/wallet.hpp | 75 +- libraries/wallet/wallet.cpp | 456 +----- programs/cli_wallet/main.cpp | 12 +- programs/witness_node/CMakeLists.txt | 2 +- programs/witness_node/genesis.json | 44 +- programs/witness_node/main.cpp | 12 +- tests/CMakeLists.txt | 24 +- tests/app/main.cpp | 1 - tests/cli/cli_fixture.cpp | 2 +- tests/cli/main.cpp | 3 +- tests/cli/son.cpp | 15 +- tests/common/database_fixture.cpp | 69 +- tests/common/genesis_file_util.hpp | 2 +- tests/elasticsearch/main.cpp | 535 ------ tests/tests/block_tests.cpp | 13 +- tests/tests/gpos_tests.cpp | 1453 ----------------- tests/tests/history_api_tests.cpp | 400 +++-- tests/tests/voting_tests.cpp | 362 +--- 171 files changed, 1455 insertions(+), 7752 deletions(-) delete mode 100644 CMakeDoxyfile.in create mode 100644 libraries/app/impacted.cpp rename libraries/{chain/include/graphene/chain => app/include/graphene/app}/impacted.hpp (96%) delete mode 100644 libraries/chain/hardfork.d/GPOS.hf delete mode 100644 libraries/chain/protocol/small_ops.cpp delete mode 100644 libraries/chain/small_objects.cpp delete mode 100644 libraries/net/message.cpp delete mode 100644 libraries/plugins/elasticsearch/CMakeLists.txt delete mode 100644 libraries/plugins/elasticsearch/elasticsearch_plugin.cpp delete mode 100644 libraries/plugins/elasticsearch/include/graphene/elasticsearch/elasticsearch_plugin.hpp delete mode 100644 libraries/plugins/es_objects/CMakeLists.txt delete mode 100644 libraries/plugins/es_objects/es_objects.cpp delete mode 100644 libraries/plugins/es_objects/include/graphene/es_objects/es_objects.hpp delete mode 100644 libraries/utilities/elasticsearch.cpp delete mode 100644 libraries/utilities/include/graphene/utilities/elasticsearch.hpp delete mode 100644 tests/elasticsearch/main.cpp delete mode 100644 tests/tests/gpos_tests.cpp diff --git a/.gitignore b/.gitignore index 39b23163..90311de0 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ moc_* hardfork.hpp build_xc data -CMakeDoxyfile.in build diff --git a/.gitmodules b/.gitmodules index 4d3518d1..5572259c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,5 @@ ignore = dirty [submodule "libraries/fc"] path = libraries/fc - url = https://github.com/peerplays-network/peerplays-fc.git - branch = latest-fc + url = https://github.com/PBSA/peerplays-fc.git ignore = dirty diff --git a/CMakeDoxyfile.in b/CMakeDoxyfile.in deleted file mode 100644 index b0ed02fb..00000000 --- a/CMakeDoxyfile.in +++ /dev/null @@ -1,279 +0,0 @@ -# -# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! -# - -DOXYFILE_ENCODING = @DOXYGEN_DOXYFILE_ENCODING@ -PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ -PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@ -PROJECT_BRIEF = @DOXYGEN_PROJECT_BRIEF@ -PROJECT_LOGO = @DOXYGEN_PROJECT_LOGO@ -OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@ -CREATE_SUBDIRS = @DOXYGEN_CREATE_SUBDIRS@ -ALLOW_UNICODE_NAMES = @DOXYGEN_ALLOW_UNICODE_NAMES@ -OUTPUT_LANGUAGE = @DOXYGEN_OUTPUT_LANGUAGE@ -OUTPUT_TEXT_DIRECTION = @DOXYGEN_OUTPUT_TEXT_DIRECTION@ -BRIEF_MEMBER_DESC = @DOXYGEN_BRIEF_MEMBER_DESC@ -REPEAT_BRIEF = @DOXYGEN_REPEAT_BRIEF@ -ABBREVIATE_BRIEF = @DOXYGEN_ABBREVIATE_BRIEF@ -ALWAYS_DETAILED_SEC = @DOXYGEN_ALWAYS_DETAILED_SEC@ -INLINE_INHERITED_MEMB = @DOXYGEN_INLINE_INHERITED_MEMB@ -FULL_PATH_NAMES = @DOXYGEN_FULL_PATH_NAMES@ -STRIP_FROM_PATH = @DOXYGEN_STRIP_FROM_PATH@ -STRIP_FROM_INC_PATH = @DOXYGEN_STRIP_FROM_INC_PATH@ -SHORT_NAMES = @DOXYGEN_SHORT_NAMES@ -JAVADOC_AUTOBRIEF = @DOXYGEN_JAVADOC_AUTOBRIEF@ -JAVADOC_BANNER = @DOXYGEN_JAVADOC_BANNER@ -QT_AUTOBRIEF = @DOXYGEN_QT_AUTOBRIEF@ -MULTILINE_CPP_IS_BRIEF = @DOXYGEN_MULTILINE_CPP_IS_BRIEF@ -INHERIT_DOCS = @DOXYGEN_INHERIT_DOCS@ -SEPARATE_MEMBER_PAGES = @DOXYGEN_SEPARATE_MEMBER_PAGES@ -TAB_SIZE = @DOXYGEN_TAB_SIZE@ -ALIASES = @DOXYGEN_ALIASES@ -TCL_SUBST = @DOXYGEN_TCL_SUBST@ -OPTIMIZE_OUTPUT_FOR_C = @DOXYGEN_OPTIMIZE_OUTPUT_FOR_C@ -OPTIMIZE_OUTPUT_JAVA = @DOXYGEN_OPTIMIZE_OUTPUT_JAVA@ -OPTIMIZE_FOR_FORTRAN = @DOXYGEN_OPTIMIZE_FOR_FORTRAN@ -OPTIMIZE_OUTPUT_VHDL = @DOXYGEN_OPTIMIZE_OUTPUT_VHDL@ -OPTIMIZE_OUTPUT_SLICE = @DOXYGEN_OPTIMIZE_OUTPUT_SLICE@ -EXTENSION_MAPPING = @DOXYGEN_EXTENSION_MAPPING@ -MARKDOWN_SUPPORT = @DOXYGEN_MARKDOWN_SUPPORT@ -TOC_INCLUDE_HEADINGS = @DOXYGEN_TOC_INCLUDE_HEADINGS@ -AUTOLINK_SUPPORT = @DOXYGEN_AUTOLINK_SUPPORT@ -BUILTIN_STL_SUPPORT = @DOXYGEN_BUILTIN_STL_SUPPORT@ -CPP_CLI_SUPPORT = @DOXYGEN_CPP_CLI_SUPPORT@ -SIP_SUPPORT = @DOXYGEN_SIP_SUPPORT@ -IDL_PROPERTY_SUPPORT = @DOXYGEN_IDL_PROPERTY_SUPPORT@ -DISTRIBUTE_GROUP_DOC = @DOXYGEN_DISTRIBUTE_GROUP_DOC@ -GROUP_NESTED_COMPOUNDS = @DOXYGEN_GROUP_NESTED_COMPOUNDS@ -SUBGROUPING = @DOXYGEN_SUBGROUPING@ -INLINE_GROUPED_CLASSES = @DOXYGEN_INLINE_GROUPED_CLASSES@ -INLINE_SIMPLE_STRUCTS = @DOXYGEN_INLINE_SIMPLE_STRUCTS@ -TYPEDEF_HIDES_STRUCT = @DOXYGEN_TYPEDEF_HIDES_STRUCT@ -LOOKUP_CACHE_SIZE = @DOXYGEN_LOOKUP_CACHE_SIZE@ -EXTRACT_ALL = @DOXYGEN_EXTRACT_ALL@ -EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@ -EXTRACT_PRIV_VIRTUAL = @DOXYGEN_EXTRACT_PRIV_VIRTUAL@ -EXTRACT_PACKAGE = @DOXYGEN_EXTRACT_PACKAGE@ -EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@ -EXTRACT_LOCAL_CLASSES = @DOXYGEN_EXTRACT_LOCAL_CLASSES@ -EXTRACT_LOCAL_METHODS = @DOXYGEN_EXTRACT_LOCAL_METHODS@ -EXTRACT_ANON_NSPACES = @DOXYGEN_EXTRACT_ANON_NSPACES@ -HIDE_UNDOC_MEMBERS = @DOXYGEN_HIDE_UNDOC_MEMBERS@ -HIDE_UNDOC_CLASSES = @DOXYGEN_HIDE_UNDOC_CLASSES@ -HIDE_FRIEND_COMPOUNDS = @DOXYGEN_HIDE_FRIEND_COMPOUNDS@ -HIDE_IN_BODY_DOCS = @DOXYGEN_HIDE_IN_BODY_DOCS@ -INTERNAL_DOCS = @DOXYGEN_INTERNAL_DOCS@ -CASE_SENSE_NAMES = @DOXYGEN_CASE_SENSE_NAMES@ -HIDE_SCOPE_NAMES = @DOXYGEN_HIDE_SCOPE_NAMES@ -HIDE_COMPOUND_REFERENCE= @DOXYGEN_HIDE_COMPOUND_REFERENCE@ -SHOW_INCLUDE_FILES = @DOXYGEN_SHOW_INCLUDE_FILES@ -SHOW_GROUPED_MEMB_INC = @DOXYGEN_SHOW_GROUPED_MEMB_INC@ -FORCE_LOCAL_INCLUDES = @DOXYGEN_FORCE_LOCAL_INCLUDES@ -INLINE_INFO = @DOXYGEN_INLINE_INFO@ -SORT_MEMBER_DOCS = @DOXYGEN_SORT_MEMBER_DOCS@ -SORT_BRIEF_DOCS = @DOXYGEN_SORT_BRIEF_DOCS@ -SORT_MEMBERS_CTORS_1ST = @DOXYGEN_SORT_MEMBERS_CTORS_1ST@ -SORT_GROUP_NAMES = @DOXYGEN_SORT_GROUP_NAMES@ -SORT_BY_SCOPE_NAME = @DOXYGEN_SORT_BY_SCOPE_NAME@ -STRICT_PROTO_MATCHING = @DOXYGEN_STRICT_PROTO_MATCHING@ -GENERATE_TODOLIST = @DOXYGEN_GENERATE_TODOLIST@ -GENERATE_TESTLIST = @DOXYGEN_GENERATE_TESTLIST@ -GENERATE_BUGLIST = @DOXYGEN_GENERATE_BUGLIST@ -GENERATE_DEPRECATEDLIST= @DOXYGEN_GENERATE_DEPRECATEDLIST@ -ENABLED_SECTIONS = @DOXYGEN_ENABLED_SECTIONS@ -MAX_INITIALIZER_LINES = @DOXYGEN_MAX_INITIALIZER_LINES@ -SHOW_USED_FILES = @DOXYGEN_SHOW_USED_FILES@ -SHOW_FILES = @DOXYGEN_SHOW_FILES@ -SHOW_NAMESPACES = @DOXYGEN_SHOW_NAMESPACES@ -FILE_VERSION_FILTER = @DOXYGEN_FILE_VERSION_FILTER@ -LAYOUT_FILE = @DOXYGEN_LAYOUT_FILE@ -CITE_BIB_FILES = @DOXYGEN_CITE_BIB_FILES@ -QUIET = @DOXYGEN_QUIET@ -WARNINGS = @DOXYGEN_WARNINGS@ -WARN_IF_UNDOCUMENTED = @DOXYGEN_WARN_IF_UNDOCUMENTED@ -WARN_IF_DOC_ERROR = @DOXYGEN_WARN_IF_DOC_ERROR@ -WARN_NO_PARAMDOC = @DOXYGEN_WARN_NO_PARAMDOC@ -WARN_AS_ERROR = @DOXYGEN_WARN_AS_ERROR@ -WARN_FORMAT = @DOXYGEN_WARN_FORMAT@ -WARN_LOGFILE = @DOXYGEN_WARN_LOGFILE@ -INPUT = @DOXYGEN_INPUT@ -INPUT_ENCODING = @DOXYGEN_INPUT_ENCODING@ -FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ -RECURSIVE = @DOXYGEN_RECURSIVE@ -EXCLUDE = @DOXYGEN_EXCLUDE@ -EXCLUDE_SYMLINKS = @DOXYGEN_EXCLUDE_SYMLINKS@ -EXCLUDE_PATTERNS = @DOXYGEN_EXCLUDE_PATTERNS@ -EXCLUDE_SYMBOLS = @DOXYGEN_EXCLUDE_SYMBOLS@ -EXAMPLE_PATH = @DOXYGEN_EXAMPLE_PATH@ -EXAMPLE_PATTERNS = @DOXYGEN_EXAMPLE_PATTERNS@ -EXAMPLE_RECURSIVE = @DOXYGEN_EXAMPLE_RECURSIVE@ -IMAGE_PATH = @DOXYGEN_IMAGE_PATH@ -INPUT_FILTER = @DOXYGEN_INPUT_FILTER@ -FILTER_PATTERNS = @DOXYGEN_FILTER_PATTERNS@ -FILTER_SOURCE_FILES = @DOXYGEN_FILTER_SOURCE_FILES@ -FILTER_SOURCE_PATTERNS = @DOXYGEN_FILTER_SOURCE_PATTERNS@ -USE_MDFILE_AS_MAINPAGE = @DOXYGEN_USE_MDFILE_AS_MAINPAGE@ -SOURCE_BROWSER = @DOXYGEN_SOURCE_BROWSER@ -INLINE_SOURCES = @DOXYGEN_INLINE_SOURCES@ -STRIP_CODE_COMMENTS = @DOXYGEN_STRIP_CODE_COMMENTS@ -REFERENCED_BY_RELATION = @DOXYGEN_REFERENCED_BY_RELATION@ -REFERENCES_RELATION = @DOXYGEN_REFERENCES_RELATION@ -REFERENCES_LINK_SOURCE = @DOXYGEN_REFERENCES_LINK_SOURCE@ -SOURCE_TOOLTIPS = @DOXYGEN_SOURCE_TOOLTIPS@ -USE_HTAGS = @DOXYGEN_USE_HTAGS@ -VERBATIM_HEADERS = @DOXYGEN_VERBATIM_HEADERS@ -CLANG_ASSISTED_PARSING = @DOXYGEN_CLANG_ASSISTED_PARSING@ -CLANG_OPTIONS = @DOXYGEN_CLANG_OPTIONS@ -CLANG_DATABASE_PATH = @DOXYGEN_CLANG_DATABASE_PATH@ -ALPHABETICAL_INDEX = @DOXYGEN_ALPHABETICAL_INDEX@ -COLS_IN_ALPHA_INDEX = @DOXYGEN_COLS_IN_ALPHA_INDEX@ -IGNORE_PREFIX = @DOXYGEN_IGNORE_PREFIX@ -GENERATE_HTML = @DOXYGEN_GENERATE_HTML@ -HTML_OUTPUT = @DOXYGEN_HTML_OUTPUT@ -HTML_FILE_EXTENSION = @DOXYGEN_HTML_FILE_EXTENSION@ -HTML_HEADER = @DOXYGEN_HTML_HEADER@ -HTML_FOOTER = @DOXYGEN_HTML_FOOTER@ -HTML_STYLESHEET = @DOXYGEN_HTML_STYLESHEET@ -HTML_EXTRA_STYLESHEET = @DOXYGEN_HTML_EXTRA_STYLESHEET@ -HTML_EXTRA_FILES = @DOXYGEN_HTML_EXTRA_FILES@ -HTML_COLORSTYLE_HUE = @DOXYGEN_HTML_COLORSTYLE_HUE@ -HTML_COLORSTYLE_SAT = @DOXYGEN_HTML_COLORSTYLE_SAT@ -HTML_COLORSTYLE_GAMMA = @DOXYGEN_HTML_COLORSTYLE_GAMMA@ -HTML_TIMESTAMP = @DOXYGEN_HTML_TIMESTAMP@ -HTML_DYNAMIC_MENUS = @DOXYGEN_HTML_DYNAMIC_MENUS@ -HTML_DYNAMIC_SECTIONS = @DOXYGEN_HTML_DYNAMIC_SECTIONS@ -HTML_INDEX_NUM_ENTRIES = @DOXYGEN_HTML_INDEX_NUM_ENTRIES@ -GENERATE_DOCSET = @DOXYGEN_GENERATE_DOCSET@ -DOCSET_FEEDNAME = @DOXYGEN_DOCSET_FEEDNAME@ -DOCSET_BUNDLE_ID = @DOXYGEN_DOCSET_BUNDLE_ID@ -DOCSET_PUBLISHER_ID = @DOXYGEN_DOCSET_PUBLISHER_ID@ -DOCSET_PUBLISHER_NAME = @DOXYGEN_DOCSET_PUBLISHER_NAME@ -GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@ -CHM_FILE = @DOXYGEN_CHM_FILE@ -HHC_LOCATION = @DOXYGEN_HHC_LOCATION@ -GENERATE_CHI = @DOXYGEN_GENERATE_CHI@ -CHM_INDEX_ENCODING = @DOXYGEN_CHM_INDEX_ENCODING@ -BINARY_TOC = @DOXYGEN_BINARY_TOC@ -TOC_EXPAND = @DOXYGEN_TOC_EXPAND@ -GENERATE_QHP = @DOXYGEN_GENERATE_QHP@ -QCH_FILE = @DOXYGEN_QCH_FILE@ -QHP_NAMESPACE = @DOXYGEN_QHP_NAMESPACE@ -QHP_VIRTUAL_FOLDER = @DOXYGEN_QHP_VIRTUAL_FOLDER@ -QHP_CUST_FILTER_NAME = @DOXYGEN_QHP_CUST_FILTER_NAME@ -QHP_CUST_FILTER_ATTRS = @DOXYGEN_QHP_CUST_FILTER_ATTRS@ -QHP_SECT_FILTER_ATTRS = @DOXYGEN_QHP_SECT_FILTER_ATTRS@ -QHG_LOCATION = @DOXYGEN_QHG_LOCATION@ -GENERATE_ECLIPSEHELP = @DOXYGEN_GENERATE_ECLIPSEHELP@ -ECLIPSE_DOC_ID = @DOXYGEN_ECLIPSE_DOC_ID@ -DISABLE_INDEX = @DOXYGEN_DISABLE_INDEX@ -GENERATE_TREEVIEW = @DOXYGEN_GENERATE_TREEVIEW@ -ENUM_VALUES_PER_LINE = @DOXYGEN_ENUM_VALUES_PER_LINE@ -TREEVIEW_WIDTH = @DOXYGEN_TREEVIEW_WIDTH@ -EXT_LINKS_IN_WINDOW = @DOXYGEN_EXT_LINKS_IN_WINDOW@ -FORMULA_FONTSIZE = @DOXYGEN_FORMULA_FONTSIZE@ -FORMULA_TRANSPARENT = @DOXYGEN_FORMULA_TRANSPARENT@ -USE_MATHJAX = @DOXYGEN_USE_MATHJAX@ -MATHJAX_FORMAT = @DOXYGEN_MATHJAX_FORMAT@ -MATHJAX_RELPATH = @DOXYGEN_MATHJAX_RELPATH@ -MATHJAX_EXTENSIONS = @DOXYGEN_MATHJAX_EXTENSIONS@ -MATHJAX_CODEFILE = @DOXYGEN_MATHJAX_CODEFILE@ -SEARCHENGINE = @DOXYGEN_SEARCHENGINE@ -SERVER_BASED_SEARCH = @DOXYGEN_SERVER_BASED_SEARCH@ -EXTERNAL_SEARCH = @DOXYGEN_EXTERNAL_SEARCH@ -SEARCHENGINE_URL = @DOXYGEN_SEARCHENGINE_URL@ -SEARCHDATA_FILE = @DOXYGEN_SEARCHDATA_FILE@ -EXTERNAL_SEARCH_ID = @DOXYGEN_EXTERNAL_SEARCH_ID@ -EXTRA_SEARCH_MAPPINGS = @DOXYGEN_EXTRA_SEARCH_MAPPINGS@ -GENERATE_LATEX = @DOXYGEN_GENERATE_LATEX@ -LATEX_OUTPUT = @DOXYGEN_LATEX_OUTPUT@ -LATEX_CMD_NAME = @DOXYGEN_LATEX_CMD_NAME@ -MAKEINDEX_CMD_NAME = @DOXYGEN_MAKEINDEX_CMD_NAME@ -LATEX_MAKEINDEX_CMD = @DOXYGEN_LATEX_MAKEINDEX_CMD@ -COMPACT_LATEX = @DOXYGEN_COMPACT_LATEX@ -PAPER_TYPE = @DOXYGEN_PAPER_TYPE@ -EXTRA_PACKAGES = @DOXYGEN_EXTRA_PACKAGES@ -LATEX_HEADER = @DOXYGEN_LATEX_HEADER@ -LATEX_FOOTER = @DOXYGEN_LATEX_FOOTER@ -LATEX_EXTRA_STYLESHEET = @DOXYGEN_LATEX_EXTRA_STYLESHEET@ -LATEX_EXTRA_FILES = @DOXYGEN_LATEX_EXTRA_FILES@ -PDF_HYPERLINKS = @DOXYGEN_PDF_HYPERLINKS@ -USE_PDFLATEX = @DOXYGEN_USE_PDFLATEX@ -LATEX_BATCHMODE = @DOXYGEN_LATEX_BATCHMODE@ -LATEX_HIDE_INDICES = @DOXYGEN_LATEX_HIDE_INDICES@ -LATEX_SOURCE_CODE = @DOXYGEN_LATEX_SOURCE_CODE@ -LATEX_BIB_STYLE = @DOXYGEN_LATEX_BIB_STYLE@ -LATEX_TIMESTAMP = @DOXYGEN_LATEX_TIMESTAMP@ -LATEX_EMOJI_DIRECTORY = @DOXYGEN_LATEX_EMOJI_DIRECTORY@ -GENERATE_RTF = @DOXYGEN_GENERATE_RTF@ -RTF_OUTPUT = @DOXYGEN_RTF_OUTPUT@ -COMPACT_RTF = @DOXYGEN_COMPACT_RTF@ -RTF_HYPERLINKS = @DOXYGEN_RTF_HYPERLINKS@ -RTF_STYLESHEET_FILE = @DOXYGEN_RTF_STYLESHEET_FILE@ -RTF_EXTENSIONS_FILE = @DOXYGEN_RTF_EXTENSIONS_FILE@ -RTF_SOURCE_CODE = @DOXYGEN_RTF_SOURCE_CODE@ -GENERATE_MAN = @DOXYGEN_GENERATE_MAN@ -MAN_OUTPUT = @DOXYGEN_MAN_OUTPUT@ -MAN_EXTENSION = @DOXYGEN_MAN_EXTENSION@ -MAN_SUBDIR = @DOXYGEN_MAN_SUBDIR@ -MAN_LINKS = @DOXYGEN_MAN_LINKS@ -GENERATE_XML = @DOXYGEN_GENERATE_XML@ -XML_OUTPUT = @DOXYGEN_XML_OUTPUT@ -XML_PROGRAMLISTING = @DOXYGEN_XML_PROGRAMLISTING@ -XML_NS_MEMB_FILE_SCOPE = @DOXYGEN_XML_NS_MEMB_FILE_SCOPE@ -GENERATE_DOCBOOK = @DOXYGEN_GENERATE_DOCBOOK@ -DOCBOOK_OUTPUT = @DOXYGEN_DOCBOOK_OUTPUT@ -DOCBOOK_PROGRAMLISTING = @DOXYGEN_DOCBOOK_PROGRAMLISTING@ -GENERATE_AUTOGEN_DEF = @DOXYGEN_GENERATE_AUTOGEN_DEF@ -GENERATE_PERLMOD = @DOXYGEN_GENERATE_PERLMOD@ -PERLMOD_LATEX = @DOXYGEN_PERLMOD_LATEX@ -PERLMOD_PRETTY = @DOXYGEN_PERLMOD_PRETTY@ -PERLMOD_MAKEVAR_PREFIX = @DOXYGEN_PERLMOD_MAKEVAR_PREFIX@ -ENABLE_PREPROCESSING = @DOXYGEN_ENABLE_PREPROCESSING@ -MACRO_EXPANSION = @DOXYGEN_MACRO_EXPANSION@ -EXPAND_ONLY_PREDEF = @DOXYGEN_EXPAND_ONLY_PREDEF@ -SEARCH_INCLUDES = @DOXYGEN_SEARCH_INCLUDES@ -INCLUDE_PATH = @DOXYGEN_INCLUDE_PATH@ -INCLUDE_FILE_PATTERNS = @DOXYGEN_INCLUDE_FILE_PATTERNS@ -PREDEFINED = @DOXYGEN_PREDEFINED@ -EXPAND_AS_DEFINED = @DOXYGEN_EXPAND_AS_DEFINED@ -SKIP_FUNCTION_MACROS = @DOXYGEN_SKIP_FUNCTION_MACROS@ -TAGFILES = @DOXYGEN_TAGFILES@ -GENERATE_TAGFILE = @DOXYGEN_GENERATE_TAGFILE@ -ALLEXTERNALS = @DOXYGEN_ALLEXTERNALS@ -EXTERNAL_GROUPS = @DOXYGEN_EXTERNAL_GROUPS@ -EXTERNAL_PAGES = @DOXYGEN_EXTERNAL_PAGES@ -CLASS_DIAGRAMS = @DOXYGEN_CLASS_DIAGRAMS@ -DIA_PATH = @DOXYGEN_DIA_PATH@ -HIDE_UNDOC_RELATIONS = @DOXYGEN_HIDE_UNDOC_RELATIONS@ -HAVE_DOT = @DOXYGEN_HAVE_DOT@ -DOT_NUM_THREADS = @DOXYGEN_DOT_NUM_THREADS@ -DOT_FONTNAME = @DOXYGEN_DOT_FONTNAME@ -DOT_FONTSIZE = @DOXYGEN_DOT_FONTSIZE@ -DOT_FONTPATH = @DOXYGEN_DOT_FONTPATH@ -CLASS_GRAPH = @DOXYGEN_CLASS_GRAPH@ -COLLABORATION_GRAPH = @DOXYGEN_COLLABORATION_GRAPH@ -GROUP_GRAPHS = @DOXYGEN_GROUP_GRAPHS@ -UML_LOOK = @DOXYGEN_UML_LOOK@ -UML_LIMIT_NUM_FIELDS = @DOXYGEN_UML_LIMIT_NUM_FIELDS@ -TEMPLATE_RELATIONS = @DOXYGEN_TEMPLATE_RELATIONS@ -INCLUDE_GRAPH = @DOXYGEN_INCLUDE_GRAPH@ -INCLUDED_BY_GRAPH = @DOXYGEN_INCLUDED_BY_GRAPH@ -CALL_GRAPH = @DOXYGEN_CALL_GRAPH@ -CALLER_GRAPH = @DOXYGEN_CALLER_GRAPH@ -GRAPHICAL_HIERARCHY = @DOXYGEN_GRAPHICAL_HIERARCHY@ -DIRECTORY_GRAPH = @DOXYGEN_DIRECTORY_GRAPH@ -DOT_IMAGE_FORMAT = @DOXYGEN_DOT_IMAGE_FORMAT@ -INTERACTIVE_SVG = @DOXYGEN_INTERACTIVE_SVG@ -DOT_PATH = @DOXYGEN_DOT_PATH@ -DOTFILE_DIRS = @DOXYGEN_DOTFILE_DIRS@ -MSCFILE_DIRS = @DOXYGEN_MSCFILE_DIRS@ -DIAFILE_DIRS = @DOXYGEN_DIAFILE_DIRS@ -PLANTUML_JAR_PATH = @DOXYGEN_PLANTUML_JAR_PATH@ -PLANTUML_CFG_FILE = @DOXYGEN_PLANTUML_CFG_FILE@ -PLANTUML_INCLUDE_PATH = @DOXYGEN_PLANTUML_INCLUDE_PATH@ -DOT_GRAPH_MAX_NODES = @DOXYGEN_DOT_GRAPH_MAX_NODES@ -MAX_DOT_GRAPH_DEPTH = @DOXYGEN_MAX_DOT_GRAPH_DEPTH@ -DOT_TRANSPARENT = @DOXYGEN_DOT_TRANSPARENT@ -DOT_MULTI_TARGETS = @DOXYGEN_DOT_MULTI_TARGETS@ -GENERATE_LEGEND = @DOXYGEN_GENERATE_LEGEND@ -DOT_CLEANUP = @DOXYGEN_DOT_CLEANUP@ diff --git a/Doxyfile b/Doxyfile index 18bb33e2..75931ef9 100644 --- a/Doxyfile +++ b/Doxyfile @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "Peerplays" +PROJECT_NAME = "Graphene" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version diff --git a/libraries/app/CMakeLists.txt b/libraries/app/CMakeLists.txt index ea0a2c07..e6f8940c 100644 --- a/libraries/app/CMakeLists.txt +++ b/libraries/app/CMakeLists.txt @@ -5,6 +5,7 @@ add_library( graphene_app api.cpp application.cpp database_api.cpp + impacted.cpp plugin.cpp config_util.cpp ${HEADERS} @@ -13,8 +14,7 @@ add_library( graphene_app # need to link graphene_debug_witness because plugins aren't sufficiently isolated #246 #target_link_libraries( graphene_app graphene_market_history graphene_account_history graphene_chain fc graphene_db graphene_net graphene_utilities graphene_debug_witness ) -target_link_libraries( graphene_app graphene_market_history graphene_account_history graphene_accounts_list graphene_affiliate_stats graphene_chain fc graphene_db graphene_net graphene_time graphene_utilities graphene_debug_witness graphene_bookie peerplays_sidechain graphene_elasticsearch) - +target_link_libraries( graphene_app graphene_market_history graphene_account_history graphene_accounts_list graphene_affiliate_stats graphene_chain fc graphene_db graphene_net graphene_time graphene_utilities graphene_debug_witness graphene_bookie peerplays_sidechain ) target_include_directories( graphene_app PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_SOURCE_DIR}/../egenesis/include" ) diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index 11d39f69..d31abe19 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -39,19 +40,8 @@ #include #include -#include #include -template class fc::api; -template class fc::api; -template class fc::api; -template class fc::api; -template class fc::api; -template class fc::api; -template class fc::api; -template class fc::api; - - namespace graphene { namespace app { login_api::login_api(application& a) @@ -113,7 +103,7 @@ namespace graphene { namespace app { } else if( api_name == "asset_api" ) { - _asset_api = std::make_shared< asset_api >( _app ); + _asset_api = std::make_shared< asset_api >( std::ref( *_app.chain_database() ) ); } else if( api_name == "debug_api" ) { @@ -546,12 +536,10 @@ namespace graphene { namespace app { } // end get_relevant_accounts( obj ) #endif - vector history_api::get_fill_order_history( std::string asset_a, std::string asset_b, uint32_t limit )const + vector history_api::get_fill_order_history( asset_id_type a, asset_id_type b, uint32_t limit )const { FC_ASSERT(_app.chain_database()); const auto& db = *_app.chain_database(); - asset_id_type a = database_api.get_asset_id_from_string( asset_a ); - asset_id_type b = database_api.get_asset_id_from_string( asset_b ); if( a > b ) std::swap(a,b); const auto& history_idx = db.get_index_type().indices().get(); history_key hkey; @@ -573,7 +561,7 @@ namespace graphene { namespace app { return result; } - vector history_api::get_account_history( const std::string account_id_or_name, + vector history_api::get_account_history( account_id_type account, operation_history_id_type stop, unsigned limit, operation_history_id_type start ) const @@ -582,26 +570,12 @@ namespace graphene { namespace app { const auto& db = *_app.chain_database(); FC_ASSERT( limit <= 100 ); vector result; - account_id_type account; try { - account = database_api.get_account_id_from_string(account_id_or_name); const account_transaction_history_object& node = account(db).statistics(db).most_recent_op(db); if(start == operation_history_id_type() || start.instance.value > node.operation_id.instance.value) start = node.operation_id; } catch(...) { return result; } - if(_app.is_plugin_enabled("elasticsearch")) { - auto es = _app.get_plugin("elasticsearch"); - if(es.get()->get_running_mode() != elasticsearch::mode::only_save) { - if(!_app.elasticsearch_thread) - _app.elasticsearch_thread= std::make_shared("elasticsearch"); - - return _app.elasticsearch_thread->async([&es, &account, &stop, &limit, &start]() { - return es->get_account_history(account, stop, limit, start); - }, "thread invoke for method " BOOST_PP_STRINGIZE(method_name)).wait(); - } - } - const auto& hist_idx = db.get_index_type(); const auto& by_op_idx = hist_idx.indices().get(); auto index_start = by_op_idx.begin(); @@ -620,7 +594,7 @@ namespace graphene { namespace app { return result; } - vector history_api::get_account_history_operations( const std::string account_id_or_name, + vector history_api::get_account_history_operations( account_id_type account, int operation_id, operation_history_id_type start, operation_history_id_type stop, @@ -630,11 +604,6 @@ namespace graphene { namespace app { const auto& db = *_app.chain_database(); FC_ASSERT( limit <= 100 ); vector result; - account_id_type account; - try { - account = database_api.get_account_id_from_string(account_id_or_name); - } catch (...) { return result; } - const auto& stats = account(db).statistics(db); if( stats.most_recent_op == account_transaction_history_id_type() ) return result; const account_transaction_history_object* node = &stats.most_recent_op(db); @@ -661,7 +630,7 @@ namespace graphene { namespace app { } - vector history_api::get_relative_account_history( const std::string account_id_or_name, + vector history_api::get_relative_account_history( account_id_type account, uint32_t stop, unsigned limit, uint32_t start) const @@ -670,10 +639,6 @@ namespace graphene { namespace app { const auto& db = *_app.chain_database(); FC_ASSERT(limit <= 100); vector result; - account_id_type account; - try { - account = database_api.get_account_id_from_string(account_id_or_name); - } catch(...) { return result; } const auto& stats = account(db).statistics(db); if( start == 0 ) start = stats.total_ops; @@ -713,13 +678,11 @@ namespace graphene { namespace app { return hist->tracked_buckets(); } - vector history_api::get_market_history( std::string asset_a, std::string asset_b, + vector history_api::get_market_history( asset_id_type a, asset_id_type b, uint32_t bucket_seconds, fc::time_point_sec start, fc::time_point_sec end )const { try { FC_ASSERT(_app.chain_database()); const auto& db = *_app.chain_database(); - asset_id_type a = database_api.get_asset_id_from_string( asset_a ); - asset_id_type b = database_api.get_asset_id_from_string( asset_b ); vector result; result.reserve(200); @@ -739,7 +702,7 @@ namespace graphene { namespace app { ++itr; } return result; - } FC_CAPTURE_AND_RETHROW( (asset_a)(asset_b)(bucket_seconds)(start)(end) ) } + } FC_CAPTURE_AND_RETHROW( (a)(b)(bucket_seconds)(start)(end) ) } crypto_api::crypto_api(){}; @@ -798,16 +761,12 @@ namespace graphene { namespace app { } // asset_api - asset_api::asset_api(graphene::app::application& app) : - _app(app), - _db( *app.chain_database()), - database_api( std::ref(*app.chain_database())) { } + asset_api::asset_api(graphene::chain::database& db) : _db(db) { } asset_api::~asset_api() { } - vector asset_api::get_asset_holders( std::string asset, uint32_t start, uint32_t limit ) const { + vector asset_api::get_asset_holders( asset_id_type asset_id, uint32_t start, uint32_t limit ) const { FC_ASSERT(limit <= 100); - asset_id_type asset_id = database_api.get_asset_id_from_string( asset ); const auto& bal_idx = _db.get_index_type< account_balance_index >().indices().get< by_asset_balance >(); auto range = bal_idx.equal_range( boost::make_tuple( asset_id ) ); @@ -838,11 +797,11 @@ namespace graphene { namespace app { return result; } // get number of asset holders. - int asset_api::get_asset_holders_count( std::string asset ) const { + int asset_api::get_asset_holders_count( asset_id_type asset_id ) const { const auto& bal_idx = _db.get_index_type< account_balance_index >().indices().get< by_asset_balance >(); - asset_id_type asset_id = database_api.get_asset_id_from_string( asset ); auto range = bal_idx.equal_range( boost::make_tuple( asset_id ) ); + int count = boost::distance(range) - 1; return count; diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index adfd8402..0f0c0690 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -226,7 +226,7 @@ namespace detail { void new_connection( const fc::http::websocket_connection_ptr& c ) { - auto wsc = std::make_shared(*c, GRAPHENE_MAX_NESTED_OBJECTS); + auto wsc = std::make_shared(c, GRAPHENE_MAX_NESTED_OBJECTS); auto login = std::make_shared( std::ref(*_self) ); login->enable_api("database_api"); @@ -375,11 +375,6 @@ namespace detail { } _chain_db->add_checkpoints( loaded_checkpoints ); - if( _options->count("enable-standby-votes-tracking") ) - { - _chain_db->enable_standby_votes_tracking( _options->at("enable-standby-votes-tracking").as() ); - } - bool replay = false; std::string replay_reason = "reason not provided"; @@ -931,10 +926,6 @@ void application::set_program_options(boost::program_options::options_descriptio ("genesis-json", bpo::value(), "File to read Genesis State from") ("dbg-init-key", bpo::value(), "Block signing key to use for init witnesses, overrides genesis file") ("api-access", bpo::value(), "JSON file specifying API permissions") - ("enable-standby-votes-tracking", bpo::value()->implicit_value(true), - "Whether to enable tracking of votes of standby witnesses and committee members. " - "Set it to true to provide accurate data to API clients, set to false for slightly better performance.") - ("plugins", bpo::value(), "Space-separated list of plugins to activate") ; command_line_options.add(configuration_file_options); command_line_options.add_options() @@ -991,20 +982,9 @@ void application::initialize(const fc::path& data_dir, const boost::program_opti wanted.push_back("witness"); wanted.push_back("account_history"); wanted.push_back("market_history"); - wanted.push_back("bookie"); } - int es_ah_conflict_counter = 0; for (auto& it : wanted) { - if(it == "account_history") - ++es_ah_conflict_counter; - if(it == "elasticsearch") - ++es_ah_conflict_counter; - - if(es_ah_conflict_counter > 1) { - elog("Can't start program with elasticsearch and account_history plugin at the same time"); - std::exit(EXIT_FAILURE); - } if (!it.empty()) enable_plugin(it); } } @@ -1029,7 +1009,9 @@ std::shared_ptr application::get_plugin(const string& name) con bool application::is_plugin_enabled(const string& name) const { - return !(my->_active_plugins.find(name) == my->_active_plugins.end()); + if(my->_active_plugins.find(name) == my->_active_plugins.end()) + return false; + return true; } net::node_ptr application::p2p_node() @@ -1069,8 +1051,7 @@ void graphene::app::application::enable_plugin(const string& name) my->_active_plugins[name]->plugin_set_app(this); } -void graphene::app::application::add_available_plugin(std::shared_ptr p) -{ +void graphene::app::application::add_available_plugin(std::shared_ptr p) { my->_available_plugins[p->plugin_name()] = p; } diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index c9aba7ff..c6c8a952 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -26,15 +26,11 @@ #include #include #include -#include -#include #include #include #include -#include -#include #include #include @@ -49,8 +45,6 @@ typedef std::map< std::pair, std::vector > market_queue_type; -template class fc::api; - namespace graphene { namespace app { class database_api_impl : public std::enable_shared_from_this @@ -87,26 +81,23 @@ class database_api_impl : public std::enable_shared_from_this bool is_public_key_registered(string public_key) const; // Accounts - account_id_type get_account_id_from_string(const std::string& name_or_id)const; - vector> get_accounts(const vector& account_names_or_ids)const; + vector> get_accounts(const vector& account_ids)const; std::map get_full_accounts( const vector& names_or_ids, bool subscribe ); optional get_account_by_name( string name )const; - vector get_account_references( const std::string account_id_or_name )const; + vector get_account_references( account_id_type account_id )const; vector> lookup_account_names(const vector& account_names)const; map lookup_accounts(const string& lower_bound_name, uint32_t limit)const; uint64_t get_account_count()const; // Balances - vector get_account_balances(const std::string& account_name_or_id, const flat_set& assets)const; + vector get_account_balances(account_id_type id, const flat_set& assets)const; + vector get_named_account_balances(const std::string& name, const flat_set& assets)const; vector get_balance_objects( const vector
& addrs )const; vector get_vested_balances( const vector& objs )const; - vector get_vesting_balances( const std::string account_id_or_name )const; + vector get_vesting_balances( account_id_type account_id )const; // Assets - asset_id_type get_asset_id_from_string(const std::string& symbol_or_id)const; - vector> get_assets(const vector& asset_symbols_or_ids)const; - // helper function - vector> get_assets( const vector& asset_ids )const; + vector> get_assets(const vector& asset_ids)const; vector list_assets(const string& lower_bound_symbol, uint32_t limit)const; vector> lookup_asset_symbols(const vector& symbols_or_ids)const; uint64_t get_asset_count()const; @@ -133,13 +124,12 @@ class database_api_impl : public std::enable_shared_from_this asset get_sweeps_vesting_balance_available_for_claim( account_id_type account )const; // Markets / feeds - vector get_limit_orders( const asset_id_type a, const asset_id_type b, const uint32_t limit )const; - vector get_limit_orders( const std::string& a, const std::string& b, const uint32_t limit)const; - vector get_call_orders(const std::string& a, uint32_t limit)const; - vector get_settle_orders(const std::string& a, uint32_t limit)const; - vector get_margin_positions( const std::string account_id_or_name )const; - void subscribe_to_market(std::function callback, const std::string& a, const std::string& b); - void unsubscribe_from_market(const std::string& a, const std::string& b); + vector get_limit_orders(asset_id_type a, asset_id_type b, uint32_t limit)const; + vector get_call_orders(asset_id_type a, uint32_t limit)const; + vector get_settle_orders(asset_id_type a, uint32_t limit)const; + vector get_margin_positions( const account_id_type& id )const; + void subscribe_to_market(std::function callback, asset_id_type a, asset_id_type b); + void unsubscribe_from_market(asset_id_type a, asset_id_type b); market_ticker get_ticker( const string& base, const string& quote )const; market_volume get_24_volume( const string& base, const string& quote )const; order_book get_order_book( const string& base, const string& quote, unsigned limit = 50 )const; @@ -147,13 +137,13 @@ class database_api_impl : public std::enable_shared_from_this // Witnesses vector> get_witnesses(const vector& witness_ids)const; - fc::optional get_witness_by_account(const std::string account_id_or_name)const; + fc::optional get_witness_by_account(account_id_type account)const; map lookup_witness_accounts(const string& lower_bound_name, uint32_t limit)const; uint64_t get_witness_count()const; // Committee members vector> get_committee_members(const vector& committee_member_ids)const; - fc::optional get_committee_member_by_account(const std::string account_id_or_name)const; + fc::optional get_committee_member_by_account(account_id_type account)const; map lookup_committee_member_accounts(const string& lower_bound_name, uint32_t limit)const; // SON members @@ -185,10 +175,10 @@ class database_api_impl : public std::enable_shared_from_this bool verify_authority( const signed_transaction& trx )const; bool verify_account_authority( const string& name_or_id, const flat_set& signers )const; processed_transaction validate_transaction( const signed_transaction& trx )const; - vector< fc::variant > get_required_fees( const vector& ops, const std::string& asset_id_or_symbol )const; + vector< fc::variant > get_required_fees( const vector& ops, asset_id_type id )const; // Proposed transactions - vector get_proposed_transactions( const std::string account_id_or_name )const; + vector get_proposed_transactions( account_id_type id )const; // Blinded balances vector get_blinded_balances( const flat_set& commitments )const; @@ -199,14 +189,8 @@ class database_api_impl : public std::enable_shared_from_this vector get_tournaments_by_state(tournament_id_type stop, unsigned limit, tournament_id_type start, tournament_state state); vector get_registered_tournaments(account_id_type account_filter, uint32_t limit) const; - // gpos - gpos_info get_gpos_info(const account_id_type account) const; //private: - const account_object* get_account_from_string( const std::string& name_or_id, - bool throw_if_not_found = true ) const; - const asset_object* get_asset_from_string( const std::string& symbol_or_id, - bool throw_if_not_found = true ) const; template void subscribe_to_item( const T& i )const { @@ -646,27 +630,22 @@ bool database_api_impl::is_public_key_registered(string public_key) const // // ////////////////////////////////////////////////////////////////////// -account_id_type database_api::get_account_id_from_string(const std::string& name_or_id)const +vector> database_api::get_accounts(const vector& account_ids)const { - return my->get_account_from_string( name_or_id )->id; + return my->get_accounts( account_ids ); } -vector> database_api::get_accounts(const vector& account_names_or_ids)const +vector> database_api_impl::get_accounts(const vector& account_ids)const { - return my->get_accounts( account_names_or_ids ); -} - -vector> database_api_impl::get_accounts(const vector& account_names_or_ids)const -{ - vector> result; result.reserve(account_names_or_ids.size()); - std::transform(account_names_or_ids.begin(), account_names_or_ids.end(), std::back_inserter(result), - [this](std::string id_or_name) -> optional { - const account_object *account = get_account_from_string(id_or_name, false); - if(account == nullptr) - return {}; - - subscribe_to_item( account->id ); - return *account; + vector> result; result.reserve(account_ids.size()); + std::transform(account_ids.begin(), account_ids.end(), std::back_inserter(result), + [this](account_id_type id) -> optional { + if(auto o = _db.find(id)) + { + subscribe_to_item( id ); + return *o; + } + return {}; }); return result; } @@ -795,17 +774,16 @@ optional database_api_impl::get_account_by_name( string name )co return optional(); } -vector database_api::get_account_references( const std::string account_id_or_name )const +vector database_api::get_account_references( account_id_type account_id )const { - return my->get_account_references( account_id_or_name ); + return my->get_account_references( account_id ); } -vector database_api_impl::get_account_references( const std::string account_id_or_name )const +vector database_api_impl::get_account_references( account_id_type account_id )const { const auto& idx = _db.get_index_type(); const auto& aidx = dynamic_cast(idx); const auto& refs = aidx.get_secondary_index(); - const account_id_type account_id = get_account_from_string(account_id_or_name)->id; auto itr = refs.account_to_account_memberships.find(account_id); vector result; @@ -874,16 +852,13 @@ uint64_t database_api_impl::get_account_count()const // // ////////////////////////////////////////////////////////////////////// -vector database_api::get_account_balances(const std::string& account_name_or_id, const flat_set& assets)const +vector database_api::get_account_balances(account_id_type id, const flat_set& assets)const { - return my->get_account_balances( account_name_or_id, assets ); + return my->get_account_balances( id, assets ); } -vector database_api_impl::get_account_balances( const std::string& account_name_or_id, - const flat_set& assets)const +vector database_api_impl::get_account_balances(account_id_type acnt, const flat_set& assets)const { - const account_object* account = get_account_from_string(account_name_or_id); - account_id_type acnt = account->id; vector result; if (assets.empty()) { @@ -906,7 +881,15 @@ vector database_api_impl::get_account_balances( const std::string& accoun vector database_api::get_named_account_balances(const std::string& name, const flat_set& assets)const { - return my->get_account_balances( name, assets ); + return my->get_named_account_balances( name, assets ); +} + +vector database_api_impl::get_named_account_balances(const std::string& name, const flat_set& assets) const +{ + const auto& accounts_by_name = _db.get_index_type().indices().get(); + auto itr = accounts_by_name.find(name); + FC_ASSERT( itr != accounts_by_name.end() ); + return get_account_balances(itr->get_id(), assets); } vector database_api::get_balance_objects( const vector
& addrs )const @@ -956,26 +939,24 @@ vector database_api_impl::get_vested_balances( const vector database_api::get_vesting_balances( const std::string account_id_or_name )const +vector database_api::get_vesting_balances( account_id_type account_id )const { - return my->get_vesting_balances( account_id_or_name ); + return my->get_vesting_balances( account_id ); } -vector database_api_impl::get_vesting_balances( const std::string account_id_or_name )const +vector database_api_impl::get_vesting_balances( account_id_type account_id )const { try { - const account_id_type account_id = get_account_from_string(account_id_or_name)->id; vector result; auto vesting_range = _db.get_index_type().indices().get().equal_range(account_id); std::for_each(vesting_range.first, vesting_range.second, [&result](const vesting_balance_object& balance) { - if(balance.balance.amount > 0) - result.emplace_back(balance); + result.emplace_back(balance); }); return result; } - FC_CAPTURE_AND_RETHROW( (account_id_or_name) ); + FC_CAPTURE_AND_RETHROW( (account_id) ); } ////////////////////////////////////////////////////////////////////// @@ -984,48 +965,9 @@ vector database_api_impl::get_vesting_balances( const st // // ////////////////////////////////////////////////////////////////////// -asset_id_type database_api::get_asset_id_from_string(const std::string& symbol_or_id)const +vector> database_api::get_assets(const vector& asset_ids)const { - return my->get_asset_from_string( symbol_or_id )->id; -} - -const asset_object* database_api_impl::get_asset_from_string( const std::string& symbol_or_id, - bool throw_if_not_found ) const -{ - // TODO cache the result to avoid repeatly fetching from db - FC_ASSERT( symbol_or_id.size() > 0); - const asset_object* asset = nullptr; - if (std::isdigit(symbol_or_id[0])) - asset = _db.find(fc::variant(symbol_or_id, 1).as(1)); - else - { - const auto& idx = _db.get_index_type().indices().get(); - auto itr = idx.find(symbol_or_id); - if (itr != idx.end()) - asset = &*itr; - } - if(throw_if_not_found) - FC_ASSERT( asset, "no such asset" ); - return asset; -} - -vector> database_api::get_assets(const vector& asset_symbols_or_ids)const -{ - return my->get_assets( asset_symbols_or_ids ); -} - -vector> database_api_impl::get_assets(const vector& asset_symbols_or_ids)const -{ - vector> result; result.reserve(asset_symbols_or_ids.size()); - std::transform(asset_symbols_or_ids.begin(), asset_symbols_or_ids.end(), std::back_inserter(result), - [this](std::string id_or_name) -> optional { - const asset_object* asset_obj = get_asset_from_string( id_or_name, false ); - if( asset_obj == nullptr ) - return {}; - subscribe_to_item(asset_obj->id ); - return asset_object( *asset_obj ); - }); - return result; + return my->get_assets( asset_ids ); } vector> database_api_impl::get_assets(const vector& asset_ids)const @@ -1281,7 +1223,7 @@ vector database_api_impl::get_all_unmatched_bets_for_bettor(account_ // // ////////////////////////////////////////////////////////////////////// -vector database_api::get_limit_orders(const std::string& a, const std::string& b, const uint32_t limit)const +vector database_api::get_limit_orders(asset_id_type a, asset_id_type b, uint32_t limit)const { return my->get_limit_orders( a, b, limit ); } @@ -1289,22 +1231,12 @@ vector database_api::get_limit_orders(const std::string& a, /** * @return the limit orders for both sides of the book for the two assets specified up to limit number on each side. */ -vector database_api_impl::get_limit_orders(const std::string& a, const std::string& b, const uint32_t limit)const -{ - const asset_id_type asset_a_id = get_asset_from_string(a)->id; - const asset_id_type asset_b_id = get_asset_from_string(b)->id; - - return get_limit_orders(asset_a_id, asset_b_id, limit); -} - -vector database_api_impl::get_limit_orders( const asset_id_type a, const asset_id_type b, - const uint32_t limit )const +vector database_api_impl::get_limit_orders(asset_id_type a, asset_id_type b, uint32_t limit)const { const auto& limit_order_idx = _db.get_index_type(); const auto& limit_price_idx = limit_order_idx.indices().get(); vector result; - result.reserve(limit*2); uint32_t count = 0; auto limit_itr = limit_price_idx.lower_bound(price::max(a,b)); @@ -1328,46 +1260,45 @@ vector database_api_impl::get_limit_orders( const asset_id_t return result; } -vector database_api::get_call_orders(const std::string& a, uint32_t limit)const +vector database_api::get_call_orders(asset_id_type a, uint32_t limit)const { return my->get_call_orders( a, limit ); } -vector database_api_impl::get_call_orders(const std::string& a, uint32_t limit)const +vector database_api_impl::get_call_orders(asset_id_type a, uint32_t limit)const { const auto& call_index = _db.get_index_type().indices().get(); - const asset_object* mia = get_asset_from_string(a); - price index_price = price::min(mia->bitasset_data(_db).options.short_backing_asset, mia->get_id()); + const asset_object& mia = _db.get(a); + price index_price = price::min(mia.bitasset_data(_db).options.short_backing_asset, mia.get_id()); return vector(call_index.lower_bound(index_price.min()), call_index.lower_bound(index_price.max())); } -vector database_api::get_settle_orders(const std::string& a, uint32_t limit)const +vector database_api::get_settle_orders(asset_id_type a, uint32_t limit)const { return my->get_settle_orders( a, limit ); } -vector database_api_impl::get_settle_orders(const std::string& a, uint32_t limit)const +vector database_api_impl::get_settle_orders(asset_id_type a, uint32_t limit)const { const auto& settle_index = _db.get_index_type().indices().get(); - const asset_object* mia = get_asset_from_string(a); - return vector(settle_index.lower_bound(mia->get_id()), - settle_index.upper_bound(mia->get_id())); + const asset_object& mia = _db.get(a); + return vector(settle_index.lower_bound(mia.get_id()), + settle_index.upper_bound(mia.get_id())); } -vector database_api::get_margin_positions( const std::string account_id_or_name )const +vector database_api::get_margin_positions( const account_id_type& id )const { - return my->get_margin_positions( account_id_or_name ); + return my->get_margin_positions( id ); } -vector database_api_impl::get_margin_positions( const std::string account_id_or_name )const +vector database_api_impl::get_margin_positions( const account_id_type& id )const { try { const auto& idx = _db.get_index_type(); const auto& aidx = idx.indices().get(); - const account_id_type id = get_account_from_string(account_id_or_name)->id; auto start = aidx.lower_bound( boost::make_tuple( id, asset_id_type(0) ) ); auto end = aidx.lower_bound( boost::make_tuple( id+1, asset_id_type(0) ) ); vector result; @@ -1377,37 +1308,31 @@ vector database_api_impl::get_margin_positions( const std::st ++start; } return result; - } FC_CAPTURE_AND_RETHROW( (account_id_or_name) ) + } FC_CAPTURE_AND_RETHROW( (id) ) } -void database_api::subscribe_to_market(std::function callback, const std::string& a, const std::string& b) +void database_api::subscribe_to_market(std::function callback, asset_id_type a, asset_id_type b) { my->subscribe_to_market( callback, a, b ); } -void database_api_impl::subscribe_to_market(std::function callback, const std::string& a, const std::string& b) +void database_api_impl::subscribe_to_market(std::function callback, asset_id_type a, asset_id_type b) { - auto asset_a_id = get_asset_from_string(a)->id; - auto asset_b_id = get_asset_from_string(b)->id; - - if(asset_a_id > asset_b_id) std::swap(asset_a_id,asset_b_id); - FC_ASSERT(asset_a_id != asset_b_id); - _market_subscriptions[ std::make_pair(asset_a_id,asset_b_id) ] = callback; + if(a > b) std::swap(a,b); + FC_ASSERT(a != b); + _market_subscriptions[ std::make_pair(a,b) ] = callback; } -void database_api::unsubscribe_from_market(const std::string& a, const std::string& b) +void database_api::unsubscribe_from_market(asset_id_type a, asset_id_type b) { my->unsubscribe_from_market( a, b ); } -void database_api_impl::unsubscribe_from_market(const std::string& a, const std::string& b) +void database_api_impl::unsubscribe_from_market(asset_id_type a, asset_id_type b) { - auto asset_a_id = get_asset_from_string(a)->id; - auto asset_b_id = get_asset_from_string(b)->id; - - if(asset_a_id > asset_b_id) std::swap(asset_a_id,asset_b_id); - FC_ASSERT(asset_a_id != asset_b_id); - _market_subscriptions.erase(std::make_pair(asset_a_id,asset_b_id)); + if(a > b) std::swap(a,b); + FC_ASSERT(a != b); + _market_subscriptions.erase(std::make_pair(a,b)); } market_ticker database_api::get_ticker( const string& base, const string& quote )const @@ -1630,10 +1555,9 @@ vector> database_api::get_witnesses(const vectorget_witnesses( witness_ids ); } -vector database_api::get_workers_by_account(const std::string account_id_or_name)const +vector database_api::get_workers_by_account(account_id_type account)const { const auto& idx = my->_db.get_index_type().indices().get(); - const account_id_type account = my->get_account_from_string(account_id_or_name)->id; auto itr = idx.find(account); vector result; @@ -1659,15 +1583,14 @@ vector> database_api_impl::get_witnesses(const vector database_api::get_witness_by_account(const std::string account_id_or_name)const +fc::optional database_api::get_witness_by_account(account_id_type account)const { - return my->get_witness_by_account( account_id_or_name ); + return my->get_witness_by_account( account ); } -fc::optional database_api_impl::get_witness_by_account(const std::string account_id_or_name) const +fc::optional database_api_impl::get_witness_by_account(account_id_type account) const { const auto& idx = _db.get_index_type().indices().get(); - const account_id_type account = get_account_from_string(account_id_or_name)->id; auto itr = idx.find(account); if( itr != idx.end() ) return *itr; @@ -1735,15 +1658,14 @@ vector> database_api_impl::get_committee_membe return result; } -fc::optional database_api::get_committee_member_by_account(const std::string account_id_or_name)const +fc::optional database_api::get_committee_member_by_account(account_id_type account)const { - return my->get_committee_member_by_account( account_id_or_name ); + return my->get_committee_member_by_account( account ); } -fc::optional database_api_impl::get_committee_member_by_account(const std::string account_id_or_name) const +fc::optional database_api_impl::get_committee_member_by_account(account_id_type account) const { const auto& idx = _db.get_index_type().indices().get(); - const account_id_type account = get_account_from_string(account_id_or_name)->id; auto itr = idx.find(account); if( itr != idx.end() ) return *itr; @@ -2212,9 +2134,9 @@ processed_transaction database_api_impl::validate_transaction( const signed_tran return _db.validate_transaction(trx); } -vector< fc::variant > database_api::get_required_fees( const vector& ops, const std::string& asset_id_or_symbol )const +vector< fc::variant > database_api::get_required_fees( const vector& ops, asset_id_type id )const { - return my->get_required_fees( ops, asset_id_or_symbol ); + return my->get_required_fees( ops, id ); } /** @@ -2273,7 +2195,7 @@ struct get_required_fees_helper uint32_t current_recursion = 0; }; -vector< fc::variant > database_api_impl::get_required_fees( const vector& ops, const std::string& asset_id_or_symbol )const +vector< fc::variant > database_api_impl::get_required_fees( const vector& ops, asset_id_type id )const { vector< operation > _ops = ops; // @@ -2283,7 +2205,7 @@ vector< fc::variant > database_api_impl::get_required_fees( const vector result; result.reserve(ops.size()); - const asset_object& a = *get_asset_from_string(asset_id_or_symbol); + const asset_object& a = id(_db); get_required_fees_helper helper( _db.current_fee_schedule(), a.options.core_exchange_rate, @@ -2301,17 +2223,16 @@ vector< fc::variant > database_api_impl::get_required_fees( const vector database_api::get_proposed_transactions( const std::string account_id_or_name )const +vector database_api::get_proposed_transactions( account_id_type id )const { - return my->get_proposed_transactions( account_id_or_name ); + return my->get_proposed_transactions( id ); } /** TODO: add secondary index that will accelerate this process */ -vector database_api_impl::get_proposed_transactions( const std::string account_id_or_name )const +vector database_api_impl::get_proposed_transactions( account_id_type id )const { const auto& idx = _db.get_index_type(); vector result; - const account_id_type id = get_account_from_string(account_id_or_name)->id; idx.inspect_all_objects( [&](const object& obj){ const proposal_object& p = static_cast(obj); @@ -2426,26 +2347,6 @@ vector database_api_impl::get_tournaments_by_state(tournament return result; } -const account_object* database_api_impl::get_account_from_string( const std::string& name_or_id, - bool throw_if_not_found ) const -{ - // TODO cache the result to avoid repeatly fetching from db - FC_ASSERT( name_or_id.size() > 0); - const account_object* account = nullptr; - if (std::isdigit(name_or_id[0])) - account = _db.find(fc::variant(name_or_id, 1).as(1)); - else - { - const auto& idx = _db.get_index_type().indices().get(); - auto itr = idx.find(name_or_id); - if (itr != idx.end()) - account = &*itr; - } - if(throw_if_not_found) - FC_ASSERT( account, "no such account" ); - return account; -} - vector database_api::get_registered_tournaments(account_id_type account_filter, uint32_t limit) const { return my->get_registered_tournaments(account_filter, limit); @@ -2463,80 +2364,6 @@ vector database_api_impl::get_registered_tournaments(account return tournament_ids; } -////////////////////////////////////////////////////////////////////// -// // -// GPOS methods // -// // -////////////////////////////////////////////////////////////////////// - -graphene::app::gpos_info database_api::get_gpos_info(const account_id_type account) const -{ - return my->get_gpos_info(account); - -} -graphene::app::gpos_info database_api_impl::get_gpos_info(const account_id_type account) const -{ - FC_ASSERT( _db.head_block_time() > HARDFORK_GPOS_TIME); //Can be deleted after GPOS hardfork time - gpos_info result; - - result.vesting_factor = _db.calculate_vesting_factor(account(_db)); - result.current_subperiod = _db.get_gpos_current_subperiod(); - result.last_voted_time = account(_db).statistics(_db).last_vote_time; - - const auto& dividend_data = asset_id_type()(_db).dividend_data(_db); - const account_object& dividend_distribution_account = dividend_data.dividend_distribution_account(_db); - result.award = _db.get_balance(dividend_distribution_account, asset_id_type()(_db)); - - share_type total_amount; - auto balance_type = vesting_balance_type::gpos; -#ifdef USE_VESTING_OBJECT_BY_ASSET_BALANCE_INDEX - // get only once a collection of accounts that hold nonzero vesting balances of the dividend asset - auto vesting_balances_begin = - vesting_index.indices().get().lower_bound(boost::make_tuple(asset_id_type(), balance_type)); - auto vesting_balances_end = - vesting_index.indices().get().upper_bound(boost::make_tuple(asset_id_type(), balance_type, share_type())); - - for (const vesting_balance_object& vesting_balance_obj : boost::make_iterator_range(vesting_balances_begin, vesting_balances_end)) - { - total_amount += vesting_balance_obj.balance.amount; - } -#else - const vesting_balance_index& vesting_index = _db.get_index_type(); - const auto& vesting_balances = vesting_index.indices().get(); - for (const vesting_balance_object& vesting_balance_obj : vesting_balances) - { - if (vesting_balance_obj.balance.asset_id == asset_id_type() && vesting_balance_obj.balance_type == balance_type) - { - total_amount += vesting_balance_obj.balance.amount; - } - } -#endif - - vector account_vbos; - const time_point_sec now = _db.head_block_time(); - auto vesting_range = _db.get_index_type().indices().get().equal_range(account); - std::for_each(vesting_range.first, vesting_range.second, - [&account_vbos, now](const vesting_balance_object& balance) { - if(balance.balance.amount > 0 && balance.balance_type == vesting_balance_type::gpos - && balance.balance.asset_id == asset_id_type()) - account_vbos.emplace_back(balance); - }); - - share_type allowed_withdraw_amount = 0, account_vested_balance = 0; - - for (const vesting_balance_object& vesting_balance_obj : account_vbos) - { - account_vested_balance += vesting_balance_obj.balance.amount; - if(vesting_balance_obj.is_withdraw_allowed(_db.head_block_time(), vesting_balance_obj.balance.amount)) - allowed_withdraw_amount += vesting_balance_obj.balance.amount; - } - - result.total_amount = total_amount; - result.allowed_withdraw_amount = allowed_withdraw_amount; - result.account_vested_balance = account_vested_balance; - return result; -} - ////////////////////////////////////////////////////////////////////// // // // Private methods // diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp new file mode 100644 index 00000000..90538087 --- /dev/null +++ b/libraries/app/impacted.cpp @@ -0,0 +1,369 @@ +/* + * Copyright (c) 2015 Cryptonomex, Inc., and contributors. + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include + +namespace graphene { namespace app { + +using namespace fc; +using namespace graphene::chain; + +// TODO: Review all of these, especially no-ops +struct get_impacted_account_visitor +{ + flat_set& _impacted; + get_impacted_account_visitor( flat_set& impact ):_impacted(impact) {} + typedef void result_type; + + void operator()( const transfer_operation& op ) + { + _impacted.insert( op.to ); + } + + void operator()( const asset_claim_fees_operation& op ){} + void operator()( const limit_order_create_operation& op ) {} + void operator()( const limit_order_cancel_operation& op ) + { + _impacted.insert( op.fee_paying_account ); + } + void operator()( const call_order_update_operation& op ) {} + void operator()( const fill_order_operation& op ) + { + _impacted.insert( op.account_id ); + } + + void operator()( const account_create_operation& op ) + { + _impacted.insert( op.registrar ); + _impacted.insert( op.referrer ); + add_authority_accounts( _impacted, op.owner ); + add_authority_accounts( _impacted, op.active ); + } + + void operator()( const account_update_operation& op ) + { + _impacted.insert( op.account ); + if( op.owner ) + add_authority_accounts( _impacted, *(op.owner) ); + if( op.active ) + add_authority_accounts( _impacted, *(op.active) ); + } + + void operator()( const account_whitelist_operation& op ) + { + _impacted.insert( op.account_to_list ); + } + + void operator()( const account_upgrade_operation& op ) {} + void operator()( const account_transfer_operation& op ) + { + _impacted.insert( op.new_owner ); + } + + void operator()( const asset_create_operation& op ) {} + void operator()( const asset_update_operation& op ) + { + if( op.new_issuer ) + _impacted.insert( *(op.new_issuer) ); + } + + void operator()( const asset_update_bitasset_operation& op ) {} + void operator()( const asset_update_dividend_operation& op ) {} + void operator()( const asset_dividend_distribution_operation& op ) + { + _impacted.insert( op.account_id ); + } + + void operator()( const asset_update_feed_producers_operation& op ) {} + + void operator()( const asset_issue_operation& op ) + { + _impacted.insert( op.issue_to_account ); + } + + void operator()( const asset_reserve_operation& op ) {} + void operator()( const asset_fund_fee_pool_operation& op ) {} + void operator()( const asset_settle_operation& op ) {} + void operator()( const asset_global_settle_operation& op ) {} + void operator()( const asset_publish_feed_operation& op ) {} + void operator()( const witness_create_operation& op ) + { + _impacted.insert( op.witness_account ); + } + void operator()( const witness_update_operation& op ) + { + _impacted.insert( op.witness_account ); + } + + void operator()( const proposal_create_operation& op ) + { + vector other; + for( const auto& proposed_op : op.proposed_ops ) + operation_get_required_authorities( proposed_op.op, _impacted, _impacted, other ); + for( auto& o : other ) + add_authority_accounts( _impacted, o ); + } + + void operator()( const proposal_update_operation& op ) {} + void operator()( const proposal_delete_operation& op ) {} + + void operator()( const withdraw_permission_create_operation& op ) + { + _impacted.insert( op.authorized_account ); + } + + void operator()( const withdraw_permission_update_operation& op ) + { + _impacted.insert( op.authorized_account ); + } + + void operator()( const withdraw_permission_claim_operation& op ) + { + _impacted.insert( op.withdraw_from_account ); + } + + void operator()( const withdraw_permission_delete_operation& op ) + { + _impacted.insert( op.authorized_account ); + } + + void operator()( const committee_member_create_operation& op ) + { + _impacted.insert( op.committee_member_account ); + } + void operator()( const committee_member_update_operation& op ) + { + _impacted.insert( op.committee_member_account ); + } + void operator()( const committee_member_update_global_parameters_operation& op ) {} + + void operator()( const vesting_balance_create_operation& op ) + { + _impacted.insert( op.owner ); + } + + void operator()( const vesting_balance_withdraw_operation& op ) {} + void operator()( const worker_create_operation& op ) {} + void operator()( const custom_operation& op ) {} + void operator()( const assert_operation& op ) {} + void operator()( const balance_claim_operation& op ) {} + + void operator()( const override_transfer_operation& op ) + { + _impacted.insert( op.to ); + _impacted.insert( op.from ); + _impacted.insert( op.issuer ); + } + + void operator()( const transfer_to_blind_operation& op ) + { + _impacted.insert( op.from ); + for( const auto& out : op.outputs ) + add_authority_accounts( _impacted, out.owner ); + } + + void operator()( const blind_transfer_operation& op ) + { + for( const auto& in : op.inputs ) + add_authority_accounts( _impacted, in.owner ); + for( const auto& out : op.outputs ) + add_authority_accounts( _impacted, out.owner ); + } + + void operator()( const transfer_from_blind_operation& op ) + { + _impacted.insert( op.to ); + for( const auto& in : op.inputs ) + add_authority_accounts( _impacted, in.owner ); + } + + void operator()( const asset_settle_cancel_operation& op ) + { + _impacted.insert( op.account ); + } + + void operator()( const fba_distribute_operation& op ) + { + _impacted.insert( op.account_id ); + } + + void operator()( const sport_create_operation& op ) {} + void operator()( const sport_update_operation& op ) {} + void operator()( const sport_delete_operation& op ) {} + void operator()( const event_group_create_operation& op ) {} + void operator()( const event_group_update_operation& op ) {} + void operator()( const event_group_delete_operation& op ) {} + void operator()( const event_create_operation& op ) {} + void operator()( const event_update_operation& op ) {} + void operator()( const event_update_status_operation& op ) {} + void operator()( const betting_market_rules_create_operation& op ) {} + void operator()( const betting_market_rules_update_operation& op ) {} + void operator()( const betting_market_group_create_operation& op ) {} + void operator()( const betting_market_group_update_operation& op ) {} + void operator()( const betting_market_create_operation& op ) {} + void operator()( const betting_market_update_operation& op ) {} + void operator()( const betting_market_group_resolve_operation& op ) {} + void operator()( const betting_market_group_cancel_unmatched_bets_operation& op ) {} + + void operator()( const bet_place_operation& op ) + { + _impacted.insert( op.bettor_id ); + } + void operator()( const bet_cancel_operation& op ) + { + _impacted.insert( op.bettor_id ); + } + void operator()( const bet_canceled_operation& op ) + { + _impacted.insert( op.bettor_id ); + } + void operator()( const bet_adjusted_operation& op ) + { + _impacted.insert( op.bettor_id ); + } + void operator()( const bet_matched_operation& op ) + { + _impacted.insert( op.bettor_id ); + } + void operator()( const betting_market_group_resolved_operation& op ) + { + _impacted.insert( op.bettor_id ); + } + + void operator()( const tournament_create_operation& op ) + { + _impacted.insert( op.creator ); + _impacted.insert( op.options.whitelist.begin(), op.options.whitelist.end() ); + } + void operator()( const tournament_join_operation& op ) + { + _impacted.insert( op.payer_account_id ); + _impacted.insert( op.player_account_id ); + } + void operator()( const tournament_leave_operation& op ) + { + //if account canceling registration is not the player, it must be the payer + if (op.canceling_account_id != op.player_account_id) + _impacted.erase( op.canceling_account_id ); + _impacted.erase( op.player_account_id ); + } + void operator()( const game_move_operation& op ) + { + _impacted.insert( op.player_account_id ); + } + void operator()( const tournament_payout_operation& op ) + { + _impacted.insert( op.payout_account_id ); + } + void operator()( const affiliate_payout_operation& op ) + { + _impacted.insert( op.affiliate ); + } + void operator()( const affiliate_referral_payout_operation& op ) { } + void operator()( const lottery_asset_create_operation& op) { } + void operator()( const ticket_purchase_operation& op ) + { + _impacted.insert( op.buyer ); + } + void operator()( const lottery_reward_operation& op ) { + _impacted.insert( op.winner ); + } + void operator()( const lottery_end_operation& op ) { + for( auto participant : op.participants ) { + _impacted.insert(participant.first); + } + } + void operator()( const sweeps_vesting_claim_operation& op ) { + _impacted.insert( op.account ); + } + void operator()( const son_create_operation& op ){ + _impacted.insert( op.owner_account ); + } + void operator()( const son_update_operation& op ){ + _impacted.insert( op.owner_account ); + } + void operator()( const son_delete_operation& op ){ + _impacted.insert( op.owner_account ); + } + void operator()( const son_heartbeat_operation& op ){ + _impacted.insert( op.owner_account ); + } + void operator()( const son_report_down_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const son_maintenance_operation& op ){ + _impacted.insert( op.owner_account ); + } + void operator()( const son_wallet_recreate_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const son_wallet_update_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const son_wallet_deposit_create_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const son_wallet_deposit_process_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const son_wallet_withdraw_create_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const son_wallet_withdraw_process_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const sidechain_address_add_operation& op ){ + _impacted.insert( op.sidechain_address_account ); + } + void operator()( const sidechain_address_update_operation& op ){ + _impacted.insert( op.sidechain_address_account ); + } + void operator()( const sidechain_address_delete_operation& op ){ + _impacted.insert( op.sidechain_address_account ); + } + void operator()( const bitcoin_transaction_send_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const bitcoin_transaction_sign_operation& op ){ + _impacted.insert( op.payer ); + } + void operator()( const bitcoin_send_transaction_process_operation& op ){ + _impacted.insert( op.payer ); + } +}; + +void operation_get_impacted_accounts( const operation& op, flat_set& result ) +{ + get_impacted_account_visitor vtor = get_impacted_account_visitor( result ); + op.visit( vtor ); +} + +void transaction_get_impacted_accounts( const transaction& tx, flat_set& result ) +{ + for( const auto& op : tx.operations ) + operation_get_impacted_accounts( op, result ); +} + +} } diff --git a/libraries/app/include/graphene/app/api.hpp b/libraries/app/include/graphene/app/api.hpp index 4adf73a3..a263c4dd 100644 --- a/libraries/app/include/graphene/app/api.hpp +++ b/libraries/app/include/graphene/app/api.hpp @@ -31,8 +31,6 @@ #include #include -#include - #include #include #include @@ -97,32 +95,31 @@ namespace graphene { namespace app { class history_api { public: - history_api(application& app) - :_app(app), database_api( std::ref(*app.chain_database())) {} + history_api(application& app):_app(app){} /** * @brief Get operations relevant to the specificed account - * @param account_id_or_name The account ID or name whose history should be queried + * @param account The account whose history should be queried * @param stop ID of the earliest operation to retrieve * @param limit Maximum number of operations to retrieve (must not exceed 100) * @param start ID of the most recent operation to retrieve * @return A list of operations performed by account, ordered from most recent to oldest. */ - vector get_account_history(const std::string account_id_or_name, + vector get_account_history(account_id_type account, operation_history_id_type stop = operation_history_id_type(), unsigned limit = 100, operation_history_id_type start = operation_history_id_type())const; /** * @brief Get only asked operations relevant to the specified account - * @param account_id_or_name The account ID or name whose history should be queried + * @param account The account whose history should be queried * @param operation_id The ID of the operation we want to get operations in the account( 0 = transfer , 1 = limit order create, ...) * @param stop ID of the earliest operation to retrieve * @param limit Maximum number of operations to retrieve (must not exceed 100) * @param start ID of the most recent operation to retrieve * @return A list of operations performed by account, ordered from most recent to oldest. */ - vector get_account_history_operations(const std::string account_id_or_name, + vector get_account_history_operations(account_id_type account, int operation_id, operation_history_id_type start = operation_history_id_type(), operation_history_id_type stop = operation_history_id_type(), @@ -132,7 +129,7 @@ namespace graphene { namespace app { * @breif Get operations relevant to the specified account referenced * by an event numbering specific to the account. The current number of operations * for the account can be found in the account statistics (or use 0 for start). - * @param account_id_or_name The account ID or name whose history should be queried + * @param account The account whose history should be queried * @param stop Sequence number of earliest operation. 0 is default and will * query 'limit' number of operations. * @param limit Maximum number of operations to retrieve (must not exceed 100) @@ -140,19 +137,18 @@ namespace graphene { namespace app { * 0 is default, which will start querying from the most recent operation. * @return A list of operations performed by account, ordered from most recent to oldest. */ - vector get_relative_account_history( const std::string account_id_or_name, + vector get_relative_account_history( account_id_type account, uint32_t stop = 0, unsigned limit = 100, uint32_t start = 0) const; - vector get_fill_order_history( std::string asset_a, std::string asset_b, uint32_t limit )const; - vector get_market_history( std::string asset_a, std::string asset_b, uint32_t bucket_seconds, + vector get_fill_order_history( asset_id_type a, asset_id_type b, uint32_t limit )const; + vector get_market_history( asset_id_type a, asset_id_type b, uint32_t bucket_seconds, fc::time_point_sec start, fc::time_point_sec end )const; vector list_core_accounts()const; flat_set get_market_history_buckets()const; private: application& _app; - graphene::app::database_api database_api; }; /** @@ -329,47 +325,17 @@ namespace graphene { namespace app { class asset_api { public: - asset_api(graphene::app::application& app); + asset_api(graphene::chain::database& db); ~asset_api(); - /** - * @brief Get asset holders for a specific asset - * @param asset The specific asset id or symbol - * @param start The start index - * @param limit Maximum limit must not exceed 100 - * @return A list of asset holders for the specified asset - */ - vector get_asset_holders( std::string asset, uint32_t start, uint32_t limit )const; - - /** - * @brief Get asset holders count for a specific asset - * @param asset The specific asset id or symbol - * @return Holders count for the specified asset - */ - int get_asset_holders_count( std::string asset )const; - - /** - * @brief Get all asset holders - * @return A list of all asset holders - */ + vector get_asset_holders( asset_id_type asset_id, uint32_t start, uint32_t limit )const; + int get_asset_holders_count( asset_id_type asset_id )const; vector get_all_asset_holders() const; private: - graphene::app::application& _app; graphene::chain::database& _db; - graphene::app::database_api database_api; }; -} } // graphene::app -extern template class fc::api; -extern template class fc::api; -extern template class fc::api; -extern template class fc::api; -extern template class fc::api; -extern template class fc::api; -extern template class fc::api; - -namespace graphene { namespace app { /** * @brief The login_api class implements the bottom layer of the RPC API * @@ -431,8 +397,6 @@ namespace graphene { namespace app { }} // graphene::app -extern template class fc::api; - FC_REFLECT( graphene::app::network_broadcast_api::transaction_confirmation, (id)(block_num)(trx_num)(trx) ) FC_REFLECT( graphene::app::verify_range_result, diff --git a/libraries/app/include/graphene/app/application.hpp b/libraries/app/include/graphene/app/application.hpp index a436aacd..b0ace3d7 100644 --- a/libraries/app/include/graphene/app/application.hpp +++ b/libraries/app/include/graphene/app/application.hpp @@ -56,8 +56,8 @@ namespace graphene { namespace app { auto plug = std::make_shared(); plug->plugin_set_app(this); - boost::program_options::options_description plugin_cli_options(plug->plugin_name() + " plugin. " + plug->plugin_description() + "\nOptions"), plugin_cfg_options; - //boost::program_options::options_description plugin_cli_options("Options for plugin " + plug->plugin_name()), plugin_cfg_options; + string cli_plugin_desc = plug->plugin_name() + " plugin. " + plug->plugin_description() + "\nOptions"; + boost::program_options::options_description plugin_cli_options( cli_plugin_desc ), plugin_cfg_options; plug->plugin_set_program_options(plugin_cli_options, plugin_cfg_options); if( !plugin_cli_options.options().empty() ) _cli_options.add(plugin_cli_options); @@ -99,9 +99,7 @@ namespace graphene { namespace app { bool is_plugin_enabled(const string& name) const; - std::shared_ptr elasticsearch_thread; - - private: + private: void add_available_plugin( std::shared_ptr p ); std::shared_ptr my; diff --git a/libraries/app/include/graphene/app/database_api.hpp b/libraries/app/include/graphene/app/database_api.hpp index a89224b4..76ef822c 100644 --- a/libraries/app/include/graphene/app/database_api.hpp +++ b/libraries/app/include/graphene/app/database_api.hpp @@ -117,16 +117,6 @@ struct market_trade double value; }; -struct gpos_info { - double vesting_factor; - asset award; - share_type total_amount; - uint32_t current_subperiod; - fc::time_point_sec last_voted_time; - share_type allowed_withdraw_amount; - share_type account_vested_balance; -}; - /** * @brief The database_api class implements the RPC API for the chain database. * @@ -254,21 +244,13 @@ class database_api ////////////// /** - * @brief Get account object from a name or ID - * @param name_or_id name or ID of the account - * @return Account ID - * - */ - account_id_type get_account_id_from_string(const std::string& name_or_id)const; - - /** - * @brief Get a list of accounts by ID or Name + * @brief Get a list of accounts by ID * @param account_ids IDs of the accounts to retrieve * @return The accounts corresponding to the provided IDs * * This function has semantics identical to @ref get_objects */ - vector> get_accounts(const vector& account_names_or_ids)const; + vector> get_accounts(const vector& account_ids)const; /** * @brief Fetch all objects relevant to the specified accounts and subscribe to updates @@ -288,7 +270,7 @@ class database_api /** * @return all accounts that referr to the key or account id in their owner or active authorities. */ - vector get_account_references( const std::string account_name_or_id )const; + vector get_account_references( account_id_type account_id )const; /** * @brief Get a list of accounts by name @@ -317,8 +299,7 @@ class database_api * @param assets IDs of the assets to get balances of; if empty, get all assets account has a balance in * @return Balances of the account */ - vector get_account_balances( const std::string& account_name_or_id, - const flat_set& assets )const; + vector get_account_balances(account_id_type id, const flat_set& assets)const; /// Semantically equivalent to @ref get_account_balances, but takes a name instead of an ID. vector get_named_account_balances(const std::string& name, const flat_set& assets)const; @@ -328,7 +309,7 @@ class database_api vector get_vested_balances( const vector& objs )const; - vector get_vesting_balances( const std::string account_id_or_name )const; + vector get_vesting_balances( account_id_type account_id )const; /** * @brief Get the total number of accounts registered with the blockchain @@ -339,21 +320,14 @@ class database_api // Assets // //////////// - /** - * @brief Get asset ID from an asset symbol or ID - * @param symbol_or_id symbol name or ID of the asset - * @return asset ID - */ - asset_id_type get_asset_id_from_string(const std::string& symbol_or_id) const; - /** * @brief Get a list of assets by ID - * @param asset_symbols_or_ids IDs or names of the assets to retrieve + * @param asset_ids IDs of the assets to retrieve * @return The assets corresponding to the provided IDs * * This function has semantics identical to @ref get_objects */ - vector> get_assets(const vector& asset_symbols_or_ids)const; + vector> get_assets(const vector& asset_ids)const; /** * @brief Get assets alphabetically by symbol name @@ -455,47 +429,47 @@ class database_api * @param limit Maximum number of orders to retrieve * @return The limit orders, ordered from least price to greatest */ - vector get_limit_orders(const std::string& a, const std::string& b, uint32_t limit)const; + vector get_limit_orders(asset_id_type a, asset_id_type b, uint32_t limit)const; /** * @brief Get call orders in a given asset - * @param a ID or name of asset being called + * @param a ID of asset being called * @param limit Maximum number of orders to retrieve * @return The call orders, ordered from earliest to be called to latest */ - vector get_call_orders(const std::string& a, uint32_t limit)const; + vector get_call_orders(asset_id_type a, uint32_t limit)const; /** * @brief Get forced settlement orders in a given asset - * @param a ID or name of asset being settled + * @param a ID of asset being settled * @param limit Maximum number of orders to retrieve * @return The settle orders, ordered from earliest settlement date to latest */ - vector get_settle_orders(const std::string& a, uint32_t limit)const; + vector get_settle_orders(asset_id_type a, uint32_t limit)const; /** * @return all open margin positions for a given account id. */ - vector get_margin_positions( const std::string account_id_or_name )const; + vector get_margin_positions( const account_id_type& id )const; /** * @brief Request notification when the active orders in the market between two assets changes * @param callback Callback method which is called when the market changes - * @param a First asset ID or name - * @param b Second asset ID or name + * @param a First asset ID + * @param b Second asset ID * * Callback will be passed a variant containing a vector>. The vector will * contain, in order, the operations which changed the market, and their results. */ void subscribe_to_market(std::function callback, - const std::string& a, const std::string& b); + asset_id_type a, asset_id_type b); /** * @brief Unsubscribe from updates to a given market - * @param a First asset ID or name - * @param b Second asset ID or name + * @param a First asset ID + * @param b Second asset ID */ - void unsubscribe_from_market( const std::string& a, const std::string& b ); + void unsubscribe_from_market( asset_id_type a, asset_id_type b ); /** * @brief Returns the ticker for the market assetA:assetB @@ -554,7 +528,7 @@ class database_api * @param account The ID of the account whose witness should be retrieved * @return The witness object, or null if the account does not have a witness */ - fc::optional get_witness_by_account(const std::string account_name_or_id)const; + fc::optional get_witness_by_account(account_id_type account)const; /** * @brief Get names and IDs for registered witnesses @@ -584,10 +558,10 @@ class database_api /** * @brief Get the committee_member owned by a given account - * @param account_id_or_name The ID or name of the account whose committee_member should be retrieved + * @param account The ID of the account whose committee_member should be retrieved * @return The committee_member object, or null if the account does not have a committee_member */ - fc::optional get_committee_member_by_account(const std::string account_id_or_name)const; + fc::optional get_committee_member_by_account(account_id_type account)const; /** * @brief Get names and IDs for registered committee_members @@ -697,11 +671,9 @@ class database_api /// WORKERS /** - * @brief Return the worker objects associated with this account. - * @param account_id_or_name The ID or name of the account whose worker should be retrieved - * @return The worker object or null if the account does not have a worker + * Return the worker objects associated with this account. */ - vector get_workers_by_account(const std::string account_id_or_name)const; + vector get_workers_by_account(account_id_type account)const; /////////// @@ -758,7 +730,7 @@ class database_api * For each operation calculate the required fee in the specified asset type. If the asset type does * not have a valid core_exchange_rate */ - vector< fc::variant > get_required_fees( const vector& ops, const std::string& asset_id_or_symbol )const; + vector< fc::variant > get_required_fees( const vector& ops, asset_id_type id )const; /////////////////////////// // Proposed transactions // @@ -767,7 +739,7 @@ class database_api /** * @return the set of proposed transactions relevant to the specified account id. */ - vector get_proposed_transactions( const std::string account_id_or_name )const; + vector get_proposed_transactions( account_id_type id )const; ////////////////////// // Blinded balances // @@ -800,31 +772,17 @@ class database_api */ vector get_registered_tournaments(account_id_type account_filter, uint32_t limit) const; - ////////// - // GPOS // - ////////// - /** - * @return account and network GPOS information - */ - gpos_info get_gpos_info(const account_id_type account) const; - - - -private: + private: std::shared_ptr< database_api_impl > my; }; } } -extern template class fc::api; - FC_REFLECT( graphene::app::order, (price)(quote)(base) ); FC_REFLECT( graphene::app::order_book, (base)(quote)(bids)(asks) ); FC_REFLECT( graphene::app::market_ticker, (base)(quote)(latest)(lowest_ask)(highest_bid)(percent_change)(base_volume)(quote_volume) ); FC_REFLECT( graphene::app::market_volume, (base)(quote)(base_volume)(quote_volume) ); FC_REFLECT( graphene::app::market_trade, (date)(price)(amount)(value) ); -FC_REFLECT( graphene::app::gpos_info, (vesting_factor)(award)(total_amount)(current_subperiod)(last_voted_time)(allowed_withdraw_amount)(account_vested_balance) ); - FC_API(graphene::app::database_api, // Objects @@ -855,7 +813,6 @@ FC_API(graphene::app::database_api, (is_public_key_registered) // Accounts - (get_account_id_from_string) (get_accounts) (get_full_accounts) (get_account_by_name) @@ -876,7 +833,6 @@ FC_API(graphene::app::database_api, (list_assets) (lookup_asset_symbols) (get_asset_count) - (get_asset_id_from_string) // Peerplays (list_sports) @@ -962,7 +918,4 @@ FC_API(graphene::app::database_api, (get_tournaments_by_state) (get_tournaments ) (get_registered_tournaments) - - // gpos - (get_gpos_info) ) diff --git a/libraries/chain/include/graphene/chain/impacted.hpp b/libraries/app/include/graphene/app/impacted.hpp similarity index 96% rename from libraries/chain/include/graphene/chain/impacted.hpp rename to libraries/app/include/graphene/app/impacted.hpp index 2a22cbd1..2e59b910 100644 --- a/libraries/chain/include/graphene/chain/impacted.hpp +++ b/libraries/app/include/graphene/app/impacted.hpp @@ -28,7 +28,7 @@ #include #include -namespace graphene { namespace chain { +namespace graphene { namespace app { void operation_get_impacted_accounts( const graphene::chain::operation& op, @@ -39,4 +39,4 @@ void transaction_get_impacted_accounts( fc::flat_set& result ); -} } // graphene::app \ No newline at end of file +} } // graphene::app diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 8fba8a43..9c068ba5 100755 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -61,7 +61,6 @@ add_library( graphene_chain protocol/confidential.cpp protocol/vote.cpp protocol/tournament.cpp - protocol/small_ops.cpp genesis_state.cpp get_config.cpp @@ -95,7 +94,6 @@ add_library( graphene_chain fba_object.cpp proposal_object.cpp vesting_balance_object.cpp - small_objects.cpp block_database.cpp diff --git a/libraries/chain/account_evaluator.cpp b/libraries/chain/account_evaluator.cpp index ad6ac5dc..2d117f52 100644 --- a/libraries/chain/account_evaluator.cpp +++ b/libraries/chain/account_evaluator.cpp @@ -162,39 +162,33 @@ object_id_type account_create_evaluator::do_apply( const account_create_operatio if( referrer_percent > GRAPHENE_100_PERCENT ) referrer_percent = GRAPHENE_100_PERCENT; } - const auto& global_properties = d.get_global_properties(); - const auto& new_acnt_object = d.create( [&o,&d,&global_properties,referrer_percent]( account_object& obj ) - { - obj.registrar = o.registrar; - obj.referrer = o.referrer; - obj.lifetime_referrer = o.referrer(d).lifetime_referrer; + const auto& new_acnt_object = db().create( [&]( account_object& obj ){ + obj.registrar = o.registrar; + obj.referrer = o.referrer; + obj.lifetime_referrer = o.referrer(db()).lifetime_referrer; - const auto& params = global_properties.parameters; - obj.network_fee_percentage = params.network_percent_of_fee; - obj.lifetime_referrer_fee_percentage = params.lifetime_referrer_percent_of_fee; - obj.referrer_rewards_percentage = referrer_percent; + auto& params = db().get_global_properties().parameters; + obj.network_fee_percentage = params.network_percent_of_fee; + obj.lifetime_referrer_fee_percentage = params.lifetime_referrer_percent_of_fee; + obj.referrer_rewards_percentage = referrer_percent; - obj.name = o.name; - obj.owner = o.owner; - obj.active = o.active; - obj.options = o.options; - obj.statistics = d.create([&obj](account_statistics_object& s){ - s.owner = obj.id; - s.name = obj.name; - s.is_voting = obj.options.is_voting(); - }).id; + obj.name = o.name; + obj.owner = o.owner; + obj.active = o.active; + obj.options = o.options; + obj.statistics = db().create([&](account_statistics_object& s){s.owner = obj.id;}).id; - if( o.extensions.value.owner_special_authority.valid() ) - obj.owner_special_authority = *(o.extensions.value.owner_special_authority); - if( o.extensions.value.active_special_authority.valid() ) - obj.active_special_authority = *(o.extensions.value.active_special_authority); - if( o.extensions.value.buyback_options.valid() ) - { - obj.allowed_assets = o.extensions.value.buyback_options->markets; - obj.allowed_assets->emplace( o.extensions.value.buyback_options->asset_to_buy ); - } - obj.affiliate_distributions = o.extensions.value.affiliate_distributions; + if( o.extensions.value.owner_special_authority.valid() ) + obj.owner_special_authority = *(o.extensions.value.owner_special_authority); + if( o.extensions.value.active_special_authority.valid() ) + obj.active_special_authority = *(o.extensions.value.active_special_authority); + if( o.extensions.value.buyback_options.valid() ) + { + obj.allowed_assets = o.extensions.value.buyback_options->markets; + obj.allowed_assets->emplace( o.extensions.value.buyback_options->asset_to_buy ); + } + obj.affiliate_distributions = o.extensions.value.affiliate_distributions; }); if( has_small_percent ) @@ -206,18 +200,17 @@ object_id_type account_create_evaluator::do_apply( const account_create_operatio wlog( "Affected account object is ${o}", ("o", new_acnt_object) ); } - const auto& dynamic_properties = d.get_dynamic_global_properties(); - d.modify(dynamic_properties, [](dynamic_global_property_object& p) { + const auto& dynamic_properties = db().get_dynamic_global_properties(); + db().modify(dynamic_properties, [](dynamic_global_property_object& p) { ++p.accounts_registered_this_interval; }); - if( dynamic_properties.accounts_registered_this_interval % global_properties.parameters.accounts_per_fee_scale == 0 - && global_properties.parameters.account_fee_scale_bitshifts != 0 ) - { - d.modify(global_properties, [&dynamic_properties](global_property_object& p) { + const auto& global_properties = db().get_global_properties(); + if( dynamic_properties.accounts_registered_this_interval % + global_properties.parameters.accounts_per_fee_scale == 0 ) + db().modify(global_properties, [&dynamic_properties](global_property_object& p) { p.parameters.current_fees->get().basic_fee <<= p.parameters.account_fee_scale_bitshifts; }); - } if( o.extensions.value.owner_special_authority.valid() || o.extensions.value.active_special_authority.valid() ) @@ -287,26 +280,18 @@ void_result account_update_evaluator::do_apply( const account_update_operation& { try { database& d = db(); - bool sa_before = acnt->has_special_authority(); - - // update account statistics if( o.new_options.valid() ) { d.modify( acnt->statistics( d ), [&]( account_statistics_object& aso ) { - fc::optional< bool > flag = o.extensions.value.update_last_voting_time; if((o.new_options->votes != acnt->options.votes || - o.new_options->voting_account != acnt->options.voting_account) || - (flag.valid() && *flag)) + o.new_options->voting_account != acnt->options.voting_account)) aso.last_vote_time = d.head_block_time(); - - if(o.new_options->is_voting() != acnt->options.is_voting()) - aso.is_voting = !aso.is_voting; } ); } - // update account object - d.modify( *acnt, [&o](account_object& a){ + bool sa_before, sa_after; + d.modify( *acnt, [&](account_object& a){ if( o.owner ) { a.owner = *o.owner; @@ -318,6 +303,7 @@ void_result account_update_evaluator::do_apply( const account_update_operation& a.top_n_control_flags = 0; } if( o.new_options ) a.options = *o.new_options; + sa_before = a.has_special_authority(); if( o.extensions.value.owner_special_authority.valid() ) { a.owner_special_authority = *(o.extensions.value.owner_special_authority); @@ -328,10 +314,9 @@ void_result account_update_evaluator::do_apply( const account_update_operation& a.active_special_authority = *(o.extensions.value.active_special_authority); a.top_n_control_flags = 0; } + sa_after = a.has_special_authority(); }); - bool sa_after = acnt->has_special_authority(); - if( sa_before & (!sa_after) ) { const auto& sa_idx = d.get_index_type< special_authority_index >().indices().get(); diff --git a/libraries/chain/account_object.cpp b/libraries/chain/account_object.cpp index 71ee28de..e51e1705 100644 --- a/libraries/chain/account_object.cpp +++ b/libraries/chain/account_object.cpp @@ -22,9 +22,9 @@ * THE SOFTWARE. */ #include +#include #include - -#include +#include #include namespace graphene { namespace chain { @@ -46,8 +46,6 @@ void account_balance_object::adjust_balance(const asset& delta) { assert(delta.asset_id == asset_type); balance += delta.amount; - if( asset_type == asset_id_type() ) // CORE asset - maintenance_flag = true; } void account_statistics_object::process_fees(const account_object& a, database& d) const @@ -59,8 +57,8 @@ void account_statistics_object::process_fees(const account_object& a, database& // Check the referrer -- if he's no longer a member, pay to the lifetime referrer instead. // No need to check the registrar; registrars are required to be lifetime members. if( account.referrer(d).is_basic_account(d.head_block_time()) ) - d.modify( account, [](account_object& acc) { - acc.referrer = acc.lifetime_referrer; + d.modify(account, [](account_object& a) { + a.referrer = a.lifetime_referrer; }); share_type network_cut = cut_fee(core_fee_total, account.network_fee_percentage); @@ -76,8 +74,8 @@ void account_statistics_object::process_fees(const account_object& a, database& share_type lifetime_cut = cut_fee(core_fee_total, account.lifetime_referrer_fee_percentage); share_type referral = core_fee_total - network_cut - lifetime_cut; - d.modify( d.get_core_dynamic_data(), [network_cut](asset_dynamic_data_object& addo) { - addo.accumulated_fees += network_cut; + d.modify(asset_dynamic_data_id_type()(d), [network_cut](asset_dynamic_data_object& d) { + d.accumulated_fees += network_cut; }); // Potential optimization: Skip some of this math and object lookups by special casing on the account type. @@ -320,8 +318,3 @@ const account_balance_object* balances_by_account_index::get_account_balance( co } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_balance_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_statistics_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::pending_dividend_payout_balance_for_holder_object ) diff --git a/libraries/chain/asset_evaluator.cpp b/libraries/chain/asset_evaluator.cpp index 7a26a2cb..59b590dd 100644 --- a/libraries/chain/asset_evaluator.cpp +++ b/libraries/chain/asset_evaluator.cpp @@ -133,36 +133,33 @@ void asset_create_evaluator::pay_fee() object_id_type asset_create_evaluator::do_apply( const asset_create_operation& op ) { try { - database& d = db(); - // includes changes from bitshares. (https://github.com/bitshares/bitshares-core/issues/429) bool hf_429 = fee_is_odd && db().head_block_time() > HARDFORK_CORE_429_TIME; const asset_dynamic_data_object& dyn_asset = - d.create( [hf_429,this]( asset_dynamic_data_object& a ) { + db().create( [&]( asset_dynamic_data_object& a ) { a.current_supply = 0; a.fee_pool = core_fee_paid - (hf_429 ? 1 : 0); }); - if( fee_is_odd && !hf_429 ) - { - const auto& core_dd = d.get_core_asset().dynamic_data( d ); - d.modify( core_dd, []( asset_dynamic_data_object& dd ) { + if( fee_is_odd && !hf_429 ) + { + const auto& core_dd = db().get( asset_id_type() ).dynamic_data( db() ); + db().modify( core_dd, [=]( asset_dynamic_data_object& dd ) { dd.current_supply++; - }); - } - - auto next_asset_id = d.get_index_type().get_next_id(); + }); + } asset_bitasset_data_id_type bit_asset_id; if( op.bitasset_opts.valid() ) - bit_asset_id = d.create( [&]( asset_bitasset_data_object& a ) { + bit_asset_id = db().create( [&]( asset_bitasset_data_object& a ) { a.options = *op.bitasset_opts; a.is_prediction_market = op.is_prediction_market; - a.asset_id = next_asset_id; }).id; + auto next_asset_id = db().get_index_type().get_next_id(); + const asset_object& new_asset = - d.create( [&]( asset_object& a ) { + db().create( [&]( asset_object& a ) { a.issuer = op.issuer; a.symbol = op.symbol; a.precision = op.precision; @@ -178,7 +175,7 @@ object_id_type asset_create_evaluator::do_apply( const asset_create_operation& o if( op.bitasset_opts.valid() ) a.bitasset_data_id = bit_asset_id; }); - FC_ASSERT( new_asset.id == next_asset_id ); + assert( new_asset.id == next_asset_id ); return new_asset.id; } FC_CAPTURE_AND_RETHROW( (op) ) } @@ -284,36 +281,33 @@ void lottery_asset_create_evaluator::pay_fee() object_id_type lottery_asset_create_evaluator::do_apply( const lottery_asset_create_operation& op ) { try { - database& d = db(); - // includes changes from bitshares. (https://github.com/bitshares/bitshares-core/issues/429) - bool hf_429 = fee_is_odd && d.head_block_time() > HARDFORK_CORE_429_TIME; + bool hf_429 = fee_is_odd && db().head_block_time() > HARDFORK_CORE_429_TIME; const asset_dynamic_data_object& dyn_asset = - d.create( [&]( asset_dynamic_data_object& a ) { + db().create( [&]( asset_dynamic_data_object& a ) { a.current_supply = 0; a.fee_pool = core_fee_paid - (hf_429 ? 1 : 0); }); if( fee_is_odd && !hf_429 ) { - const auto& core_dd = d.get( asset_id_type() ).dynamic_data( db() ); - d.modify( core_dd, [=]( asset_dynamic_data_object& dd ) { + const auto& core_dd = db().get( asset_id_type() ).dynamic_data( db() ); + db().modify( core_dd, [=]( asset_dynamic_data_object& dd ) { dd.current_supply++; }); } - auto next_asset_id = d.get_index_type().get_next_id(); - asset_bitasset_data_id_type bit_asset_id; if( op.bitasset_opts.valid() ) - bit_asset_id = d.create( [&op,next_asset_id]( asset_bitasset_data_object& a ) { + bit_asset_id = db().create( [&]( asset_bitasset_data_object& a ) { a.options = *op.bitasset_opts; a.is_prediction_market = op.is_prediction_market; - a.asset_id = next_asset_id; }).id; + auto next_asset_id = db().get_index_type().get_next_id(); + const asset_object& new_asset = - d.create( [&op,next_asset_id,&dyn_asset,bit_asset_id,&d]( asset_object& a ) { + db().create( [&]( asset_object& a ) { a.issuer = op.issuer; a.symbol = op.symbol; a.precision = op.precision; @@ -322,7 +316,7 @@ object_id_type lottery_asset_create_evaluator::do_apply( const lottery_asset_cre a.lottery_options = op.extensions; //a.lottery_options->balance = asset( 0, a.lottery_options->ticket_price.asset_id ); a.lottery_options->owner = a.id; - d.create([&a](lottery_balance_object& lbo) { + db().create([&](lottery_balance_object& lbo) { lbo.lottery_id = a.id; }); if( a.options.core_exchange_rate.base.asset_id.instance.value == 0 ) @@ -333,7 +327,7 @@ object_id_type lottery_asset_create_evaluator::do_apply( const lottery_asset_cre if( op.bitasset_opts.valid() ) a.bitasset_data_id = bit_asset_id; }); - FC_ASSERT( new_asset.id == next_asset_id, "Unexpected object database error, object id mismatch" ); + assert( new_asset.id == next_asset_id ); return new_asset.id; } FC_CAPTURE_AND_RETHROW( (op) ) } @@ -360,7 +354,7 @@ void_result asset_issue_evaluator::do_apply( const asset_issue_operation& o ) { try { db().adjust_balance( o.issue_to_account, o.asset_to_issue ); - db().modify( *asset_dyn_data, [&o]( asset_dynamic_data_object& data ){ + db().modify( *asset_dyn_data, [&]( asset_dynamic_data_object& data ){ data.current_supply += o.asset_to_issue.amount; }); @@ -392,7 +386,7 @@ void_result asset_reserve_evaluator::do_apply( const asset_reserve_operation& o { try { db().adjust_balance( o.payer, -o.amount_to_reserve ); - db().modify( *asset_dyn_data, [&o]( asset_dynamic_data_object& data ){ + db().modify( *asset_dyn_data, [&]( asset_dynamic_data_object& data ){ data.current_supply -= o.amount_to_reserve.amount; }); @@ -414,7 +408,7 @@ void_result asset_fund_fee_pool_evaluator::do_apply(const asset_fund_fee_pool_op { try { db().adjust_balance(o.from_account, -o.amount); - db().modify( *asset_dyn_data, [&o]( asset_dynamic_data_object& data ) { + db().modify( *asset_dyn_data, [&]( asset_dynamic_data_object& data ) { data.fee_pool += o.amount; }); @@ -489,21 +483,7 @@ void_result asset_update_evaluator::do_apply(const asset_update_operation& o) d.cancel_order(*itr); } - // For market-issued assets, if core change rate changed, update flag in bitasset data - if( asset_to_update->is_market_issued() - && asset_to_update->options.core_exchange_rate != o.new_options.core_exchange_rate ) - { - const auto& bitasset = asset_to_update->bitasset_data(d); - if( !bitasset.asset_cer_updated ) - { - d.modify( bitasset, [](asset_bitasset_data_object& b) - { - b.asset_cer_updated = true; - }); - } - } - - d.modify(*asset_to_update, [&o](asset_object& a) { + d.modify(*asset_to_update, [&](asset_object& a) { if( o.new_issuer ) a.issuer = *o.new_issuer; a.options = o.new_options; diff --git a/libraries/chain/asset_object.cpp b/libraries/chain/asset_object.cpp index 88e5dfca..63df70a3 100644 --- a/libraries/chain/asset_object.cpp +++ b/libraries/chain/asset_object.cpp @@ -24,9 +24,10 @@ #include #include -#include #include +#include + using namespace graphene::chain; share_type asset_bitasset_data_object::max_force_settlement_volume(share_type current_supply) const @@ -60,15 +61,12 @@ void asset_bitasset_data_object::update_median_feeds(time_point_sec current_time if( current_feeds.size() < options.minimum_feeds ) { //... don't calculate a median, and set a null feed - feed_cer_updated = false; // new median cer is null, won't update asset_object anyway, set to false for better performance current_feed_publication_time = current_time; current_feed = price_feed(); return; } if( current_feeds.size() == 1 ) { - if( current_feed.core_exchange_rate != current_feeds.front().get().core_exchange_rate ) - feed_cer_updated = true; current_feed = std::move(current_feeds.front()); return; } @@ -87,8 +85,6 @@ void asset_bitasset_data_object::update_median_feeds(time_point_sec current_time #undef CALCULATE_MEDIAN_VALUE // *** End Median Calculations *** - if( current_feed.core_exchange_rate != median_feed.core_exchange_rate ) - feed_cer_updated = true; current_feed = median_feed; } @@ -295,11 +291,3 @@ void sweeps_vesting_balance_object::adjust_balance( const asset& delta ) FC_ASSERT( delta.asset_id == asset_id ); balance += delta.amount.value; } - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_dynamic_data_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_bitasset_data_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_dividend_data_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::total_distributed_dividend_balance_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::lottery_balance_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::sweeps_vesting_balance_object ) diff --git a/libraries/chain/balance_evaluator.cpp b/libraries/chain/balance_evaluator.cpp index 817d736f..8d29c01d 100644 --- a/libraries/chain/balance_evaluator.cpp +++ b/libraries/chain/balance_evaluator.cpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include -#include namespace graphene { namespace chain { diff --git a/libraries/chain/committee_member_evaluator.cpp b/libraries/chain/committee_member_evaluator.cpp index 73d7703b..d3756698 100644 --- a/libraries/chain/committee_member_evaluator.cpp +++ b/libraries/chain/committee_member_evaluator.cpp @@ -77,7 +77,15 @@ void_result committee_member_update_evaluator::do_apply( const committee_member_ void_result committee_member_update_global_parameters_evaluator::do_evaluate(const committee_member_update_global_parameters_operation& o) { try { FC_ASSERT(trx_state->_is_proposed_trx); - + + if( db().head_block_time() < HARDFORK_1000_TIME ) // TODO: remove after hf + FC_ASSERT( !o.new_parameters.extensions.value.min_bet_multiplier.valid() + && !o.new_parameters.extensions.value.max_bet_multiplier.valid() + && !o.new_parameters.extensions.value.betting_rake_fee_percentage.valid() + && !o.new_parameters.extensions.value.permitted_betting_odds_increments.valid() + && !o.new_parameters.extensions.value.live_betting_delay_time.valid(), + "Parameter extensions are not allowed yet!" ); + dgpo = &db().get_global_properties(); if( o.new_parameters.extensions.value.min_bet_multiplier.valid() && !o.new_parameters.extensions.value.max_bet_multiplier.valid() ) diff --git a/libraries/chain/db_balance.cpp b/libraries/chain/db_balance.cpp index 55729050..7a46df17 100644 --- a/libraries/chain/db_balance.cpp +++ b/libraries/chain/db_balance.cpp @@ -77,8 +77,6 @@ void database::adjust_balance(account_id_type account, asset delta ) b.owner = account; b.asset_type = delta.asset_id; b.balance = delta.amount.value; - if( b.asset_type == asset_id_type() ) // CORE asset - b.maintenance_flag = true; }); } else { if( delta.amount < 0 ) @@ -210,7 +208,7 @@ void database::deposit_cashback(const account_object& acct, share_type amount, b acct.get_id() == GRAPHENE_TEMP_ACCOUNT ) { // The blockchain's accounts do not get cashback; it simply goes to the reserve pool. - modify( get_core_dynamic_data(), [amount](asset_dynamic_data_object& d) { + modify(get(asset_id_type()).dynamic_asset_data_id(*this), [amount](asset_dynamic_data_object& d) { d.current_supply -= amount; }); return; @@ -225,15 +223,10 @@ void database::deposit_cashback(const account_object& acct, share_type amount, b if( new_vbid.valid() ) { - modify( acct, [&new_vbid]( account_object& _acct ) + modify( acct, [&]( account_object& _acct ) { _acct.cashback_vb = *new_vbid; } ); - - modify( acct.statistics( *this ), []( account_statistics_object& aso ) - { - aso.has_cashback_vb = true; - } ); } return; diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index eb843b8b..dfa6c4d1 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -198,90 +197,82 @@ bool database::push_block(const signed_block& new_block, uint32_t skip) bool database::_push_block(const signed_block& new_block) { try { uint32_t skip = get_node_properties().skip_flags; - const auto now = fc::time_point::now().sec_since_epoch(); - - if( _fork_db.head() && new_block.timestamp.sec_since_epoch() > now - 86400 ) + if( !(skip&skip_fork_db) ) { + /// TODO: if the block is greater than the head block and before the next maitenance interval // verify that the block signer is in the current set of active witnesses. - shared_ptr prev_block = _fork_db.fetch_block( new_block.previous ); - GRAPHENE_ASSERT( prev_block, unlinkable_block_exception, "block does not link to known chain" ); - if( prev_block->scheduled_witnesses && !(skip&(skip_witness_schedule_check|skip_witness_signature)) ) - verify_signing_witness( new_block, *prev_block ); - } - shared_ptr new_head = _fork_db.push_block(new_block); - //If the head block from the longest chain does not build off of the current head, we need to switch forks. - if( new_head->data.previous != head_block_id() ) - { - //If the newly pushed block is the same height as head, we get head back in new_head - //Only switch forks if new_head is actually higher than head - if( new_head->data.block_num() > head_block_num() ) + shared_ptr new_head = _fork_db.push_block(new_block); + //If the head block from the longest chain does not build off of the current head, we need to switch forks. + if( new_head->data.previous != head_block_id() ) { - wlog( "Switching to fork: ${id}", ("id",new_head->data.id()) ); - auto branches = _fork_db.fetch_branch_from(new_head->data.id(), head_block_id()); - - // pop blocks until we hit the forked block - while( head_block_id() != branches.second.back()->data.previous ) + //If the newly pushed block is the same height as head, we get head back in new_head + //Only switch forks if new_head is actually higher than head + if( new_head->data.block_num() > head_block_num() ) { - ilog( "popping block #${n} ${id}", ("n",head_block_num())("id",head_block_id()) ); - pop_block(); + wlog( "Switching to fork: ${id}", ("id",new_head->data.id()) ); + auto branches = _fork_db.fetch_branch_from(new_head->data.id(), head_block_id()); + + // pop blocks until we hit the forked block + while( head_block_id() != branches.second.back()->data.previous ) + { + ilog( "popping block #${n} ${id}", ("n",head_block_num())("id",head_block_id()) ); + pop_block(); + } + + // push all blocks on the new fork + for( auto ritr = branches.first.rbegin(); ritr != branches.first.rend(); ++ritr ) + { + ilog( "pushing block from fork #${n} ${id}", ("n",(*ritr)->data.block_num())("id",(*ritr)->id) ); + optional except; + try { + undo_database::session session = _undo_db.start_undo_session(); + apply_block( (*ritr)->data, skip ); + _block_id_to_block.store( (*ritr)->id, (*ritr)->data ); + session.commit(); + } + catch ( const fc::exception& e ) { except = e; } + if( except ) + { + wlog( "exception thrown while switching forks ${e}", ("e",except->to_detail_string() ) ); + // remove the rest of branches.first from the fork_db, those blocks are invalid + while( ritr != branches.first.rend() ) + { + ilog( "removing block from fork_db #${n} ${id}", ("n",(*ritr)->data.block_num())("id",(*ritr)->id) ); + _fork_db.remove( (*ritr)->id ); + ++ritr; + } + _fork_db.set_head( branches.second.front() ); + + // pop all blocks from the bad fork + while( head_block_id() != branches.second.back()->data.previous ) + { + ilog( "popping block #${n} ${id}", ("n",head_block_num())("id",head_block_id()) ); + pop_block(); + } + + ilog( "Switching back to fork: ${id}", ("id",branches.second.front()->data.id()) ); + // restore all blocks from the good fork + for( auto ritr2 = branches.second.rbegin(); ritr2 != branches.second.rend(); ++ritr2 ) + { + ilog( "pushing block #${n} ${id}", ("n",(*ritr2)->data.block_num())("id",(*ritr2)->id) ); + auto session = _undo_db.start_undo_session(); + apply_block( (*ritr2)->data, skip ); + _block_id_to_block.store( (*ritr2)->id, (*ritr2)->data ); + session.commit(); + } + throw *except; + } + } + return true; } - - // push all blocks on the new fork - for( auto ritr = branches.first.rbegin(); ritr != branches.first.rend(); ++ritr ) - { - ilog( "pushing block from fork #${n} ${id}", ("n",(*ritr)->data.block_num())("id",(*ritr)->id) ); - optional except; - try { - undo_database::session session = _undo_db.start_undo_session(); - apply_block( (*ritr)->data, skip ); - update_witnesses( **ritr ); - _block_id_to_block.store( (*ritr)->id, (*ritr)->data ); - session.commit(); - } - catch ( const fc::exception& e ) { except = e; } - if( except ) - { - wlog( "exception thrown while switching forks ${e}", ("e",except->to_detail_string() ) ); - // remove the rest of branches.first from the fork_db, those blocks are invalid - while( ritr != branches.first.rend() ) - { - ilog( "removing block from fork_db #${n} ${id}", ("n",(*ritr)->data.block_num())("id",(*ritr)->id) ); - _fork_db.remove( (*ritr)->id ); - ++ritr; - } - _fork_db.set_head( branches.second.front() ); - - // pop all blocks from the bad fork - while( head_block_id() != branches.second.back()->data.previous ) - { - ilog( "popping block #${n} ${id}", ("n",head_block_num())("id",head_block_id()) ); - pop_block(); - } - - ilog( "Switching back to fork: ${id}", ("id",branches.second.front()->data.id()) ); - // restore all blocks from the good fork - for( auto ritr2 = branches.second.rbegin(); ritr2 != branches.second.rend(); ++ritr2 ) - { - ilog( "pushing block #${n} ${id}", ("n",(*ritr2)->data.block_num())("id",(*ritr2)->id) ); - auto session = _undo_db.start_undo_session(); - apply_block( (*ritr2)->data, skip ); - _block_id_to_block.store( (*ritr2)->id, (*ritr2)->data ); - session.commit(); - } - throw *except; - } - } - return true; + else return false; } - else return false; } try { auto session = _undo_db.start_undo_session(); apply_block(new_block, skip); - if( new_block.timestamp.sec_since_epoch() > now - 86400 ) - update_witnesses( *new_head ); _block_id_to_block.store(new_block.id(), new_block); session.commit(); } catch ( const fc::exception& e ) { @@ -293,73 +284,6 @@ bool database::_push_block(const signed_block& new_block) return false; } FC_CAPTURE_AND_RETHROW( (new_block) ) } -void database::verify_signing_witness( const signed_block& new_block, const fork_item& fork_entry )const -{ - FC_ASSERT( new_block.timestamp >= fork_entry.next_block_time ); - uint32_t slot_num = ( new_block.timestamp - fork_entry.next_block_time ).to_seconds() / block_interval(); - const global_property_object& gpo = get_global_properties(); - - if (gpo.parameters.witness_schedule_algorithm == GRAPHENE_WITNESS_SHUFFLED_ALGORITHM) - { - uint64_t index = ( fork_entry.next_block_aslot + slot_num ) % fork_entry.scheduled_witnesses->size(); - const auto& scheduled_witness = (*fork_entry.scheduled_witnesses)[index]; - FC_ASSERT( new_block.witness == scheduled_witness.first, "Witness produced block at wrong time", - ("block witness",new_block.witness)("scheduled",scheduled_witness)("slot_num",slot_num) ); - FC_ASSERT( new_block.validate_signee( scheduled_witness.second ) ); - } - if (gpo.parameters.witness_schedule_algorithm == GRAPHENE_WITNESS_SCHEDULED_ALGORITHM && - slot_num != 0 ) - { - witness_id_type wid; - const witness_schedule_object& wso = get_witness_schedule_object(); - // ask the near scheduler who goes in the given slot - bool slot_is_near = wso.scheduler.get_slot(slot_num, wid); - if(! slot_is_near) - { - // if the near scheduler doesn't know, we have to extend it to - // a far scheduler. - // n.b. instantiating it is slow, but block gaps long enough to - // need it are likely pretty rare. - - witness_scheduler_rng far_rng(wso.rng_seed.begin(), GRAPHENE_FAR_SCHEDULE_CTR_IV); - - far_future_witness_scheduler far_scheduler = - far_future_witness_scheduler(wso.scheduler, far_rng); - if(!far_scheduler.get_slot(slot_num, wid)) - { - // no scheduled witness -- somebody set up us the bomb - // n.b. this code path is impossible, the present - // implementation of far_future_witness_scheduler - // returns true unconditionally - assert( false ); - } - } - - FC_ASSERT( new_block.witness == wid, "Witness produced block at wrong time", - ("block witness",new_block.witness)("scheduled",wid)("slot_num",slot_num) ); - FC_ASSERT( new_block.validate_signee( wid(*this).signing_key ) ); - } -} - -void database::update_witnesses( fork_item& fork_entry )const -{ - if( fork_entry.scheduled_witnesses ) return; - - const dynamic_global_property_object& dpo = get_dynamic_global_properties(); - fork_entry.next_block_aslot = dpo.current_aslot + 1; - fork_entry.next_block_time = get_slot_time( 1 ); - - const witness_schedule_object& wso = get_witness_schedule_object(); - fork_entry.scheduled_witnesses = std::make_shared< vector< pair< witness_id_type, public_key_type > > >(); - fork_entry.scheduled_witnesses->reserve( wso.current_shuffled_witnesses.size() ); - - for( size_t i = 0; i < wso.current_shuffled_witnesses.size(); ++i ) - { - const auto& witness = wso.current_shuffled_witnesses[i](*this); - fork_entry.scheduled_witnesses->emplace_back( wso.current_shuffled_witnesses[i], witness.signing_key ); - } -} - /** * Attempts to push the transaction into the pending queue * @@ -400,7 +324,7 @@ processed_transaction database::_push_transaction( const signed_transaction& trx temp_session.merge(); // notify anyone listening to pending transactions - notify_on_pending_transaction( trx ); + on_pending_transaction( trx ); return processed_trx; } @@ -669,7 +593,7 @@ void database::_apply_block( const signed_block& next_block ) const witness_object& signing_witness = validate_block_header(skip, next_block); const auto& global_props = get_global_properties(); - const auto& dynamic_global_props = get_dynamic_global_properties(); + const auto& dynamic_global_props = get(dynamic_global_property_id_type()); bool maint_needed = (dynamic_global_props.next_maintenance_time <= next_block.timestamp); _current_block_num = next_block_num; @@ -677,8 +601,6 @@ void database::_apply_block( const signed_block& next_block ) _current_op_in_trx = 0; _current_virtual_op = 0; - _issue_453_affected_assets.clear(); - for( const auto& trx : next_block.transactions ) { /* We do not need to push the undo state for each transaction @@ -722,8 +644,7 @@ void database::_apply_block( const signed_block& next_block ) clear_expired_transactions(); clear_expired_proposals(); clear_expired_orders(); - update_expired_feeds(); // this will update expired feeds and some core exchange rates - update_core_exchange_rates(); // this will update remaining core exchange rates + update_expired_feeds(); update_withdraw_permissions(); update_tournaments(); update_betting_markets(next_block.timestamp); @@ -745,7 +666,7 @@ void database::_apply_block( const signed_block& next_block ) apply_debug_updates(); // notify observers that the block has been applied - notify_applied_block( next_block ); //emit + applied_block( next_block ); //emit _applied_ops.clear(); notify_changed_objects(); diff --git a/libraries/chain/db_debug.cpp b/libraries/chain/db_debug.cpp index 27beb3ed..0fa5eb58 100644 --- a/libraries/chain/db_debug.cpp +++ b/libraries/chain/db_debug.cpp @@ -42,7 +42,7 @@ void database::debug_dump() const asset_dynamic_data_object& core_asset_data = db.get_core_asset().dynamic_asset_data_id(db); const auto& balance_index = db.get_index_type().indices(); - const auto& statistics_index = db.get_index_type().indices(); + const simple_index& statistics_index = db.get_index_type>(); map total_balances; map total_debts; share_type core_in_orders; diff --git a/libraries/chain/db_getter.cpp b/libraries/chain/db_getter.cpp index edc2a199..dfd59567 100644 --- a/libraries/chain/db_getter.cpp +++ b/libraries/chain/db_getter.cpp @@ -38,27 +38,22 @@ namespace graphene { namespace chain { const asset_object& database::get_core_asset() const { - return *_p_core_asset_obj; -} - -const asset_dynamic_data_object& database::get_core_dynamic_data() const -{ - return *_p_core_dynamic_data_obj; + return get(asset_id_type()); } const global_property_object& database::get_global_properties()const { - return *_p_global_prop_obj; + return get( global_property_id_type() ); } const chain_property_object& database::get_chain_properties()const { - return *_p_chain_property_obj; + return get( chain_property_id_type() ); } const dynamic_global_property_object& database::get_dynamic_global_properties() const { - return *_p_dyn_global_prop_obj; + return get( dynamic_global_property_id_type() ); } const fee_schedule& database::current_fee_schedule()const @@ -68,17 +63,17 @@ const fee_schedule& database::current_fee_schedule()const time_point_sec database::head_block_time()const { - return get_dynamic_global_properties().time; + return get( dynamic_global_property_id_type() ).time; } uint32_t database::head_block_num()const { - return get_dynamic_global_properties().head_block_number; + return get( dynamic_global_property_id_type() ).head_block_number; } block_id_type database::head_block_id()const { - return get_dynamic_global_properties().head_block_id; + return get( dynamic_global_property_id_type() ).head_block_id; } decltype( chain_parameters::block_interval ) database::block_interval( )const @@ -237,17 +232,4 @@ bool database::is_son_dereg_valid( son_id_type son_id ) return ret; } -const account_statistics_object& database::get_account_stats_by_owner( account_id_type owner )const -{ - auto& idx = get_index_type().indices().get(); - auto itr = idx.find( owner ); - FC_ASSERT( itr != idx.end(), "Can not find account statistics object for owner ${a}", ("a",owner) ); - return *itr; -} - -const witness_schedule_object& database::get_witness_schedule_object()const -{ - return *_p_witness_schedule_obj; -} - } } diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index a6527809..833e03e4 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -333,7 +333,7 @@ void database::initialize_indexes() add_index< primary_index >(); add_index< primary_index> >(); add_index< primary_index> >(); - add_index< primary_index >(); + add_index< primary_index> >(); add_index< primary_index> >(); add_index< primary_index> >(); add_index< primary_index > >(); @@ -395,19 +395,12 @@ void database::init_genesis(const genesis_state_type& genesis_state) n.owner.weight_threshold = 1; n.active.weight_threshold = 1; n.name = "committee-account"; - n.statistics = create( [&n](account_statistics_object& s){ - s.owner = n.id; - s.name = n.name; - s.core_in_balance = GRAPHENE_MAX_SHARE_SUPPLY; - }).id; + n.statistics = create( [&](account_statistics_object& s){ s.owner = n.id; }).id; }); FC_ASSERT(committee_account.get_id() == GRAPHENE_COMMITTEE_ACCOUNT); FC_ASSERT(create([this](account_object& a) { a.name = "witness-account"; - a.statistics = create([&a](account_statistics_object& s){ - s.owner = a.id; - s.name = a.name; - }).id; + a.statistics = create([&](account_statistics_object& s){s.owner = a.id;}).id; a.owner.weight_threshold = 1; a.active.weight_threshold = 1; a.registrar = a.lifetime_referrer = a.referrer = GRAPHENE_WITNESS_ACCOUNT; @@ -417,10 +410,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) }).get_id() == GRAPHENE_WITNESS_ACCOUNT); FC_ASSERT(create([this](account_object& a) { a.name = "relaxed-committee-account"; - a.statistics = create([&a](account_statistics_object& s){ - s.owner = a.id; - s.name = a.name; - }).id; + a.statistics = create([&](account_statistics_object& s){s.owner = a.id;}).id; a.owner.weight_threshold = 1; a.active.weight_threshold = 1; a.registrar = a.lifetime_referrer = a.referrer = GRAPHENE_RELAXED_COMMITTEE_ACCOUNT; @@ -430,10 +420,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) }).get_id() == GRAPHENE_RELAXED_COMMITTEE_ACCOUNT); FC_ASSERT(create([this](account_object& a) { a.name = "null-account"; - a.statistics = create([&a](account_statistics_object& s){ - s.owner = a.id; - s.name = a.name; - }).id; + a.statistics = create([&](account_statistics_object& s){s.owner = a.id;}).id; a.owner.weight_threshold = 1; a.active.weight_threshold = 1; a.registrar = a.lifetime_referrer = a.referrer = GRAPHENE_NULL_ACCOUNT; @@ -443,10 +430,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) }).get_id() == GRAPHENE_NULL_ACCOUNT); FC_ASSERT(create([this](account_object& a) { a.name = "temp-account"; - a.statistics = create([&a](account_statistics_object& s){ - s.owner = a.id; - s.name = a.name; - }).id; + a.statistics = create([&](account_statistics_object& s){s.owner = a.id;}).id; a.owner.weight_threshold = 0; a.active.weight_threshold = 0; a.registrar = a.lifetime_referrer = a.referrer = GRAPHENE_TEMP_ACCOUNT; @@ -456,10 +440,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) }).get_id() == GRAPHENE_TEMP_ACCOUNT); FC_ASSERT(create([this](account_object& a) { a.name = "proxy-to-self"; - a.statistics = create([&a](account_statistics_object& s){ - s.owner = a.id; - s.name = a.name; - }).id; + a.statistics = create([&](account_statistics_object& s){s.owner = a.id;}).id; a.owner.weight_threshold = 1; a.active.weight_threshold = 1; a.registrar = a.lifetime_referrer = a.referrer = GRAPHENE_NULL_ACCOUNT; @@ -469,10 +450,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) }).get_id() == GRAPHENE_PROXY_TO_SELF_ACCOUNT); FC_ASSERT(create([this](account_object& a) { a.name = "default-dividend-distribution"; - a.statistics = create([&a](account_statistics_object& s){ - s.owner = a.id; - s.name = a.name; - }).id; + a.statistics = create([&](account_statistics_object& s){s.owner = a.id;}).id; a.owner.weight_threshold = 1; a.active.weight_threshold = 1; a.registrar = a.lifetime_referrer = a.referrer = GRAPHENE_PROXY_TO_SELF_ACCOUNT; @@ -482,10 +460,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) }).get_id() == GRAPHENE_RAKE_FEE_ACCOUNT_ID); FC_ASSERT(create([this](account_object& a) { a.name = "son-account"; - a.statistics = create([&a](account_statistics_object& s){ - s.owner = a.id; - s.name = a.name; - }).id; + a.statistics = create([&](account_statistics_object& s){s.owner = a.id;}).id; a.owner.weight_threshold = 1; a.active.weight_threshold = 0; a.registrar = a.lifetime_referrer = a.referrer = GRAPHENE_SON_ACCOUNT; @@ -499,12 +474,9 @@ void database::init_genesis(const genesis_state_type& genesis_state) uint64_t id = get_index().get_next_id().instance(); if( id >= genesis_state.immutable_parameters.num_special_accounts ) break; - const account_object& acct = create([this,id](account_object& a) { + const account_object& acct = create([&](account_object& a) { a.name = "special-account-" + std::to_string(id); - a.statistics = create([&a](account_statistics_object& s){ - s.owner = a.id; - s.name = a.name; - }).id; + a.statistics = create([&](account_statistics_object& s){s.owner = a.id;}).id; a.owner.weight_threshold = 1; a.active.weight_threshold = 1; a.registrar = a.lifetime_referrer = a.referrer = account_id_type(id); @@ -518,12 +490,12 @@ void database::init_genesis(const genesis_state_type& genesis_state) // Create core asset const asset_dynamic_data_object& dyn_asset = - create([](asset_dynamic_data_object& a) { + create([&](asset_dynamic_data_object& a) { a.current_supply = GRAPHENE_MAX_SHARE_SUPPLY; }); const asset_dividend_data_object& div_asset = - create([&genesis_state](asset_dividend_data_object& a) { + create([&](asset_dividend_data_object& a) { a.options.minimum_distribution_interval = 3*24*60*60; a.options.minimum_fee_percentage = 10*GRAPHENE_1_PERCENT; a.options.next_payout_time = genesis_state.initial_timestamp + fc::days(1); @@ -532,7 +504,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) }); const asset_object& core_asset = - create( [&genesis_state,&div_asset,&dyn_asset]( asset_object& a ) { + create( [&]( asset_object& a ) { a.symbol = GRAPHENE_SYMBOL; a.options.max_supply = genesis_state.max_core_supply; a.precision = GRAPHENE_BLOCKCHAIN_PRECISION_DIGITS; @@ -545,12 +517,9 @@ void database::init_genesis(const genesis_state_type& genesis_state) a.options.core_exchange_rate.quote.asset_id = asset_id_type(0); a.dynamic_asset_data_id = dyn_asset.id; a.dividend_data_id = div_asset.id; - }); - FC_ASSERT( dyn_asset.id == asset_dynamic_data_id_type() ); - FC_ASSERT( asset_id_type(core_asset.id) == asset().asset_id ); - FC_ASSERT( get_balance(account_id_type(), asset_id_type()) == asset(dyn_asset.current_supply) ); - _p_core_asset_obj = &core_asset; - _p_core_dynamic_data_obj = &dyn_asset; + }); + assert( asset_id_type(core_asset.id) == asset().asset_id ); + assert( get_balance(account_id_type(), asset_id_type()) == asset(dyn_asset.current_supply) ); #ifdef _DEFAULT_DIVIDEND_ASSET // Create default dividend asset @@ -583,7 +552,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) a.dynamic_asset_data_id = dyn_asset1.id; a.dividend_data_id = div_asset1.id; }); - FC_ASSERT( default_asset.id == asset_id_type(1) ); + assert( default_asset.id == asset_id_type(1) ); #endif // Create more special assets @@ -593,10 +562,10 @@ void database::init_genesis(const genesis_state_type& genesis_state) if( id >= genesis_state.immutable_parameters.num_special_assets ) break; const asset_dynamic_data_object& dyn_asset = - create([](asset_dynamic_data_object& a) { + create([&](asset_dynamic_data_object& a) { a.current_supply = 0; }); - const asset_object& asset_obj = create( [id,&dyn_asset]( asset_object& a ) { + const asset_object& asset_obj = create( [&]( asset_object& a ) { a.symbol = "SPECIAL" + std::to_string( id ); a.options.max_supply = 0; a.precision = GRAPHENE_BLOCKCHAIN_PRECISION_DIGITS; @@ -616,14 +585,14 @@ void database::init_genesis(const genesis_state_type& genesis_state) chain_id_type chain_id = genesis_state.compute_chain_id(); // Create global properties - _p_global_prop_obj = & create([&genesis_state](global_property_object& p) { + create([&](global_property_object& p) { p.parameters = genesis_state.initial_parameters; // Set fees to zero initially, so that genesis initialization needs not pay them // We'll fix it at the end of the function p.parameters.current_fees->zero_all_fees(); }); - _p_dyn_global_prop_obj = & create([&genesis_state](dynamic_global_property_object& p) { + create([&](dynamic_global_property_object& p) { p.time = genesis_state.initial_timestamp; p.dynamic_flags = 0; p.witness_budget = 0; @@ -636,7 +605,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) FC_ASSERT( (genesis_state.immutable_parameters.min_witness_count & 1) == 1, "min_witness_count must be odd" ); FC_ASSERT( (genesis_state.immutable_parameters.min_committee_member_count & 1) == 1, "min_committee_member_count must be odd" ); - _p_chain_property_obj = & create([chain_id,&genesis_state](chain_property_object& p) + create([&](chain_property_object& p) { p.chain_id = chain_id; p.immutable_parameters = genesis_state.immutable_parameters; @@ -760,7 +729,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) cop.active = cop.owner; account_id_type owner_account_id = apply_operation(genesis_eval_state, cop).get(); - modify( owner_account_id(*this).statistics(*this), [&collateral_rec]( account_statistics_object& o ) { + modify( owner_account_id(*this).statistics(*this), [&]( account_statistics_object& o ) { o.total_core_in_orders = collateral_rec.collateral; }); @@ -976,7 +945,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) }); // Set active witnesses - modify(get_global_properties(), [&genesis_state](global_property_object& p) { + modify(get_global_properties(), [&](global_property_object& p) { for( uint32_t i = 1; i <= genesis_state.initial_active_witnesses; ++i ) { p.active_witnesses.insert(witness_id_type(i)); @@ -984,7 +953,10 @@ void database::init_genesis(const genesis_state_type& genesis_state) }); // Initialize witness schedule - _p_witness_schedule_obj = & create([this](witness_schedule_object& _wso) +#ifndef NDEBUG + const witness_schedule_object& wso = +#endif + create([&](witness_schedule_object& _wso) { // for scheduled memset(_wso.rng_seed.begin(), 0, _wso.rng_seed.size()); @@ -1008,7 +980,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) for( const witness_id_type& wid : get_global_properties().active_witnesses ) _wso.current_shuffled_witnesses.push_back( wid ); }); - FC_ASSERT( _p_witness_schedule_obj->id == witness_schedule_id_type() ); + assert( wso.id == witness_schedule_id_type() ); // Initialize witness schedule #ifndef NDEBUG @@ -1038,6 +1010,12 @@ void database::init_genesis(const genesis_state_type& genesis_state) p.parameters.current_fees = genesis_state.initial_parameters.current_fees; }); + // Create witness scheduler + //create([&]( witness_schedule_object& wso ) + //{ + // for( const witness_id_type& wid : get_global_properties().active_witnesses ) + // wso.current_shuffled_witnesses.push_back( wid ); + //}); // Create FBA counters create([&]( fba_accumulator_object& acc ) diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 841389cb..96ef6853 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -77,44 +77,12 @@ vector> database::sort return refs; } -template -void database::perform_account_maintenance(Type tally_helper) +template +void database::perform_account_maintenance(std::tuple helpers) { - const auto& bal_idx = get_index_type< account_balance_index >().indices().get< by_maintenance_flag >(); - if( bal_idx.begin() != bal_idx.end() ) - { - auto bal_itr = bal_idx.rbegin(); - while( bal_itr->maintenance_flag ) - { - const account_balance_object& bal_obj = *bal_itr; - - modify( get_account_stats_by_owner( bal_obj.owner ), [&bal_obj](account_statistics_object& aso) { - aso.core_in_balance = bal_obj.balance; - }); - - modify( bal_obj, []( account_balance_object& abo ) { - abo.maintenance_flag = false; - }); - - bal_itr = bal_idx.rbegin(); - } - } - - const auto& stats_idx = get_index_type< account_stats_index >().indices().get< by_maintenance_seq >(); - auto stats_itr = stats_idx.lower_bound( true ); - - while( stats_itr != stats_idx.end() ) - { - const account_statistics_object& acc_stat = *stats_itr; - const account_object& acc_obj = acc_stat.owner( *this ); - ++stats_itr; - - if( acc_stat.has_some_core_voting() ) - tally_helper( acc_obj, acc_stat ); - - if( acc_stat.has_pending_fees() ) - acc_stat.process_fees( acc_obj, *this ); - } + const auto& idx = get_index_type().indices().get(); + for( const account_object& a : idx ) + detail::for_each(helpers, a, detail::gen_seq()); } /// @brief A visitor for @ref worker_type which calls pay_worker on the worker within @@ -336,13 +304,12 @@ void database::update_son_wallet(const vector& new_active_sons) void database::pay_workers( share_type& budget ) { - const auto head_time = head_block_time(); // ilog("Processing payroll! Available budget is ${b}", ("b", budget)); vector> active_workers; - // TODO optimization: add by_expiration index to avoid iterating through all objects - get_index_type().inspect_all_objects([head_time, &active_workers](const object& o) { + get_index_type().inspect_all_objects([this, &active_workers](const object& o) { const worker_object& w = static_cast(o); - if( w.is_active(head_time) && w.approving_stake() > 0 ) + auto now = head_block_time(); + if( w.is_active(now) && w.approving_stake() > 0 ) active_workers.emplace_back(w); }); @@ -356,22 +323,17 @@ void database::pay_workers( share_type& budget ) return wa.id < wb.id; }); - const auto last_budget_time = get_dynamic_global_properties().last_budget_time; - const auto passed_time_ms = head_time - last_budget_time; - const auto passed_time_count = passed_time_ms.count(); - const auto day_count = fc::days(1).count(); for( uint32_t i = 0; i < active_workers.size() && budget > 0; ++i ) { const worker_object& active_worker = active_workers[i]; share_type requested_pay = active_worker.daily_pay; - - // Note: if there is a good chance that passed_time_count == day_count, - // for better performance, can avoid the 128 bit calculation by adding a check. - // Since it's not the case on BitShares mainnet, we're not using a check here. - fc::uint128 pay(requested_pay.value); - pay *= passed_time_count; - pay /= day_count; - requested_pay = pay.to_uint64(); + if( head_block_time() - get_dynamic_global_properties().last_budget_time != fc::days(1) ) + { + fc::uint128 pay(requested_pay.value); + pay *= (head_block_time() - get_dynamic_global_properties().last_budget_time).count(); + pay /= fc::days(1).count(); + requested_pay = pay.to_uint64(); + } share_type actual_pay = std::min(budget, requested_pay); //ilog(" ==> Paying ${a} to worker ${w}", ("w", active_worker.id)("a", actual_pay)); @@ -408,27 +370,13 @@ void database::update_active_witnesses() const global_property_object& gpo = get_global_properties(); - auto update_witness_total_votes = [this]( const witness_object& wit ) { - modify( wit, [this]( witness_object& obj ) - { - obj.total_votes = _vote_tally_buffer[obj.vote_id]; - }); - }; + const auto& all_witnesses = get_index_type().indices(); - if( _track_standby_votes ) + for( const witness_object& wit : all_witnesses ) { - const auto& all_witnesses = get_index_type().indices(); - for( const witness_object& wit : all_witnesses ) - { - update_witness_total_votes( wit ); - } - } - else - { - for( const witness_object& wit : wits ) - { - update_witness_total_votes( wit ); - } + modify( wit, [&]( witness_object& obj ){ + obj.total_votes = _vote_tally_buffer[wit.vote_id]; + }); } // Update witness authority @@ -504,29 +452,13 @@ void database::update_active_committee_members() const chain_property_object& cpo = get_chain_properties(); auto committee_members = sort_votable_objects(std::max(committee_member_count*2+1, (size_t)cpo.immutable_parameters.min_committee_member_count)); - auto update_committee_member_total_votes = [this]( const committee_member_object& cm ) { - modify( cm, [this]( committee_member_object& obj ) - { - obj.total_votes = _vote_tally_buffer[obj.vote_id]; - }); - }; + for( const committee_member_object& del : committee_members ) + { + modify( del, [&]( committee_member_object& obj ){ + obj.total_votes = _vote_tally_buffer[del.vote_id]; + }); + } - if( _track_standby_votes ) - { - const auto& all_committee_members = get_index_type().indices(); - for( const committee_member_object& cm : all_committee_members ) - { - update_committee_member_total_votes( cm ); - } - } - else - { - for( const committee_member_object& cm : committee_members ) - { - update_committee_member_total_votes( cm ); - } - } - // Update committee authorities if( !committee_members.empty() ) { @@ -716,8 +648,8 @@ void database::update_active_sons() void database::initialize_budget_record( fc::time_point_sec now, budget_record& rec )const { const dynamic_global_property_object& dpo = get_dynamic_global_properties(); - const asset_object& core = get_core_asset(); - const asset_dynamic_data_object& core_dd = get_core_dynamic_data(); + const asset_object& core = asset_id_type(0)(*this); + const asset_dynamic_data_object& core_dd = core.dynamic_asset_data_id(*this); rec.from_initial_reserve = core.reserved(*this); rec.from_accumulated_fees = core_dd.accumulated_fees; @@ -770,7 +702,8 @@ void database::process_budget() { const global_property_object& gpo = get_global_properties(); const dynamic_global_property_object& dpo = get_dynamic_global_properties(); - const asset_dynamic_data_object& core = get_core_dynamic_data(); + const asset_dynamic_data_object& core = + asset_id_type(0)(*this).dynamic_asset_data_id(*this); fc::time_point_sec now = head_block_time(); int64_t time_to_maint = (dpo.next_maintenance_time - now).to_seconds(); @@ -950,7 +883,8 @@ void split_fba_balance( if( fba.accumulated_fba_fees == 0 ) return; - const asset_dynamic_data_object& core_dd = db.get_core_dynamic_data(); + const asset_object& core = asset_id_type(0)(db); + const asset_dynamic_data_object& core_dd = core.dynamic_asset_data_id(db); if( !fba.is_configured(db) ) { @@ -1124,154 +1058,6 @@ void deprecate_annual_members( database& db ) return; } -uint32_t database::get_gpos_current_subperiod() -{ - if(this->head_block_time() < HARDFORK_GPOS_TIME) //Can be deleted after GPOS hardfork time - return 0; - - fc::time_point_sec last_date_voted; - - const auto &gpo = this->get_global_properties(); - const auto vesting_period = gpo.parameters.gpos_period(); - const auto vesting_subperiod = gpo.parameters.gpos_subperiod(); - const auto period_start = fc::time_point_sec(gpo.parameters.gpos_period_start()); - - // variables needed - const fc::time_point_sec period_end = period_start + vesting_period; - const auto number_of_subperiods = vesting_period / vesting_subperiod; - const auto now = this->head_block_time(); - auto seconds_since_period_start = now.sec_since_epoch() - period_start.sec_since_epoch(); - - FC_ASSERT(period_start <= now && now <= period_end); - - // get in what sub period we are - uint32_t current_subperiod = 0; - std::list period_list(number_of_subperiods); - std::iota(period_list.begin(), period_list.end(), 1); - - std::for_each(period_list.begin(), period_list.end(),[&](uint32_t period) { - if(seconds_since_period_start >= vesting_subperiod * (period - 1) && - seconds_since_period_start < vesting_subperiod * period) - current_subperiod = period; - }); - - return current_subperiod; -} - -double database::calculate_vesting_factor(const account_object& stake_account) -{ - fc::time_point_sec last_date_voted; - // get last time voted form account stats - // check last_vote_time of proxy voting account if proxy is set - if (stake_account.options.voting_account == GRAPHENE_PROXY_TO_SELF_ACCOUNT) - last_date_voted = stake_account.statistics(*this).last_vote_time; - else - last_date_voted = stake_account.options.voting_account(*this).statistics(*this).last_vote_time; - - // get global data related to gpos - const auto &gpo = this->get_global_properties(); - const auto vesting_period = gpo.parameters.gpos_period(); - const auto vesting_subperiod = gpo.parameters.gpos_subperiod(); - const auto period_start = fc::time_point_sec(gpo.parameters.gpos_period_start()); - - // variables needed - const auto number_of_subperiods = vesting_period / vesting_subperiod; - double vesting_factor; - - // get in what sub period we are - uint32_t current_subperiod = get_gpos_current_subperiod(); - - if(current_subperiod == 0 || current_subperiod > number_of_subperiods) return 0; - - // On starting new vesting period, all votes become zero until someone votes, To avoid a situation of zero votes, - // changes were done to roll in GPOS rules, the vesting factor will be 1 for whoever votes in 6th sub-period of last vesting period - // BLOCKBACK-174 fix - if(current_subperiod == 1 && this->head_block_time() >= HARDFORK_GPOS_TIME + vesting_period) //Applicable only from 2nd vesting period - { - if(last_date_voted > period_start - vesting_subperiod) - return 1; - } - if(last_date_voted < period_start) return 0; - - double numerator = number_of_subperiods; - - if(current_subperiod > 1) { - std::list subperiod_list(current_subperiod - 1); - std::iota(subperiod_list.begin(), subperiod_list.end(), 2); - subperiod_list.reverse(); - - for(auto subperiod: subperiod_list) - { - numerator--; - - auto last_period_start = period_start + fc::seconds(vesting_subperiod * (subperiod - 1)); - auto last_period_end = period_start + fc::seconds(vesting_subperiod * (subperiod)); - - if (last_date_voted > last_period_start && last_date_voted <= last_period_end) { - numerator++; - break; - } - } - } - vesting_factor = numerator / number_of_subperiods; - return vesting_factor; -} - -share_type credit_account(database& db, const account_id_type owner_id, const std::string owner_name, - share_type remaining_amount_to_distribute, - const share_type shares_to_credit, const asset_id_type payout_asset_type, - const pending_dividend_payout_balance_for_holder_object_index& pending_payout_balance_index, - const asset_id_type dividend_id) { - - //wdump((delta_balance.value)(holder_balance)(total_balance_of_dividend_asset)); - if (shares_to_credit.value) { - - remaining_amount_to_distribute -= shares_to_credit; - - dlog("Crediting account ${account} with ${amount}", - ("account", owner_name) - ("amount", asset(shares_to_credit, payout_asset_type))); - auto pending_payout_iter = - pending_payout_balance_index.indices().get().find( - boost::make_tuple(dividend_id, payout_asset_type, - owner_id)); - if (pending_payout_iter == - pending_payout_balance_index.indices().get().end()) - db.create( - [&](pending_dividend_payout_balance_for_holder_object &obj) { - obj.owner = owner_id; - obj.dividend_holder_asset_type = dividend_id; - obj.dividend_payout_asset_type = payout_asset_type; - obj.pending_balance = shares_to_credit; - }); - else - db.modify(*pending_payout_iter, - [&](pending_dividend_payout_balance_for_holder_object &pending_balance) { - pending_balance.pending_balance += shares_to_credit; - }); - } - return remaining_amount_to_distribute; -} - -void rolling_period_start(database& db) -{ - if(db.head_block_time() >= HARDFORK_GPOS_TIME) - { - auto gpo = db.get_global_properties(); - auto period_start = db.get_global_properties().parameters.gpos_period_start(); - auto vesting_period = db.get_global_properties().parameters.gpos_period(); - - auto now = db.head_block_time(); - if(now.sec_since_epoch() >= (period_start + vesting_period)) - { - // roll - db.modify(db.get_global_properties(), [now](global_property_object& p) { - p.parameters.extensions.value.gpos_period_start = now.sec_since_epoch(); - }); - } - } -} - // Schedules payouts from a dividend distribution account to the current holders of the // dividend-paying asset. This takes any deposits made to the dividend distribution account // since the last time it was called, and distributes them to the current owners of the @@ -1303,42 +1089,34 @@ void schedule_pending_dividend_balances(database& db, balance_index.indices().get().lower_bound(boost::make_tuple(dividend_holder_asset_obj.id)); auto holder_balances_end = balance_index.indices().get().upper_bound(boost::make_tuple(dividend_holder_asset_obj.id, share_type())); + uint32_t holder_account_count = std::distance(holder_balances_begin, holder_balances_end); uint64_t distribution_base_fee = gpo.parameters.current_fees->get().distribution_base_fee; uint32_t distribution_fee_per_holder = gpo.parameters.current_fees->get().distribution_fee_per_holder; + // the fee, in BTS, for distributing each asset in the account + uint64_t total_fee_per_asset_in_core = distribution_base_fee + holder_account_count * (uint64_t)distribution_fee_per_holder; std::map vesting_amounts; - - auto balance_type = vesting_balance_type::normal; - if(db.head_block_time() >= HARDFORK_GPOS_TIME) - balance_type = vesting_balance_type::gpos; - - uint32_t holder_account_count = 0; - #ifdef USE_VESTING_OBJECT_BY_ASSET_BALANCE_INDEX // get only once a collection of accounts that hold nonzero vesting balances of the dividend asset auto vesting_balances_begin = - vesting_index.indices().get().lower_bound(boost::make_tuple(dividend_holder_asset_obj.id, balance_type)); + vesting_index.indices().get().lower_bound(boost::make_tuple(dividend_holder_asset_obj.id)); auto vesting_balances_end = - vesting_index.indices().get().upper_bound(boost::make_tuple(dividend_holder_asset_obj.id, balance_type, share_type())); - + vesting_index.indices().get().upper_bound(boost::make_tuple(dividend_holder_asset_obj.id, share_type())); for (const vesting_balance_object& vesting_balance_obj : boost::make_iterator_range(vesting_balances_begin, vesting_balances_end)) { vesting_amounts[vesting_balance_obj.owner] += vesting_balance_obj.balance.amount; - ++holder_account_count; - dlog("Vesting balance for account: ${owner}, amount: ${amount}", - ("owner", vesting_balance_obj.owner(db).name) - ("amount", vesting_balance_obj.balance.amount)); + //dlog("Vesting balance for account: ${owner}, amount: ${amount}", + // ("owner", vesting_balance_obj.owner(db).name) + // ("amount", vesting_balance_obj.balance.amount)); } #else // get only once a collection of accounts that hold nonzero vesting balances of the dividend asset const auto& vesting_balances = vesting_index.indices().get(); for (const vesting_balance_object& vesting_balance_obj : vesting_balances) { - if (vesting_balance_obj.balance.asset_id == dividend_holder_asset_obj.id && vesting_balance_obj.balance.amount && - vesting_balance_object.balance_type == balance_type) + if (vesting_balance_obj.balance.asset_id == dividend_holder_asset_obj.id && vesting_balance_obj.balance.amount) { vesting_amounts[vesting_balance_obj.owner] += vesting_balance_obj.balance.amount; - ++gpos_holder_account_count; dlog("Vesting balance for account: ${owner}, amount: ${amount}", ("owner", vesting_balance_obj.owner(db).name) ("amount", vesting_balance_obj.balance.amount)); @@ -1347,12 +1125,6 @@ void schedule_pending_dividend_balances(database& db, #endif auto current_distribution_account_balance_iter = current_distribution_account_balance_range.begin(); - if(db.head_block_time() < HARDFORK_GPOS_TIME) - holder_account_count = std::distance(holder_balances_begin, holder_balances_end); - // the fee, in BTS, for distributing each asset in the account - uint64_t total_fee_per_asset_in_core = distribution_base_fee + holder_account_count * (uint64_t)distribution_fee_per_holder; - - //auto current_distribution_account_balance_iter = current_distribution_account_balance_range.first; auto previous_distribution_account_balance_iter = previous_distribution_account_balance_range.first; dlog("Current balances in distribution account: ${current}, Previous balances: ${previous}", ("current", (int64_t)std::distance(current_distribution_account_balance_range.begin(), current_distribution_account_balance_range.end())) @@ -1362,23 +1134,14 @@ void schedule_pending_dividend_balances(database& db, // accounts other than the distribution account (it would be silly to distribute dividends back to // the distribution account) share_type total_balance_of_dividend_asset; - if(db.head_block_time() >= HARDFORK_GPOS_TIME && dividend_holder_asset_obj.symbol == GRAPHENE_SYMBOL) { // only core - for (const vesting_balance_object &holder_balance_object : boost::make_iterator_range(vesting_balances_begin, - vesting_balances_end)) - if (holder_balance_object.owner != dividend_data.dividend_distribution_account) { - total_balance_of_dividend_asset += holder_balance_object.balance.amount; - } - } - else { - for (const account_balance_object &holder_balance_object : boost::make_iterator_range(holder_balances_begin, - holder_balances_end)) - if (holder_balance_object.owner != dividend_data.dividend_distribution_account) { - total_balance_of_dividend_asset += holder_balance_object.balance; - auto itr = vesting_amounts.find(holder_balance_object.owner); - if (itr != vesting_amounts.end()) - total_balance_of_dividend_asset += itr->second; - } - } + for (const account_balance_object& holder_balance_object : boost::make_iterator_range(holder_balances_begin, holder_balances_end)) + if (holder_balance_object.owner != dividend_data.dividend_distribution_account) + { + total_balance_of_dividend_asset += holder_balance_object.balance; + auto itr = vesting_amounts.find(holder_balance_object.owner); + if (itr != vesting_amounts.end()) + total_balance_of_dividend_asset += itr->second; + } // loop through all of the assets currently or previously held in the distribution account while (current_distribution_account_balance_iter != current_distribution_account_balance_range.end() || previous_distribution_account_balance_iter != previous_distribution_account_balance_range.second) @@ -1502,68 +1265,46 @@ void schedule_pending_dividend_balances(database& db, ("total", total_balance_of_dividend_asset)); share_type remaining_amount_to_distribute = delta_balance; - if(db.head_block_time() >= HARDFORK_GPOS_TIME && dividend_holder_asset_obj.symbol == GRAPHENE_SYMBOL) { // core only - // credit each account with their portion, don't send any back to the dividend distribution account - for (const vesting_balance_object &holder_balance_object : boost::make_iterator_range( - vesting_balances_begin, vesting_balances_end)) { - if (holder_balance_object.owner == dividend_data.dividend_distribution_account) continue; + // credit each account with their portion, don't send any back to the dividend distribution account + for (const account_balance_object& holder_balance_object : boost::make_iterator_range(holder_balances_begin, holder_balances_end)) + { + if (holder_balance_object.owner == dividend_data.dividend_distribution_account) continue; - auto vesting_factor = db.calculate_vesting_factor(holder_balance_object.owner(db)); + auto holder_balance = holder_balance_object.balance; - auto holder_balance = holder_balance_object.balance; + auto itr = vesting_amounts.find(holder_balance_object.owner); + if (itr != vesting_amounts.end()) + holder_balance += itr->second; - fc::uint128_t amount_to_credit(delta_balance.value); - amount_to_credit *= holder_balance.amount.value; - amount_to_credit /= total_balance_of_dividend_asset.value; - share_type full_shares_to_credit((int64_t) amount_to_credit.to_uint64()); - share_type shares_to_credit = (uint64_t) floor(full_shares_to_credit.value * vesting_factor); + fc::uint128_t amount_to_credit(delta_balance.value); + amount_to_credit *= holder_balance.value; + amount_to_credit /= total_balance_of_dividend_asset.value; + share_type shares_to_credit((int64_t)amount_to_credit.to_uint64()); + if (shares_to_credit.value) + { + wdump((delta_balance.value)(holder_balance)(total_balance_of_dividend_asset)); - if (shares_to_credit < full_shares_to_credit) { - // Todo: sending results of decay to committee account, need to change to specified account - dlog("Crediting committee_account with ${amount}", - ("amount", asset(full_shares_to_credit - shares_to_credit, payout_asset_type))); - db.adjust_balance(dividend_data.dividend_distribution_account, - -asset(full_shares_to_credit - shares_to_credit, payout_asset_type)); - db.adjust_balance(account_id_type(0), asset(full_shares_to_credit - shares_to_credit, payout_asset_type)); - } + remaining_amount_to_distribute -= shares_to_credit; - remaining_amount_to_distribute = credit_account(db, - holder_balance_object.owner, - holder_balance_object.owner(db).name, - remaining_amount_to_distribute, - shares_to_credit, - payout_asset_type, - pending_payout_balance_index, - dividend_holder_asset_obj.id); + dlog("Crediting account ${account} with ${amount}", + ("account", holder_balance_object.owner(db).name) + ("amount", asset(shares_to_credit, payout_asset_type))); + auto pending_payout_iter = + pending_payout_balance_index.indices().get().find(boost::make_tuple(dividend_holder_asset_obj.id, payout_asset_type, holder_balance_object.owner)); + if (pending_payout_iter == pending_payout_balance_index.indices().get().end()) + db.create( [&]( pending_dividend_payout_balance_for_holder_object& obj ){ + obj.owner = holder_balance_object.owner; + obj.dividend_holder_asset_type = dividend_holder_asset_obj.id; + obj.dividend_payout_asset_type = payout_asset_type; + obj.pending_balance = shares_to_credit; + }); + else + db.modify(*pending_payout_iter, [&]( pending_dividend_payout_balance_for_holder_object& pending_balance ){ + pending_balance.pending_balance += shares_to_credit; + }); } } - else { - // credit each account with their portion, don't send any back to the dividend distribution account - for (const account_balance_object &holder_balance_object : boost::make_iterator_range( - holder_balances_begin, holder_balances_end)) { - if (holder_balance_object.owner == dividend_data.dividend_distribution_account) continue; - auto holder_balance = holder_balance_object.balance; - - auto itr = vesting_amounts.find(holder_balance_object.owner); - if (itr != vesting_amounts.end()) - holder_balance += itr->second; - - fc::uint128_t amount_to_credit(delta_balance.value); - amount_to_credit *= holder_balance.value; - amount_to_credit /= total_balance_of_dividend_asset.value; - share_type shares_to_credit((int64_t) amount_to_credit.to_uint64()); - - remaining_amount_to_distribute = credit_account(db, - holder_balance_object.owner, - holder_balance_object.owner(db).name, - remaining_amount_to_distribute, - shares_to_credit, - payout_asset_type, - pending_payout_balance_index, - dividend_holder_asset_obj.id); - } - } for (const auto& pending_payout : pending_payout_balance_index.indices()) if (pending_payout.pending_balance.value) dlog("Pending payout: ${account_name} -> ${amount}", @@ -1826,8 +1567,6 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g process_dividend_assets(*this); - rolling_period_start(*this); - struct vote_tally_helper { database& d; const global_property_object& props; @@ -1842,28 +1581,24 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g d._son_count_histogram_buffer.resize(props.parameters.maximum_son_count / 2 + 1); d._total_voting_stake = 0; - auto balance_type = vesting_balance_type::normal; - if(d.head_block_time() >= HARDFORK_GPOS_TIME) - balance_type = vesting_balance_type::gpos; - const vesting_balance_index& vesting_index = d.get_index_type(); #ifdef USE_VESTING_OBJECT_BY_ASSET_BALANCE_INDEX auto vesting_balances_begin = - vesting_index.indices().get().lower_bound(boost::make_tuple(asset_id_type(), balance_type)); + vesting_index.indices().get().lower_bound(boost::make_tuple(asset_id_type())); auto vesting_balances_end = - vesting_index.indices().get().upper_bound(boost::make_tuple(asset_id_type(), balance_type, share_type())); + vesting_index.indices().get().upper_bound(boost::make_tuple(asset_id_type(), share_type())); for (const vesting_balance_object& vesting_balance_obj : boost::make_iterator_range(vesting_balances_begin, vesting_balances_end)) { vesting_amounts[vesting_balance_obj.owner] += vesting_balance_obj.balance.amount; - dlog("Vesting balance for account: ${owner}, amount: ${amount}", - ("owner", vesting_balance_obj.owner(d).name) - ("amount", vesting_balance_obj.balance.amount)); + //dlog("Vesting balance for account: ${owner}, amount: ${amount}", + // ("owner", vesting_balance_obj.owner(d).name) + // ("amount", vesting_balance_obj.balance.amount)); } #else const auto& vesting_balances = vesting_index.indices().get(); for (const vesting_balance_object& vesting_balance_obj : vesting_balances) { - if (vesting_balance_obj.balance.asset_id == asset_id_type() && vesting_balance_obj.balance.amount && vesting_balance_obj.balance_type == balance_type) + if (vesting_balance_obj.balance.asset_id == asset_id_type() && vesting_balance_obj.balance.amount) { vesting_amounts[vesting_balance_obj.owner] += vesting_balance_obj.balance.amount; dlog("Vesting balance for account: ${owner}, amount: ${amount}", @@ -1874,8 +1609,7 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g #endif } - void operator()( const account_object& stake_account, const account_statistics_object& stats ) - { + void operator()(const account_object& stake_account) { if( props.parameters.count_non_member_votes || stake_account.is_member(d.head_block_time()) ) { // There may be a difference between the account whose stake is voting and the one specifying opinions. @@ -1892,35 +1626,13 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g const account_object& opinion_account = *opinion_account_ptr; const auto& stats = stake_account.statistics(d); - uint64_t voting_stake = 0; + uint64_t voting_stake = stats.total_core_in_orders.value + + (stake_account.cashback_vb.valid() ? (*stake_account.cashback_vb)(d).balance.amount.value: 0) + + d.get_balance(stake_account.get_id(), asset_id_type()).amount.value; auto itr = vesting_amounts.find(stake_account.id); if (itr != vesting_amounts.end()) voting_stake += itr->second.value; - - if(d.head_block_time() >= HARDFORK_GPOS_TIME) - { - if (itr == vesting_amounts.end() && d.head_block_time() >= (HARDFORK_GPOS_TIME + props.parameters.gpos_subperiod()/2)) - return; - - auto vesting_factor = d.calculate_vesting_factor(stake_account); - voting_stake = (uint64_t)floor(voting_stake * vesting_factor); - - //Include votes(based on stake) for the period of gpos_subperiod()/2 as system has zero votes on GPOS activation - if(d.head_block_time() < (HARDFORK_GPOS_TIME + props.parameters.gpos_subperiod()/2)) - { - voting_stake += stats.total_core_in_orders.value - + (stake_account.cashback_vb.valid() ? (*stake_account.cashback_vb)(d).balance.amount.value : 0) - + d.get_balance(stake_account.get_id(), asset_id_type()).amount.value; - } - } - else - { - voting_stake += stats.total_core_in_orders.value - + (stake_account.cashback_vb.valid() ? (*stake_account.cashback_vb)(d).balance.amount.value : 0) - + d.get_balance(stake_account.get_id(), asset_id_type()).amount.value; - } - for( vote_id_type id : opinion_account.options.votes ) { uint32_t offset = id.instance(); @@ -1968,8 +1680,23 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g } } } tally_helper(*this, gpo); - - perform_account_maintenance( tally_helper ); + struct process_fees_helper { + database& d; + const global_property_object& props; + + process_fees_helper(database& d, const global_property_object& gpo) + : d(d), props(gpo) {} + + void operator()(const account_object& a) { + a.statistics(d).process_fees(a, d); + } + } fee_helper(*this, gpo); + + perform_account_maintenance(std::tie( + tally_helper, + fee_helper + )); + struct clear_canary { clear_canary(vector& target): target(target){} ~clear_canary() { target.clear(); } @@ -1987,10 +1714,9 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g update_active_sons(); update_worker_votes(); - const dynamic_global_property_object& dgpo = get_dynamic_global_properties(); - - modify(gpo, [&dgpo](global_property_object& p) { + modify(gpo, [this](global_property_object& p) { // Remove scaling of account registration fee + const auto& dgpo = get_dynamic_global_properties(); p.parameters.current_fees->get().basic_fee >>= p.parameters.account_fee_scale_bitshifts * (dgpo.accounts_registered_this_interval / p.parameters.accounts_per_fee_scale); @@ -2006,20 +1732,12 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g p.pending_parameters->extensions.value.permitted_betting_odds_increments = p.parameters.extensions.value.permitted_betting_odds_increments; if( !p.pending_parameters->extensions.value.live_betting_delay_time.valid() ) p.pending_parameters->extensions.value.live_betting_delay_time = p.parameters.extensions.value.live_betting_delay_time; - if( !p.pending_parameters->extensions.value.gpos_period_start.valid() ) - p.pending_parameters->extensions.value.gpos_period_start = p.parameters.extensions.value.gpos_period_start; - if( !p.pending_parameters->extensions.value.gpos_period.valid() ) - p.pending_parameters->extensions.value.gpos_period = p.parameters.extensions.value.gpos_period; - if( !p.pending_parameters->extensions.value.gpos_subperiod.valid() ) - p.pending_parameters->extensions.value.gpos_subperiod = p.parameters.extensions.value.gpos_subperiod; - if( !p.pending_parameters->extensions.value.gpos_vesting_lockin_period.valid() ) - p.pending_parameters->extensions.value.gpos_vesting_lockin_period = p.parameters.extensions.value.gpos_vesting_lockin_period; p.parameters = std::move(*p.pending_parameters); p.pending_parameters.reset(); } }); - auto next_maintenance_time = dgpo.next_maintenance_time; + auto next_maintenance_time = get(dynamic_global_property_id_type()).next_maintenance_time; auto maintenance_interval = gpo.parameters.maintenance_interval; if( next_maintenance_time <= next_block.timestamp ) @@ -2049,6 +1767,8 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g } } + const dynamic_global_property_object& dgpo = get_dynamic_global_properties(); + if( (dgpo.next_maintenance_time < HARDFORK_613_TIME) && (next_maintenance_time >= HARDFORK_613_TIME) ) deprecate_annual_members(*this); diff --git a/libraries/chain/db_management.cpp b/libraries/chain/db_management.cpp index 9560aae3..f6d164d2 100644 --- a/libraries/chain/db_management.cpp +++ b/libraries/chain/db_management.cpp @@ -24,9 +24,6 @@ #include -#include -#include -#include #include #include @@ -180,7 +177,7 @@ void database::wipe(const fc::path& data_dir, bool include_blocks) { ilog("Wiping database", ("include_blocks", include_blocks)); if (_opened) { - close(false); + close(); } object_database::wipe(data_dir); if( include_blocks ) @@ -218,15 +215,6 @@ void database::open( if( !find(global_property_id_type()) ) init_genesis(genesis_loader()); - else - { - _p_core_asset_obj = &get( asset_id_type() ); - _p_core_dynamic_data_obj = &get( asset_dynamic_data_id_type() ); - _p_global_prop_obj = &get( global_property_id_type() ); - _p_chain_property_obj = &get( chain_property_id_type() ); - _p_dyn_global_prop_obj = &get( dynamic_global_property_id_type() ); - _p_witness_schedule_obj = &get( witness_schedule_id_type() ); - } fc::optional last_block = _block_id_to_block.last_id(); if( last_block.valid() ) diff --git a/libraries/chain/db_market.cpp b/libraries/chain/db_market.cpp index ad888532..59f77762 100644 --- a/libraries/chain/db_market.cpp +++ b/libraries/chain/db_market.cpp @@ -426,16 +426,14 @@ bool database::fill_order(const force_settlement_object& settle, const asset& pa * * @return true if a margin call was executed. */ -bool database::check_call_orders( const asset_object& mia, bool enable_black_swan, bool for_new_limit_order, - const asset_bitasset_data_object* bitasset_ptr ) +bool database::check_call_orders(const asset_object& mia, bool enable_black_swan) { try { if( !mia.is_market_issued() ) return false; - const asset_bitasset_data_object& bitasset = ( bitasset_ptr ? *bitasset_ptr : mia.bitasset_data(*this) ); - - if( check_for_blackswan( mia, enable_black_swan, &bitasset ) ) + if( check_for_blackswan( mia, enable_black_swan ) ) return false; + const asset_bitasset_data_object& bitasset = mia.bitasset_data(*this); if( bitasset.is_prediction_market ) return false; if( bitasset.current_feed.settlement_price.is_null() ) return false; @@ -466,12 +464,7 @@ bool database::check_call_orders( const asset_object& mia, bool enable_black_swa bool filled_limit = false; bool margin_called = false; - auto head_time = head_block_time(); - auto head_num = head_block_num(); - - bool after_hardfork_436 = ( head_time > HARDFORK_436_TIME ); - - while( !check_for_blackswan( mia, enable_black_swan, &bitasset ) && call_itr != call_end ) + while( !check_for_blackswan( mia, enable_black_swan ) && call_itr != call_end ) { bool filled_call = false; price match_price; @@ -488,7 +481,7 @@ bool database::check_call_orders( const asset_object& mia, bool enable_black_swa // would be margin called, but there is no matching order #436 bool feed_protected = ( bitasset.current_feed.settlement_price > ~call_itr->call_price ); - if( feed_protected && after_hardfork_436 ) + if( feed_protected && (head_block_time() > HARDFORK_436_TIME) ) return margin_called; // would be margin called, but there is no matching order @@ -513,8 +506,7 @@ bool database::check_call_orders( const asset_object& mia, bool enable_black_swa if( usd_to_buy * match_price > call_itr->get_collateral() ) { - elog( "black swan detected on asset ${symbol} (${id}) at block ${b}", - ("id",mia.id)("symbol",mia.symbol)("b",head_num) ); + elog( "black swan detected" ); edump((enable_black_swan)); FC_ASSERT( enable_black_swan ); globally_settle_asset(mia, bitasset.current_feed.settlement_price ); diff --git a/libraries/chain/db_notify.cpp b/libraries/chain/db_notify.cpp index a762fe2c..6cf7c7b0 100644 --- a/libraries/chain/db_notify.cpp +++ b/libraries/chain/db_notify.cpp @@ -33,14 +33,6 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include - using namespace fc; using namespace graphene::chain; @@ -349,13 +341,13 @@ struct get_impacted_account_visitor } }; -void graphene::chain::operation_get_impacted_accounts( const operation& op, flat_set& result ) +void operation_get_impacted_accounts( const operation& op, flat_set& result ) { get_impacted_account_visitor vtor = get_impacted_account_visitor( result ); op.visit( vtor ); } -void graphene::chain::transaction_get_impacted_accounts( const transaction& tx, flat_set& result ) +void transaction_get_impacted_accounts( const transaction& tx, flat_set& result ) { for( const auto& op : tx.operations ) operation_get_impacted_accounts( op, result ); @@ -511,16 +503,6 @@ void get_relevant_accounts( const object* obj, flat_set& accoun namespace graphene { namespace chain { -void database::notify_applied_block( const signed_block& block ) -{ - GRAPHENE_TRY_NOTIFY( applied_block, block ) -} - -void database::notify_on_pending_transaction( const signed_transaction& tx ) -{ - GRAPHENE_TRY_NOTIFY( on_pending_transaction, tx ) -} - void database::notify_changed_objects() { try { if( _undo_db.enabled() ) @@ -540,7 +522,7 @@ void database::notify_changed_objects() get_relevant_accounts(obj, new_accounts_impacted); } - GRAPHENE_TRY_NOTIFY( new_objects, new_ids, new_accounts_impacted) + new_objects(new_ids, new_accounts_impacted); } // Changed @@ -554,7 +536,7 @@ void database::notify_changed_objects() get_relevant_accounts(item.second.get(), changed_accounts_impacted); } - GRAPHENE_TRY_NOTIFY( changed_objects, changed_ids, changed_accounts_impacted) + changed_objects(changed_ids, changed_accounts_impacted); } // Removed @@ -571,7 +553,7 @@ void database::notify_changed_objects() get_relevant_accounts(obj, removed_accounts_impacted); } - GRAPHENE_TRY_NOTIFY( removed_objects, removed_ids, removed, removed_accounts_impacted) + removed_objects(removed_ids, removed, removed_accounts_impacted); } } } FC_CAPTURE_AND_LOG( (0) ) } diff --git a/libraries/chain/db_update.cpp b/libraries/chain/db_update.cpp index c89b4bd5..ed440d82 100644 --- a/libraries/chain/db_update.cpp +++ b/libraries/chain/db_update.cpp @@ -45,7 +45,7 @@ namespace graphene { namespace chain { void database::update_global_dynamic_data( const signed_block& b, const uint32_t missed_blocks ) { - const dynamic_global_property_object& _dgp = get_dynamic_global_properties(); + const dynamic_global_property_object& _dgp = dynamic_global_property_id_type(0)(*this); const global_property_object& gpo = get_global_properties(); // dynamic global properties updating @@ -121,7 +121,6 @@ void database::update_last_irreversible_block() const global_property_object& gpo = get_global_properties(); const dynamic_global_property_object& dpo = get_dynamic_global_properties(); - // TODO for better performance, move this to db_maint, because only need to do it once per maintenance interval vector< const witness_object* > wit_objs; wit_objs.reserve( gpo.active_witnesses.size() ); for( const witness_id_type& wid : gpo.active_witnesses ) @@ -239,12 +238,11 @@ void database::clear_expired_proposals() * * A black swan occurs if MAX(HB,SP) <= LC */ -bool database::check_for_blackswan( const asset_object& mia, bool enable_black_swan, - const asset_bitasset_data_object* bitasset_ptr ) +bool database::check_for_blackswan( const asset_object& mia, bool enable_black_swan ) { if( !mia.is_market_issued() ) return false; - const asset_bitasset_data_object& bitasset = ( bitasset_ptr ? *bitasset_ptr : mia.bitasset_data(*this) ); + const asset_bitasset_data_object& bitasset = mia.bitasset_data(*this); if( bitasset.has_settlement() ) return true; // already force settled auto settle_price = bitasset.current_feed.settlement_price; if( settle_price.is_null() ) return false; // no feed @@ -469,84 +467,32 @@ void database::clear_expired_orders() void database::update_expired_feeds() { - const auto head_time = head_block_time(); - bool after_hardfork_615 = ( head_time >= HARDFORK_615_TIME ); - - const auto& idx = get_index_type().indices().get(); - auto itr = idx.begin(); - while( itr != idx.end() && itr->feed_is_expired( head_time ) ) + auto& asset_idx = get_index_type().indices().get(); + auto itr = asset_idx.lower_bound( true /** market issued */ ); + while( itr != asset_idx.end() ) { - const asset_bitasset_data_object& b = *itr; - ++itr; // not always process begin() because old code skipped updating some assets before hf 615 - bool update_cer = false; // for better performance, to only update bitasset once, also check CER in this function - const asset_object* asset_ptr = nullptr; - // update feeds, check margin calls - if( after_hardfork_615 || b.feed_is_expired_before_hardfork_615( head_time ) ) + const asset_object& a = *itr; + ++itr; + assert( a.is_market_issued() ); + + const asset_bitasset_data_object& b = a.bitasset_data(*this); + bool feed_is_expired; + if( head_block_time() < HARDFORK_615_TIME ) + feed_is_expired = b.feed_is_expired_before_hardfork_615( head_block_time() ); + else + feed_is_expired = b.feed_is_expired( head_block_time() ); + if( feed_is_expired ) { - auto old_median_feed = b.current_feed; - modify( b, [head_time,&update_cer]( asset_bitasset_data_object& abdo ) - { - abdo.update_median_feeds( head_time ); - if( abdo.need_to_update_cer() ) - { - update_cer = true; - abdo.asset_cer_updated = false; - abdo.feed_cer_updated = false; - } + modify(b, [this](asset_bitasset_data_object& a) { + a.update_median_feeds(head_block_time()); }); - if( !b.current_feed.settlement_price.is_null() && !( b.current_feed == old_median_feed ) ) // `==` check is safe here - { - asset_ptr = &b.asset_id( *this ); - check_call_orders( *asset_ptr, true, false, &b ); - } + check_call_orders(b.current_feed.settlement_price.base.asset_id(*this)); } - // update CER - if( update_cer ) - { - if( !asset_ptr ) - asset_ptr = &b.asset_id( *this ); - if( asset_ptr->options.core_exchange_rate != b.current_feed.core_exchange_rate ) - { - modify( *asset_ptr, [&b]( asset_object& ao ) - { - ao.options.core_exchange_rate = b.current_feed.core_exchange_rate; - }); - } - } - } // for each asset whose feed is expired - - // process assets affected by bitshares-core issue 453 before hard fork 615 - if( !after_hardfork_615 ) - { - for( asset_id_type a : _issue_453_affected_assets ) - { - check_call_orders( a(*this) ); - } - } -} - -void database::update_core_exchange_rates() -{ - const auto& idx = get_index_type().indices().get(); - if( idx.begin() != idx.end() ) - { - for( auto itr = idx.rbegin(); itr->need_to_update_cer(); itr = idx.rbegin() ) - { - const asset_bitasset_data_object& b = *itr; - const asset_object& a = b.asset_id( *this ); - if( a.options.core_exchange_rate != b.current_feed.core_exchange_rate ) - { - modify( a, [&b]( asset_object& ao ) - { - ao.options.core_exchange_rate = b.current_feed.core_exchange_rate; - }); - } - modify( b, []( asset_bitasset_data_object& abdo ) - { - abdo.asset_cer_updated = false; - abdo.feed_cer_updated = false; + if( !b.current_feed.core_exchange_rate.is_null() && + a.options.core_exchange_rate != b.current_feed.core_exchange_rate ) + modify(a, [&b](asset_object& a) { + a.options.core_exchange_rate = b.current_feed.core_exchange_rate; }); - } } } diff --git a/libraries/chain/db_witness_schedule.cpp b/libraries/chain/db_witness_schedule.cpp index 084c8e1d..31caad4b 100644 --- a/libraries/chain/db_witness_schedule.cpp +++ b/libraries/chain/db_witness_schedule.cpp @@ -40,14 +40,14 @@ witness_id_type database::get_scheduled_witness( uint32_t slot_num )const if (gpo.parameters.witness_schedule_algorithm == GRAPHENE_WITNESS_SHUFFLED_ALGORITHM) { const dynamic_global_property_object& dpo = get_dynamic_global_properties(); - const witness_schedule_object& wso = get_witness_schedule_object();; + const witness_schedule_object& wso = witness_schedule_id_type()(*this); uint64_t current_aslot = dpo.current_aslot + slot_num; return wso.current_shuffled_witnesses[ current_aslot % wso.current_shuffled_witnesses.size() ]; } if (gpo.parameters.witness_schedule_algorithm == GRAPHENE_WITNESS_SCHEDULED_ALGORITHM && slot_num != 0 ) { - const witness_schedule_object& wso = get_witness_schedule_object(); + const witness_schedule_object& wso = witness_schedule_id_type()(*this); // ask the near scheduler who goes in the given slot bool slot_is_near = wso.scheduler.get_slot(slot_num-1, wid); if(! slot_is_near) @@ -156,7 +156,7 @@ uint32_t database::get_slot_at_time(fc::time_point_sec when)const void database::update_witness_schedule() { - const witness_schedule_object& wso = get_witness_schedule_object(); + const witness_schedule_object& wso = witness_schedule_id_type()(*this); const global_property_object& gpo = get_global_properties(); if( head_block_num() % gpo.active_witnesses.size() == 0 ) @@ -226,7 +226,7 @@ void database::update_son_schedule() vector database::get_near_witness_schedule()const { - const witness_schedule_object& wso = get_witness_schedule_object(); + const witness_schedule_object& wso = witness_schedule_id_type()(*this); vector result; result.reserve(wso.scheduler.size()); @@ -243,7 +243,7 @@ void database::update_witness_schedule(const signed_block& next_block) { auto start = fc::time_point::now(); const global_property_object& gpo = get_global_properties(); - const witness_schedule_object& wso = get_witness_schedule_object(); + const witness_schedule_object& wso = get(witness_schedule_id_type()); uint32_t schedule_needs_filled = gpo.active_witnesses.size(); uint32_t schedule_slot = get_slot_at_time(next_block.timestamp); @@ -395,7 +395,7 @@ uint32_t database::witness_participation_rate()const } if (gpo.parameters.witness_schedule_algorithm == GRAPHENE_WITNESS_SCHEDULED_ALGORITHM) { - const witness_schedule_object& wso = get_witness_schedule_object(); + const witness_schedule_object& wso = get(witness_schedule_id_type()); return uint64_t(GRAPHENE_100_PERCENT) * wso.recent_slots_filled.popcount() / 128; } return 0; diff --git a/libraries/chain/genesis_state.cpp b/libraries/chain/genesis_state.cpp index 53311012..a278b680 100644 --- a/libraries/chain/genesis_state.cpp +++ b/libraries/chain/genesis_state.cpp @@ -36,72 +36,3 @@ chain_id_type genesis_state_type::compute_chain_id() const } } } // graphene::chain - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_account_type, BOOST_PP_SEQ_NIL, (name)(owner_key)(active_key)(is_lifetime_member)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_asset_type, BOOST_PP_SEQ_NIL, - (symbol)(issuer_name)(description)(precision)(max_supply)(accumulated_fees)(is_bitasset)(collateral_records)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position, BOOST_PP_SEQ_NIL, - (owner)(collateral)(debt)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_balance_type, BOOST_PP_SEQ_NIL, - (owner)(asset_symbol)(amount)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_vesting_balance_type, BOOST_PP_SEQ_NIL, - (owner)(asset_symbol)(amount)(begin_timestamp)(vesting_cliff_seconds)(vesting_duration_seconds)(begin_balance)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_witness_type, BOOST_PP_SEQ_NIL, (owner_name)(block_signing_key)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_committee_member_type, BOOST_PP_SEQ_NIL, (owner_name)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_worker_type, BOOST_PP_SEQ_NIL, (owner_name)(daily_pay)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority, BOOST_PP_SEQ_NIL, - (weight_threshold) - (account_auths) - (key_auths) - (address_auths)) -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy, BOOST_PP_SEQ_NIL, - (vesting_seconds) - (coin_seconds_earned) - (start_claim) - (coin_seconds_earned_last_update)) -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy, BOOST_PP_SEQ_NIL, - (begin_timestamp) - (vesting_cliff_seconds) - (vesting_duration_seconds) - (begin_balance)) -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance, BOOST_PP_SEQ_NIL, - (asset_symbol) - (amount) - (policy_type) - (policy)) -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type, BOOST_PP_SEQ_NIL, - (name) - (owner_authority) - (active_authority) - (core_balance) - (vesting_balances)) - -FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type, BOOST_PP_SEQ_NIL, - (initial_timestamp)(max_core_supply)(initial_parameters)(initial_bts_accounts)(initial_accounts)(initial_assets)(initial_balances) - (initial_vesting_balances)(initial_active_witnesses)(initial_witness_candidates) - (initial_committee_candidates)(initial_worker_candidates) - (initial_chain_id) - (immutable_parameters)) - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_account_type) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_asset_type) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_balance_type) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_vesting_balance_type) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_witness_type) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_committee_member_type) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_worker_type) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type) diff --git a/libraries/chain/hardfork.d/GPOS.hf b/libraries/chain/hardfork.d/GPOS.hf deleted file mode 100644 index 8e93f80f..00000000 --- a/libraries/chain/hardfork.d/GPOS.hf +++ /dev/null @@ -1,4 +0,0 @@ -// GPOS HARDFORK Monday, 31 Dec 2019 00:00:00 GMT -#ifndef HARDFORK_GPOS_TIME -#define HARDFORK_GPOS_TIME (fc::time_point_sec( 1577750400 )) -#endif diff --git a/libraries/chain/include/graphene/chain/account_object.hpp b/libraries/chain/include/graphene/chain/account_object.hpp index 5f24adeb..4e940326 100644 --- a/libraries/chain/include/graphene/chain/account_object.hpp +++ b/libraries/chain/include/graphene/chain/account_object.hpp @@ -22,9 +22,8 @@ * THE SOFTWARE. */ #pragma once -#include +#include #include -#include #include namespace graphene { namespace chain { @@ -47,8 +46,6 @@ namespace graphene { namespace chain { account_id_type owner; - string name; ///< redundantly store account name here for better maintenance performance - /** * Keep the most recent operation as a root pointer to a linked list of the transaction history. */ @@ -65,19 +62,6 @@ namespace graphene { namespace chain { */ share_type total_core_in_orders; - share_type core_in_balance = 0; ///< redundantly store core balance here for better maintenance performance - - bool has_cashback_vb = false; ///< redundantly store this for better maintenance performance - - bool is_voting = false; ///< redundately store whether this account is voting for better maintenance performance - - - /// Whether this account owns some CORE asset and is voting - inline bool has_some_core_voting() const - { - return is_voting && ( total_core_in_orders > 0 || core_in_balance > 0 || has_cashback_vb ); - } - /** * Tracks the total fees paid by this account for the purpose of calculating bulk discounts. */ @@ -103,12 +87,6 @@ namespace graphene { namespace chain { */ time_point_sec last_vote_time; - /// Whether this account has pending fees, no matter vested or not - inline bool has_pending_fees() const { return pending_fees > 0 || pending_vested_fees > 0; } - - /// Whether need to process this account during the maintenance interval - inline bool need_maintenance() const { return has_some_core_voting() || has_pending_fees(); } - /// @brief Split up and pay out @ref pending_fees and @ref pending_vested_fees void process_fees(const account_object& a, database& d) const; @@ -134,7 +112,6 @@ namespace graphene { namespace chain { account_id_type owner; asset_id_type asset_type; share_type balance; - bool maintenance_flag = false; ///< Whether need to process this balance object in maintenance interval asset get_balance()const { return asset(balance, asset_type); } void adjust_balance(const asset& delta); @@ -411,9 +388,6 @@ namespace graphene { namespace chain { }; struct by_asset_balance; - struct by_maintenance_flag; - struct by_account_asset; - /** * @ingroup object_index */ @@ -421,15 +395,6 @@ namespace graphene { namespace chain { account_balance_object, indexed_by< ordered_unique< tag, member< object, object_id_type, &object::id > >, - ordered_non_unique< tag, - member< account_balance_object, bool, &account_balance_object::maintenance_flag > >, - ordered_unique< tag, - composite_key< - account_balance_object, - member, - member - > - >, ordered_unique< tag, composite_key< account_balance_object, @@ -469,6 +434,26 @@ namespace graphene { namespace chain { */ typedef generic_index account_index; + struct by_owner; + struct by_maintenance_seq; + + /** + * @ingroup object_index + */ + typedef multi_index_container< + account_statistics_object, + indexed_by< + ordered_unique< tag, member< object, object_id_type, &object::id > >, + ordered_unique< tag, + member< account_statistics_object, account_id_type, &account_statistics_object::owner > > + > + > account_stats_multi_index_type; + + /** + * @ingroup object_index + */ + typedef generic_index account_stats_index; + struct by_dividend_payout_account{}; // use when calculating pending payouts struct by_dividend_account_payout{}; // use when doing actual payouts struct by_account_dividend_payout{}; // use in get_full_accounts() @@ -512,33 +497,6 @@ namespace graphene { namespace chain { */ typedef generic_index pending_dividend_payout_balance_for_holder_object_index; - struct by_owner; - struct by_maintenance_seq; - - /** - * @ingroup object_index - */ - typedef multi_index_container< - account_statistics_object, - indexed_by< - ordered_unique< tag, member< object, object_id_type, &object::id > >, - ordered_unique< tag, - member< account_statistics_object, account_id_type, &account_statistics_object::owner > >, - ordered_unique< tag, - composite_key< - account_statistics_object, - const_mem_fun, - member - > - > - > - > account_stats_multi_index_type; - - /** - * @ingroup object_index - */ - typedef generic_index account_stats_index; - }} FC_REFLECT_DERIVED( graphene::chain::account_object, @@ -555,17 +513,14 @@ FC_REFLECT_DERIVED( graphene::chain::account_object, FC_REFLECT_DERIVED( graphene::chain::account_balance_object, (graphene::db::object), - (owner)(asset_type)(balance)(maintenance_flag) ) + (owner)(asset_type)(balance) ) FC_REFLECT_DERIVED( graphene::chain::account_statistics_object, (graphene::chain::object), - (owner)(name) + (owner) (most_recent_op) (total_ops)(removed_ops) (total_core_in_orders) - (core_in_balance) - (has_cashback_vb) - (is_voting) (lifetime_fees_paid) (pending_fees)(pending_vested_fees) (last_vote_time) @@ -575,7 +530,4 @@ FC_REFLECT_DERIVED( graphene::chain::pending_dividend_payout_balance_for_holder_ (graphene::db::object), (owner)(dividend_holder_asset_type)(dividend_payout_asset_type)(pending_balance) ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_balance_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_statistics_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::pending_dividend_payout_balance_for_holder_object ) + diff --git a/libraries/chain/include/graphene/chain/asset_object.hpp b/libraries/chain/include/graphene/chain/asset_object.hpp index 8978a6d1..f1df4681 100644 --- a/libraries/chain/include/graphene/chain/asset_object.hpp +++ b/libraries/chain/include/graphene/chain/asset_object.hpp @@ -22,11 +22,10 @@ * THE SOFTWARE. */ #pragma once -#include -#include -#include #include #include +#include +#include /** * @defgroup prediction_market Prediction Market @@ -39,10 +38,11 @@ */ namespace graphene { namespace chain { + class account_object; class database; class transaction_evaluation_state; using namespace graphene::db; - + /** * @brief tracks the asset information that changes frequently * @ingroup object @@ -118,9 +118,9 @@ namespace graphene { namespace chain { /// Convert an asset to a textual representation with symbol, i.e. "123.45 USD" string amount_to_pretty_string(const asset &amount)const { FC_ASSERT(amount.asset_id == id); return amount_to_pretty_string(amount.amount); } - + uint32_t get_issuer_num()const - { return issuer.instance.value; } + { return issuer.instance.value; } /// Ticker symbol for this asset, i.e. "USD" string symbol; /// Maximum number of digits after the decimal point (must be <= 12) @@ -138,7 +138,7 @@ namespace graphene { namespace chain { map< account_id_type, vector< uint16_t > > distribute_winners_part( database& db ); void distribute_sweeps_holders_part( database& db ); void end_lottery( database& db ); - + /// Current supply, fee pool, and collected fees are stored in a separate object as they change frequently. asset_dynamic_data_id_type dynamic_asset_data_id; /// Extra data associated with BitAssets. This field is non-null if and only if is_market_issued() returns true @@ -150,7 +150,7 @@ namespace graphene { namespace chain { optional dividend_data_id; asset_id_type get_id()const { return id; } - + void validate()const { // UIAs may not be prediction markets, have force settlement, or global settlements @@ -174,7 +174,7 @@ namespace graphene { namespace chain { { return db.get(dynamic_asset_data_id); } /** - * The total amount of an asset that is reserved for future issuance. + * The total amount of an asset that is reserved for future issuance. */ template share_type reserved( const DB& db )const @@ -193,9 +193,6 @@ namespace graphene { namespace chain { static const uint8_t space_id = implementation_ids; static const uint8_t type_id = impl_asset_bitasset_data_type; - /// The asset this object belong to - asset_id_type asset_id; - /// The tunable options for BitAssets are stored in this field. bitasset_options options; @@ -233,18 +230,6 @@ namespace graphene { namespace chain { share_type settlement_fund; ///@} - /// Track whether core_exchange_rate in corresponding asset_object has updated - bool asset_cer_updated = false; - - /// Track whether core exchange rate in current feed has updated - bool feed_cer_updated = false; - - /// Whether need to update core_exchange_rate in asset_object - bool need_to_update_cer() const - { - return ( ( feed_cer_updated || asset_cer_updated ) && !current_feed.core_exchange_rate.is_null() ); - } - /// The time when @ref current_feed would expire time_point_sec feed_expiration_time()const { @@ -254,7 +239,7 @@ namespace graphene { namespace chain { else return current_feed_publication_time + options.feed_lifetime_sec; } - + bool feed_is_expired_before_hardfork_615(time_point_sec current_time)const { return feed_expiration_time() >= current_time; } bool feed_is_expired(time_point_sec current_time)const @@ -262,34 +247,14 @@ namespace graphene { namespace chain { void update_median_feeds(time_point_sec current_time); }; - // key extractor for short backing asset - struct bitasset_short_backing_asset_extractor - { - typedef asset_id_type result_type; - result_type operator() (const asset_bitasset_data_object& obj) const - { - return obj.options.short_backing_asset; - } - }; - - struct by_short_backing_asset; struct by_feed_expiration; - struct by_cer_update; - typedef multi_index_container< asset_bitasset_data_object, indexed_by< - ordered_unique< tag, member< object, object_id_type, &object::id > >, - ordered_non_unique< tag, bitasset_short_backing_asset_extractor >, - ordered_unique< tag, - composite_key< asset_bitasset_data_object, - const_mem_fun< asset_bitasset_data_object, time_point_sec, &asset_bitasset_data_object::feed_expiration_time >, - member< asset_bitasset_data_object, asset_id_type, &asset_bitasset_data_object::asset_id > - > - >, - ordered_non_unique< tag, - const_mem_fun< asset_bitasset_data_object, bool, &asset_bitasset_data_object::need_to_update_cer > - > + ordered_unique< tag, member< object, object_id_type, &object::id > >, + ordered_non_unique< tag, + const_mem_fun< asset_bitasset_data_object, time_point_sec, &asset_bitasset_data_object::feed_expiration_time > + > > > asset_bitasset_data_object_multi_index_type; //typedef flat_index asset_bitasset_data_index; @@ -378,7 +343,7 @@ namespace graphene { namespace chain { /// This field is reset any time the dividend_asset_options are updated fc::optional last_scheduled_payout_time; - /// The time payouts on this asset were last processed + /// The time payouts on this asset were last processed /// (this should be the maintenance interval at or after last_scheduled_payout_time) /// This can be displayed for the user fc::optional last_payout_time; @@ -405,7 +370,7 @@ namespace graphene { namespace chain { typedef generic_index asset_dividend_data_object_index; - // This tracks the balances in a dividend distribution account at the last time + // This tracks the balances in a dividend distribution account at the last time // pending dividend payouts were calculated (last maintenance interval). // At each maintenance interval, we will compare the current balance to the // balance stored here to see how much was deposited during that interval. @@ -434,9 +399,9 @@ namespace graphene { namespace chain { > > total_distributed_dividend_balance_object_multi_index_type; typedef generic_index total_distributed_dividend_balance_object_index; - - - + + + /** * @ingroup object */ @@ -445,17 +410,17 @@ namespace graphene { namespace chain { public: static const uint8_t space_id = implementation_ids; static const uint8_t type_id = impl_lottery_balance_object_type; - + asset_id_type lottery_id; asset balance; - + asset get_balance()const { return balance; } void adjust_balance(const asset& delta); }; - - + + struct by_owner; - + /** * @ingroup object_index */ @@ -468,13 +433,13 @@ namespace graphene { namespace chain { > > > lottery_balance_index_type; - + /** * @ingroup object_index */ typedef generic_index lottery_balance_index; - - + + class sweeps_vesting_balance_object : public abstract_object { public: @@ -486,7 +451,7 @@ namespace graphene { namespace chain { uint64_t balance; asset_id_type asset_id; time_point_sec last_claim_date; - + uint64_t get_balance()const { return balance; } void adjust_balance(const asset& delta); asset available_for_claim() const { return asset( balance / SWEEPS_VESTING_BALANCE_MULTIPLIER , asset_id ); } @@ -516,7 +481,6 @@ FC_REFLECT_DERIVED( graphene::chain::asset_dynamic_data_object, (graphene::db::o (current_supply)(sweeps_tickets_sold)(confidential_supply)(accumulated_fees)(fee_pool) ) FC_REFLECT_DERIVED( graphene::chain::asset_bitasset_data_object, (graphene::db::object), - (asset_id) (feeds) (current_feed) (current_feed_publication_time) @@ -525,13 +489,11 @@ FC_REFLECT_DERIVED( graphene::chain::asset_bitasset_data_object, (graphene::db:: (is_prediction_market) (settlement_price) (settlement_fund) - (asset_cer_updated) - (feed_cer_updated) ) - + FC_REFLECT_DERIVED( graphene::chain::asset_dividend_data_object, (graphene::db::object), (options) - (last_scheduled_payout_time) + (last_scheduled_payout_time) (last_payout_time ) (last_scheduled_distribution_time) (last_distribution_time) @@ -561,13 +523,3 @@ FC_REFLECT_DERIVED( graphene::chain::lottery_balance_object, (graphene::db::obje FC_REFLECT_DERIVED( graphene::chain::sweeps_vesting_balance_object, (graphene::db::object), (owner)(balance)(asset_id)(last_claim_date) ) - - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_dynamic_data_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_bitasset_data_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_dividend_data_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::total_distributed_dividend_balance_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::lottery_balance_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::sweeps_vesting_balance_object ) - diff --git a/libraries/chain/include/graphene/chain/balance_object.hpp b/libraries/chain/include/graphene/chain/balance_object.hpp index 38a1a649..8d531d0c 100644 --- a/libraries/chain/include/graphene/chain/balance_object.hpp +++ b/libraries/chain/include/graphene/chain/balance_object.hpp @@ -73,5 +73,3 @@ namespace graphene { namespace chain { FC_REFLECT_DERIVED( graphene::chain::balance_object, (graphene::db::object), (owner)(balance)(vesting_policy)(last_claim_date) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::balance_object ) diff --git a/libraries/chain/include/graphene/chain/block_database.hpp b/libraries/chain/include/graphene/chain/block_database.hpp index c5cf5df9..d902cd1b 100644 --- a/libraries/chain/include/graphene/chain/block_database.hpp +++ b/libraries/chain/include/graphene/chain/block_database.hpp @@ -25,8 +25,6 @@ #include #include -#include - namespace graphene { namespace chain { class index_entry; diff --git a/libraries/chain/include/graphene/chain/block_summary_object.hpp b/libraries/chain/include/graphene/chain/block_summary_object.hpp index 9f79d43e..f002c030 100644 --- a/libraries/chain/include/graphene/chain/block_summary_object.hpp +++ b/libraries/chain/include/graphene/chain/block_summary_object.hpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #pragma once -#include #include namespace graphene { namespace chain { @@ -48,7 +47,4 @@ namespace graphene { namespace chain { } } - FC_REFLECT_DERIVED( graphene::chain::block_summary_object, (graphene::db::object), (block_id) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::block_summary_object ) diff --git a/libraries/chain/include/graphene/chain/budget_record_object.hpp b/libraries/chain/include/graphene/chain/budget_record_object.hpp index 007d46a7..63784c71 100644 --- a/libraries/chain/include/graphene/chain/budget_record_object.hpp +++ b/libraries/chain/include/graphene/chain/budget_record_object.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include #include namespace graphene { namespace chain { @@ -55,6 +56,8 @@ struct budget_record share_type supply_delta = 0; }; +class budget_record_object; + class budget_record_object : public graphene::db::abstract_object { public: @@ -67,7 +70,8 @@ class budget_record_object : public graphene::db::abstract_object buyback_index; } } // graphene::chain FC_REFLECT_DERIVED( graphene::chain::buyback_object, (graphene::db::object), (asset_to_buy) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::buyback_object ) diff --git a/libraries/chain/include/graphene/chain/chain_property_object.hpp b/libraries/chain/include/graphene/chain/chain_property_object.hpp index 3c7a77ff..3d2c82a6 100644 --- a/libraries/chain/include/graphene/chain/chain_property_object.hpp +++ b/libraries/chain/include/graphene/chain/chain_property_object.hpp @@ -27,6 +27,8 @@ namespace graphene { namespace chain { +class chain_property_object; + /** * Contains invariants which are set at genesis and never changed. */ @@ -46,5 +48,3 @@ FC_REFLECT_DERIVED( graphene::chain::chain_property_object, (graphene::db::objec (chain_id) (immutable_parameters) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::chain_property_object ) diff --git a/libraries/chain/include/graphene/chain/committee_member_object.hpp b/libraries/chain/include/graphene/chain/committee_member_object.hpp index fe7968d3..7b0d8e75 100644 --- a/libraries/chain/include/graphene/chain/committee_member_object.hpp +++ b/libraries/chain/include/graphene/chain/committee_member_object.hpp @@ -29,6 +29,8 @@ namespace graphene { namespace chain { using namespace graphene::db; + class account_object; + /** * @brief tracks information about a committee_member account. * @ingroup object @@ -71,8 +73,5 @@ namespace graphene { namespace chain { using committee_member_index = generic_index; } } // graphene::chain - FC_REFLECT_DERIVED( graphene::chain::committee_member_object, (graphene::db::object), (committee_member_account)(vote_id)(total_votes)(url) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_object ) diff --git a/libraries/chain/include/graphene/chain/confidential_object.hpp b/libraries/chain/include/graphene/chain/confidential_object.hpp index acdb0ba5..f98e20a9 100644 --- a/libraries/chain/include/graphene/chain/confidential_object.hpp +++ b/libraries/chain/include/graphene/chain/confidential_object.hpp @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -49,6 +50,8 @@ class blinded_balance_object : public graphene::db::abstract_object get_winner_numbers( asset_id_type for_asset, uint32_t count_members, uint8_t count_winners ) const; std::vector get_seeds( asset_id_type for_asset, uint8_t count_winners )const; uint64_t get_random_bits( uint64_t bound ); @@ -307,7 +305,6 @@ namespace graphene { namespace chain { fc::optional create_son_deregister_proposal( son_id_type son_id, account_id_type paying_son ); signed_transaction create_signed_transaction( const fc::ecc::private_key& signing_private_key, const operation& op ); bool is_son_dereg_valid( son_id_type son_id ); - const witness_schedule_object& get_witness_schedule_object()const; time_point_sec head_block_time()const; uint32_t head_block_num()const; @@ -465,8 +462,7 @@ namespace graphene { namespace chain { bool fill_order( const call_order_object& order, const asset& pays, const asset& receives ); bool fill_order( const force_settlement_object& settle, const asset& pays, const asset& receives ); - bool check_call_orders( const asset_object& mia, bool enable_black_swan = true, bool for_new_limit_order = false, - const asset_bitasset_data_object* bitasset_ptr = nullptr ); + bool check_call_orders( const asset_object& mia, bool enable_black_swan = true ); // helpers to fill_order void pay_order( const account_object& receiver, const asset& receives, const asset& pays ); @@ -475,7 +471,7 @@ namespace graphene { namespace chain { asset pay_market_fees( const asset_object& recv_asset, const asset& receives ); - ///@{ + ///@} /** * This method validates transactions without adding it to the pending state. * @return true if the transaction would validate @@ -490,13 +486,9 @@ namespace graphene { namespace chain { /** * @} */ - /// Enable or disable tracking of votes of standby witnesses and committee members - inline void enable_standby_votes_tracking(bool enable) { _track_standby_votes = enable; } protected: //Mark pop_undo() as protected -- we do not want outside calling pop_undo(); it should call pop_block() instead void pop_undo() { object_database::pop_undo(); } - void notify_applied_block( const signed_block& block ); - void notify_on_pending_transaction( const signed_transaction& tx ); void notify_changed_objects(); private: @@ -522,8 +514,6 @@ namespace graphene { namespace chain { const witness_object& validate_block_header( uint32_t skip, const signed_block& next_block )const; const witness_object& _validate_block_header( const signed_block& next_block )const; - void verify_signing_witness( const signed_block& new_block, const fork_item& fork_entry )const; - void update_witnesses( fork_item& fork_entry )const; void create_block_summary(const signed_block& next_block); //////////////////// db_witness_schedule.cpp //////////////////// @@ -538,13 +528,11 @@ namespace graphene { namespace chain { void clear_expired_proposals(); void clear_expired_orders(); void update_expired_feeds(); - void update_core_exchange_rates(); void update_maintenance_flag( bool new_maintenance_flag ); void update_withdraw_permissions(); void update_tournaments(); void update_betting_markets(fc::time_point_sec current_block_time); - bool check_for_blackswan( const asset_object& mia, bool enable_black_swan = true, - const asset_bitasset_data_object* bitasset_ptr = nullptr ); + bool check_for_blackswan( const asset_object& mia, bool enable_black_swan = true ); ///Steps performed only at maintenance intervals ///@{ @@ -566,13 +554,9 @@ namespace graphene { namespace chain { void update_son_statuses( const vector& cur_active_sons, const vector& new_active_sons ); void update_son_wallet( const vector& new_active_sons ); void update_worker_votes(); - - public: - double calculate_vesting_factor(const account_object& stake_account); - uint32_t get_gpos_current_subperiod(); - - template - void perform_account_maintenance(Type tally_helper); + + template + void perform_account_maintenance(std::tuple helpers); ///@} ///@} @@ -612,11 +596,6 @@ namespace graphene { namespace chain { flat_map _checkpoints; node_property_object _node_property_object; - - /// Whether to update votes of standby witnesses and committee members when performing chain maintenance. - /// Set it to true to provide accurate data to API clients, set to false to have better performance. - bool _track_standby_votes = true; - fc::hash_ctr_rng _random_number_generator; bool _slow_replays = false; @@ -635,18 +614,6 @@ namespace graphene { namespace chain { void initialize_db_sidechain(); protected: private: - /// Tracks assets affected by bitshares-core issue #453 before hard fork #615 in one block - flat_set _issue_453_affected_assets; - - /// Pointers to core asset object and global objects who will have immutable addresses after created - ///@{ - const asset_object* _p_core_asset_obj = nullptr; - const asset_dynamic_data_object* _p_core_dynamic_data_obj = nullptr; - const global_property_object* _p_global_prop_obj = nullptr; - const dynamic_global_property_object* _p_dyn_global_prop_obj = nullptr; - const chain_property_object* _p_chain_property_obj = nullptr; - const witness_schedule_object* _p_witness_schedule_obj = nullptr; - ///@} }; namespace detail diff --git a/libraries/chain/include/graphene/chain/exceptions.hpp b/libraries/chain/include/graphene/chain/exceptions.hpp index ee264029..2e07ca26 100644 --- a/libraries/chain/include/graphene/chain/exceptions.hpp +++ b/libraries/chain/include/graphene/chain/exceptions.hpp @@ -65,21 +65,6 @@ msg \ ) -#define GRAPHENE_TRY_NOTIFY( signal, ... ) \ - try \ - { \ - signal( __VA_ARGS__ ); \ - } \ - catch( const graphene::chain::plugin_exception& e ) \ - { \ - elog( "Caught plugin exception: ${e}", ("e", e.to_detail_string() ) ); \ - throw; \ - } \ - catch( ... ) \ - { \ - wlog( "Caught unexpected exception in plugin" ); \ - } - namespace graphene { namespace chain { FC_DECLARE_EXCEPTION( chain_exception, 3000000, "blockchain exception" ) @@ -92,7 +77,6 @@ namespace graphene { namespace chain { FC_DECLARE_DERIVED_EXCEPTION( undo_database_exception, graphene::chain::chain_exception, 3070000, "undo database exception" ) FC_DECLARE_DERIVED_EXCEPTION( unlinkable_block_exception, graphene::chain::chain_exception, 3080000, "unlinkable block" ) FC_DECLARE_DERIVED_EXCEPTION( black_swan_exception, graphene::chain::chain_exception, 3090000, "black swan" ) - FC_DECLARE_DERIVED_EXCEPTION( plugin_exception, graphene::chain::chain_exception, 3100000, "plugin exception" ) FC_DECLARE_DERIVED_EXCEPTION( tx_missing_active_auth, graphene::chain::transaction_exception, 3030001, "missing required active authority" ) FC_DECLARE_DERIVED_EXCEPTION( tx_missing_owner_auth, graphene::chain::transaction_exception, 3030002, "missing required owner authority" ) diff --git a/libraries/chain/include/graphene/chain/fba_object.hpp b/libraries/chain/include/graphene/chain/fba_object.hpp index 3d1e1be0..aec9e9cd 100644 --- a/libraries/chain/include/graphene/chain/fba_object.hpp +++ b/libraries/chain/include/graphene/chain/fba_object.hpp @@ -49,7 +49,4 @@ class fba_accumulator_object : public graphene::db::abstract_object< fba_accumul } } // graphene::chain -FC_REFLECT_DERIVED( graphene::chain::fba_accumulator_object, (graphene::db::object), - (accumulated_fba_fees)(designated_asset) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::fba_accumulator_object ) +FC_REFLECT_DERIVED( graphene::chain::fba_accumulator_object, (graphene::db::object), (accumulated_fba_fees)(designated_asset) ) diff --git a/libraries/chain/include/graphene/chain/fork_database.hpp b/libraries/chain/include/graphene/chain/fork_database.hpp index 4007ca09..8ca95b5e 100644 --- a/libraries/chain/include/graphene/chain/fork_database.hpp +++ b/libraries/chain/include/graphene/chain/fork_database.hpp @@ -51,11 +51,6 @@ namespace graphene { namespace chain { bool invalid = false; block_id_type id; signed_block data; - - // contains witness block signing keys scheduled *after* the block has been applied - shared_ptr< vector< pair< witness_id_type, public_key_type > > > scheduled_witnesses; - uint64_t next_block_aslot = 0; - fc::time_point_sec next_block_time; }; typedef shared_ptr item_ptr; diff --git a/libraries/chain/include/graphene/chain/genesis_state.hpp b/libraries/chain/include/graphene/chain/genesis_state.hpp index b2f76118..ebd153b6 100644 --- a/libraries/chain/include/graphene/chain/genesis_state.hpp +++ b/libraries/chain/include/graphene/chain/genesis_state.hpp @@ -23,7 +23,6 @@ */ #pragma once -#include #include #include #include @@ -170,32 +169,56 @@ struct genesis_state_type { } } // namespace graphene::chain -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_account_type) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_asset_type) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_balance_type) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_vesting_balance_type) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_witness_type) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_committee_member_type) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_worker_type) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type) -FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type) +FC_REFLECT(graphene::chain::genesis_state_type::initial_account_type, (name)(owner_key)(active_key)(is_lifetime_member)) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_account_type) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_asset_type) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_balance_type) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_vesting_balance_type) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_witness_type) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_committee_member_type) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_worker_type) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type) +FC_REFLECT(graphene::chain::genesis_state_type::initial_asset_type, + (symbol)(issuer_name)(description)(precision)(max_supply)(accumulated_fees)(is_bitasset)(collateral_records)) + +FC_REFLECT(graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position, + (owner)(collateral)(debt)) + +FC_REFLECT(graphene::chain::genesis_state_type::initial_balance_type, + (owner)(asset_symbol)(amount)) + +FC_REFLECT(graphene::chain::genesis_state_type::initial_vesting_balance_type, + (owner)(asset_symbol)(amount)(begin_timestamp)(vesting_cliff_seconds)(vesting_duration_seconds)(begin_balance)) + +FC_REFLECT(graphene::chain::genesis_state_type::initial_witness_type, (owner_name)(block_signing_key)) + +FC_REFLECT(graphene::chain::genesis_state_type::initial_committee_member_type, (owner_name)) + +FC_REFLECT(graphene::chain::genesis_state_type::initial_worker_type, (owner_name)(daily_pay)) + +FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority, + (weight_threshold) + (account_auths) + (key_auths) + (address_auths)) +FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy, + (vesting_seconds) + (coin_seconds_earned) + (start_claim) + (coin_seconds_earned_last_update)) +FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy, + (begin_timestamp) + (vesting_cliff_seconds) + (vesting_duration_seconds) + (begin_balance)) +FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance, + (asset_symbol) + (amount) + (policy_type) + (policy)) +FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type, + (name) + (owner_authority) + (active_authority) + (core_balance) + (vesting_balances)) + +FC_REFLECT(graphene::chain::genesis_state_type, + (initial_timestamp)(max_core_supply)(initial_parameters)(initial_bts_accounts)(initial_accounts)(initial_assets)(initial_balances) + (initial_vesting_balances)(initial_active_witnesses)(initial_witness_candidates) + (initial_committee_candidates)(initial_worker_candidates) + (initial_chain_id) + (immutable_parameters)) diff --git a/libraries/chain/include/graphene/chain/global_property_object.hpp b/libraries/chain/include/graphene/chain/global_property_object.hpp index bb607b57..c34265cb 100644 --- a/libraries/chain/include/graphene/chain/global_property_object.hpp +++ b/libraries/chain/include/graphene/chain/global_property_object.hpp @@ -130,6 +130,7 @@ namespace graphene { namespace chain { }} FC_REFLECT_DERIVED( graphene::chain::dynamic_global_property_object, (graphene::db::object), + (random) (head_block_number) (head_block_id) (time) @@ -155,6 +156,3 @@ FC_REFLECT_DERIVED( graphene::chain::global_property_object, (graphene::db::obje (active_witnesses) (active_sons) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::dynamic_global_property_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::global_property_object ) diff --git a/libraries/chain/include/graphene/chain/immutable_chain_parameters.hpp b/libraries/chain/include/graphene/chain/immutable_chain_parameters.hpp index f7128889..ade1a459 100644 --- a/libraries/chain/include/graphene/chain/immutable_chain_parameters.hpp +++ b/libraries/chain/include/graphene/chain/immutable_chain_parameters.hpp @@ -23,8 +23,11 @@ */ #pragma once +#include + +#include + #include -#include namespace graphene { namespace chain { @@ -46,5 +49,3 @@ FC_REFLECT( graphene::chain::immutable_chain_parameters, (num_special_accounts) (num_special_assets) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::immutable_chain_parameters ) diff --git a/libraries/chain/include/graphene/chain/market_object.hpp b/libraries/chain/include/graphene/chain/market_object.hpp index 4bd3e048..b56f4e9c 100644 --- a/libraries/chain/include/graphene/chain/market_object.hpp +++ b/libraries/chain/include/graphene/chain/market_object.hpp @@ -217,7 +217,3 @@ FC_REFLECT_DERIVED( graphene::chain::force_settlement_object, (graphene::db::object), (owner)(balance)(settlement_date) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::call_order_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::force_settlement_object ) diff --git a/libraries/chain/include/graphene/chain/operation_history_object.hpp b/libraries/chain/include/graphene/chain/operation_history_object.hpp index 89199472..d8b90b58 100644 --- a/libraries/chain/include/graphene/chain/operation_history_object.hpp +++ b/libraries/chain/include/graphene/chain/operation_history_object.hpp @@ -22,10 +22,8 @@ * THE SOFTWARE. */ #pragma once - #include #include - #include namespace graphene { namespace chain { @@ -96,22 +94,15 @@ namespace graphene { namespace chain { operation_history_id_type operation_id; uint32_t sequence = 0; /// the operation position within the given account account_transaction_history_id_type next; + + //std::pair account_op()const { return std::tie( account, operation_id ); } + //std::pair account_seq()const { return std::tie( account, sequence ); } }; struct by_id; struct by_seq; struct by_op; struct by_opid; - -typedef multi_index_container< - operation_history_object, - indexed_by< - ordered_unique< tag, member< object, object_id_type, &object::id > > - > -> operation_history_multi_index_type; - -typedef generic_index operation_history_index; - typedef multi_index_container< account_transaction_history_object, indexed_by< @@ -141,8 +132,6 @@ typedef generic_index #include -#include namespace graphene { namespace chain { - class database; + /** * @brief tracks the approval of a partially approved transaction @@ -98,5 +97,3 @@ FC_REFLECT_DERIVED( graphene::chain::proposal_object, (graphene::chain::object), (expiration_time)(review_period_time)(proposed_transaction)(required_active_approvals) (available_active_approvals)(required_owner_approvals)(available_owner_approvals) (available_key_approvals)(proposer)(fail_reason)) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_object ) diff --git a/libraries/chain/include/graphene/chain/protocol/account.hpp b/libraries/chain/include/graphene/chain/protocol/account.hpp index 50ccb8ae..496e9067 100644 --- a/libraries/chain/include/graphene/chain/protocol/account.hpp +++ b/libraries/chain/include/graphene/chain/protocol/account.hpp @@ -59,12 +59,6 @@ namespace graphene { namespace chain { /// account's balance of core asset. flat_set votes; extensions_type extensions; - - /// Whether this account is voting - inline bool is_voting() const - { - return ( voting_account != GRAPHENE_PROXY_TO_SELF_ACCOUNT || !votes.empty() ); - } void validate()const; }; @@ -149,7 +143,6 @@ namespace graphene { namespace chain { optional< void_t > null_ext; optional< special_authority > owner_special_authority; optional< special_authority > active_special_authority; - optional< bool > update_last_voting_time; }; struct fee_parameters_type @@ -305,7 +298,7 @@ FC_REFLECT( graphene::chain::account_create_operation, (name)(owner)(active)(options)(extensions) ) -FC_REFLECT(graphene::chain::account_update_operation::ext, (null_ext)(owner_special_authority)(active_special_authority)(update_last_voting_time) ) +FC_REFLECT(graphene::chain::account_update_operation::ext, (null_ext)(owner_special_authority)(active_special_authority) ) FC_REFLECT( graphene::chain::account_update_operation, (fee)(account)(owner)(active)(new_options)(extensions) ) @@ -320,16 +313,5 @@ FC_REFLECT( graphene::chain::account_whitelist_operation::fee_parameters_type, ( FC_REFLECT( graphene::chain::account_update_operation::fee_parameters_type, (fee)(price_per_kbyte) ) FC_REFLECT( graphene::chain::account_upgrade_operation::fee_parameters_type, (membership_annual_fee)(membership_lifetime_fee) ) FC_REFLECT( graphene::chain::account_transfer_operation::fee_parameters_type, (fee) ) -FC_REFLECT( graphene::chain::account_transfer_operation, (fee)(account_id)(new_owner)(extensions) ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_options ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_whitelist_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_upgrade_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_transfer_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_whitelist_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_upgrade_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_transfer_operation ) +FC_REFLECT( graphene::chain::account_transfer_operation, (fee)(account_id)(new_owner)(extensions) ) diff --git a/libraries/chain/include/graphene/chain/protocol/address.hpp b/libraries/chain/include/graphene/chain/protocol/address.hpp index 8bf0fab6..b225b42c 100644 --- a/libraries/chain/include/graphene/chain/protocol/address.hpp +++ b/libraries/chain/include/graphene/chain/protocol/address.hpp @@ -25,10 +25,14 @@ #include #include -#include +#include #include -#include + +namespace fc { namespace ecc { + class public_key; + typedef fc::array public_key_data; +} } // fc::ecc namespace graphene { namespace chain { @@ -47,7 +51,7 @@ namespace graphene { namespace chain { class address { public: - address(){} ///< constructs empty / null address + address(); ///< constructs empty / null address explicit address( const std::string& base58str ); ///< converts to binary, validates checksum address( const fc::ecc::public_key& pub ); ///< converts to binary explicit address( const fc::ecc::public_key_data& pub ); ///< converts to binary @@ -93,5 +97,3 @@ namespace std #include FC_REFLECT( graphene::chain::address, (addr) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::address ) diff --git a/libraries/chain/include/graphene/chain/protocol/assert.hpp b/libraries/chain/include/graphene/chain/protocol/assert.hpp index ce758862..c9f3b277 100644 --- a/libraries/chain/include/graphene/chain/protocol/assert.hpp +++ b/libraries/chain/include/graphene/chain/protocol/assert.hpp @@ -23,7 +23,6 @@ */ #pragma once #include -#include namespace graphene { namespace chain { @@ -113,5 +112,3 @@ FC_REFLECT( graphene::chain::block_id_predicate, (id) ) FC_REFLECT_TYPENAME( graphene::chain::predicate ) FC_REFLECT( graphene::chain::assert_operation, (fee)(fee_paying_account)(predicates)(required_auths)(extensions) ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::assert_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::assert_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/asset.hpp b/libraries/chain/include/graphene/chain/protocol/asset.hpp index 60bd3cd0..a938129a 100644 --- a/libraries/chain/include/graphene/chain/protocol/asset.hpp +++ b/libraries/chain/include/graphene/chain/protocol/asset.hpp @@ -218,7 +218,3 @@ FC_REFLECT( graphene::chain::price, (base)(quote) ) (core_exchange_rate) FC_REFLECT( graphene::chain::price_feed, GRAPHENE_PRICE_FEED_FIELDS ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::price ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::price_feed ) diff --git a/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp b/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp index ae5dc211..a567c5a1 100644 --- a/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp +++ b/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp @@ -764,30 +764,3 @@ FC_REFLECT( graphene::chain::asset_reserve_operation, FC_REFLECT( graphene::chain::asset_fund_fee_pool_operation, (fee)(from_account)(asset_id)(amount)(extensions) ); FC_REFLECT( graphene::chain::asset_dividend_distribution_operation, (fee)(dividend_asset_id)(account_id)(amounts)(extensions) ); - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_options ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::bitasset_options ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_global_settle_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_settle_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_fund_fee_pool_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_dividend_distribution_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_claim_fees_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_bitasset_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_feed_producers_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_publish_feed_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_issue_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_reserve_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_global_settle_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_settle_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_settle_cancel_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_fund_fee_pool_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_claim_fees_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_bitasset_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_feed_producers_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_publish_feed_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_issue_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_reserve_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/authority.hpp b/libraries/chain/include/graphene/chain/protocol/authority.hpp index d279402d..70b674b3 100644 --- a/libraries/chain/include/graphene/chain/protocol/authority.hpp +++ b/libraries/chain/include/graphene/chain/protocol/authority.hpp @@ -23,7 +23,6 @@ */ #pragma once #include -#include namespace graphene { namespace chain { @@ -135,5 +134,3 @@ void add_authority_accounts( FC_REFLECT( graphene::chain::authority, (weight_threshold)(account_auths)(key_auths)(address_auths) ) // FC_REFLECT_TYPENAME( graphene::chain::authority::classification ) FC_REFLECT_ENUM( graphene::chain::authority::classification, (owner)(active)(key) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::authority ) diff --git a/libraries/chain/include/graphene/chain/protocol/balance.hpp b/libraries/chain/include/graphene/chain/protocol/balance.hpp index 9d0b252f..f60087a7 100644 --- a/libraries/chain/include/graphene/chain/protocol/balance.hpp +++ b/libraries/chain/include/graphene/chain/protocol/balance.hpp @@ -23,8 +23,6 @@ */ #pragma once #include -#include -#include namespace graphene { namespace chain { @@ -59,5 +57,3 @@ namespace graphene { namespace chain { FC_REFLECT( graphene::chain::balance_claim_operation::fee_parameters_type, ) FC_REFLECT( graphene::chain::balance_claim_operation, (fee)(deposit_to_account)(balance_to_claim)(balance_owner_key)(total_claimed) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::balance_claim_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/base.hpp b/libraries/chain/include/graphene/chain/protocol/base.hpp index 23c285d3..52240b93 100644 --- a/libraries/chain/include/graphene/chain/protocol/base.hpp +++ b/libraries/chain/include/graphene/chain/protocol/base.hpp @@ -27,13 +27,8 @@ #include #include -#include - namespace graphene { namespace chain { - struct asset; - struct authority; - /** * @defgroup operations Operations * @ingroup transactions Transactions diff --git a/libraries/chain/include/graphene/chain/protocol/block.hpp b/libraries/chain/include/graphene/chain/protocol/block.hpp index ad5b0327..46ac0f6d 100644 --- a/libraries/chain/include/graphene/chain/protocol/block.hpp +++ b/libraries/chain/include/graphene/chain/protocol/block.hpp @@ -69,8 +69,3 @@ FC_REFLECT( graphene::chain::block_header, (extensions) ) FC_REFLECT_DERIVED( graphene::chain::signed_block_header, (graphene::chain::block_header), (witness_signature) ) FC_REFLECT_DERIVED( graphene::chain::signed_block, (graphene::chain::signed_block_header), (transactions) ) - - -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::block_header) -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::signed_block_header) -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::signed_block) diff --git a/libraries/chain/include/graphene/chain/protocol/buyback.hpp b/libraries/chain/include/graphene/chain/protocol/buyback.hpp index 4a51e8c7..6adad52d 100644 --- a/libraries/chain/include/graphene/chain/protocol/buyback.hpp +++ b/libraries/chain/include/graphene/chain/protocol/buyback.hpp @@ -50,5 +50,3 @@ struct buyback_account_options } } FC_REFLECT( graphene::chain::buyback_account_options, (asset_to_buy)(asset_to_buy_issuer)(markets) ); - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::buyback_account_options ) diff --git a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp index 42f6af1d..65b0d3c0 100644 --- a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp +++ b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp @@ -28,8 +28,6 @@ #include #include -#include <../hardfork.d/GPOS.hf> -#include namespace graphene { namespace chain { struct fee_schedule; } } @@ -41,16 +39,10 @@ namespace graphene { namespace chain { optional< uint16_t > betting_rake_fee_percentage; optional< flat_map > permitted_betting_odds_increments; optional< uint16_t > live_betting_delay_time; - optional< uint16_t > sweeps_distribution_percentage = SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE; - optional< asset_id_type > sweeps_distribution_asset = SWEEPS_DEFAULT_DISTRIBUTION_ASSET; - optional< account_id_type > sweeps_vesting_accumulator_account= SWEEPS_ACCUMULATOR_ACCOUNT; - /* gpos parameters */ - optional < uint32_t > gpos_period = GPOS_PERIOD; - optional < uint32_t > gpos_subperiod = GPOS_SUBPERIOD; - optional < uint32_t > gpos_period_start = HARDFORK_GPOS_TIME.sec_since_epoch(); - optional < uint32_t > gpos_vesting_lockin_period = GPOS_VESTING_LOCKIN_PERIOD; - optional < uint16_t > son_count; + optional< uint16_t > sweeps_distribution_percentage; + optional< asset_id_type > sweeps_distribution_asset; + optional< account_id_type > sweeps_vesting_accumulator_account; optional < uint32_t > son_vesting_amount; optional < uint32_t > son_vesting_period; optional < uint32_t > son_pay_daily_max; @@ -162,18 +154,6 @@ namespace graphene { namespace chain { inline uint16_t son_down_time()const { return extensions.value.son_down_time.valid() ? *extensions.value.son_down_time : SON_DOWN_TIME; } - inline uint32_t gpos_period()const { - return extensions.value.gpos_period.valid() ? *extensions.value.gpos_period : GPOS_PERIOD; /// total seconds of current gpos period - } - inline uint32_t gpos_subperiod()const { - return extensions.value.gpos_subperiod.valid() ? *extensions.value.gpos_subperiod : GPOS_SUBPERIOD; /// gpos_period % gpos_subperiod = 0 - } - inline uint32_t gpos_period_start()const { - return extensions.value.gpos_period_start.valid() ? *extensions.value.gpos_period_start : HARDFORK_GPOS_TIME.sec_since_epoch(); /// current period start date - } - inline uint32_t gpos_vesting_lockin_period()const { - return extensions.value.gpos_vesting_lockin_period.valid() ? *extensions.value.gpos_vesting_lockin_period : GPOS_VESTING_LOCKIN_PERIOD; /// GPOS vesting lockin period - } }; } } // graphene::chain @@ -188,17 +168,13 @@ FC_REFLECT( graphene::chain::parameter_extension, (sweeps_distribution_percentage) (sweeps_distribution_asset) (sweeps_vesting_accumulator_account) - (gpos_period) - (gpos_subperiod) - (gpos_period_start) - (gpos_vesting_lockin_period) (son_vesting_amount) (son_vesting_period) (son_pay_daily_max) (son_pay_time) (son_deregister_time) (son_heartbeat_frequency) - (son_down_time) + (son_down_time) ) FC_REFLECT( graphene::chain::chain_parameters, @@ -247,5 +223,3 @@ FC_REFLECT( graphene::chain::chain_parameters, (maximum_tournament_number_of_wins) (extensions) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::chain_parameters ) diff --git a/libraries/chain/include/graphene/chain/protocol/committee_member.hpp b/libraries/chain/include/graphene/chain/protocol/committee_member.hpp index 8aaed748..77188367 100644 --- a/libraries/chain/include/graphene/chain/protocol/committee_member.hpp +++ b/libraries/chain/include/graphene/chain/protocol/committee_member.hpp @@ -104,10 +104,3 @@ FC_REFLECT( graphene::chain::committee_member_create_operation, FC_REFLECT( graphene::chain::committee_member_update_operation, (fee)(committee_member)(committee_member_account)(new_url) ) FC_REFLECT( graphene::chain::committee_member_update_global_parameters_operation, (fee)(new_parameters) ); - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_update_global_parameters_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_update_global_parameters_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/confidential.hpp b/libraries/chain/include/graphene/chain/protocol/confidential.hpp index 697ef35b..763006ae 100644 --- a/libraries/chain/include/graphene/chain/protocol/confidential.hpp +++ b/libraries/chain/include/graphene/chain/protocol/confidential.hpp @@ -281,10 +281,3 @@ FC_REFLECT( graphene::chain::blind_transfer_operation, FC_REFLECT( graphene::chain::transfer_to_blind_operation::fee_parameters_type, (fee)(price_per_output) ) FC_REFLECT( graphene::chain::transfer_from_blind_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::blind_transfer_operation::fee_parameters_type, (fee)(price_per_output) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_to_blind_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_from_blind_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::blind_transfer_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_to_blind_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_from_blind_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::blind_transfer_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/custom.hpp b/libraries/chain/include/graphene/chain/protocol/custom.hpp index 5596aaad..e5701a4b 100644 --- a/libraries/chain/include/graphene/chain/protocol/custom.hpp +++ b/libraries/chain/include/graphene/chain/protocol/custom.hpp @@ -56,6 +56,3 @@ namespace graphene { namespace chain { FC_REFLECT( graphene::chain::custom_operation::fee_parameters_type, (fee)(price_per_kbyte) ) FC_REFLECT( graphene::chain::custom_operation, (fee)(payer)(required_auths)(id)(data) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::custom_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::custom_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/ext.hpp b/libraries/chain/include/graphene/chain/protocol/ext.hpp index 6c974630..31f66506 100644 --- a/libraries/chain/include/graphene/chain/protocol/ext.hpp +++ b/libraries/chain/include/graphene/chain/protocol/ext.hpp @@ -24,7 +24,6 @@ #pragma once #include -#include #include namespace graphene { namespace chain { diff --git a/libraries/chain/include/graphene/chain/protocol/fba.hpp b/libraries/chain/include/graphene/chain/protocol/fba.hpp index dc672436..7460ca8d 100644 --- a/libraries/chain/include/graphene/chain/protocol/fba.hpp +++ b/libraries/chain/include/graphene/chain/protocol/fba.hpp @@ -23,7 +23,6 @@ */ #pragma once #include -#include namespace graphene { namespace chain { @@ -46,5 +45,3 @@ struct fba_distribute_operation : public base_operation FC_REFLECT( graphene::chain::fba_distribute_operation::fee_parameters_type, ) FC_REFLECT( graphene::chain::fba_distribute_operation, (fee)(account_id)(fba_id)(amount) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::fba_distribute_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp b/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp index 9baaffc7..e250ab17 100644 --- a/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp +++ b/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #pragma once -#include #include namespace graphene { namespace chain { @@ -86,5 +85,3 @@ namespace graphene { namespace chain { FC_REFLECT_TYPENAME( graphene::chain::fee_parameters ) FC_REFLECT( graphene::chain::fee_schedule, (parameters)(scale) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::fee_schedule ) diff --git a/libraries/chain/include/graphene/chain/protocol/market.hpp b/libraries/chain/include/graphene/chain/protocol/market.hpp index 2bff8c56..56352c60 100644 --- a/libraries/chain/include/graphene/chain/protocol/market.hpp +++ b/libraries/chain/include/graphene/chain/protocol/market.hpp @@ -23,7 +23,6 @@ */ #pragma once #include -#include namespace graphene { namespace chain { @@ -166,15 +165,9 @@ FC_REFLECT( graphene::chain::limit_order_cancel_operation::fee_parameters_type, FC_REFLECT( graphene::chain::call_order_update_operation::fee_parameters_type, (fee) ) /// THIS IS THE ONLY VIRTUAL OPERATION THUS FAR... FC_REFLECT( graphene::chain::fill_order_operation::fee_parameters_type, ) + + FC_REFLECT( graphene::chain::limit_order_create_operation,(fee)(seller)(amount_to_sell)(min_to_receive)(expiration)(fill_or_kill)(extensions)) FC_REFLECT( graphene::chain::limit_order_cancel_operation,(fee)(fee_paying_account)(order)(extensions) ) FC_REFLECT( graphene::chain::call_order_update_operation, (fee)(funding_account)(delta_collateral)(delta_debt)(extensions) ) FC_REFLECT( graphene::chain::fill_order_operation, (fee)(order_id)(account_id)(pays)(receives) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_cancel_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::call_order_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_cancel_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::call_order_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::fill_order_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/memo.hpp b/libraries/chain/include/graphene/chain/protocol/memo.hpp index 6c5b69fb..b126d3a7 100644 --- a/libraries/chain/include/graphene/chain/protocol/memo.hpp +++ b/libraries/chain/include/graphene/chain/protocol/memo.hpp @@ -89,6 +89,3 @@ namespace graphene { namespace chain { FC_REFLECT( graphene::chain::memo_message, (checksum)(text) ) FC_REFLECT( graphene::chain::memo_data, (from)(to)(nonce)(message) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::memo_message ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::memo_data ) diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index caca89dd..d633056f 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -191,5 +191,3 @@ namespace graphene { namespace chain { FC_REFLECT_TYPENAME( graphene::chain::operation ) FC_REFLECT( graphene::chain::op_wrapper, (op) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::op_wrapper ) diff --git a/libraries/chain/include/graphene/chain/protocol/proposal.hpp b/libraries/chain/include/graphene/chain/protocol/proposal.hpp index 141ec35f..3383b6cf 100644 --- a/libraries/chain/include/graphene/chain/protocol/proposal.hpp +++ b/libraries/chain/include/graphene/chain/protocol/proposal.hpp @@ -23,7 +23,6 @@ */ #pragma once #include -#include namespace graphene { namespace chain { /** @@ -180,10 +179,3 @@ FC_REFLECT( graphene::chain::proposal_update_operation, (fee)(fee_paying_account (active_approvals_to_add)(active_approvals_to_remove)(owner_approvals_to_add)(owner_approvals_to_remove) (key_approvals_to_add)(key_approvals_to_remove)(extensions) ) FC_REFLECT( graphene::chain::proposal_delete_operation, (fee)(fee_paying_account)(using_owner_authority)(proposal)(extensions) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_delete_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_delete_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/special_authority.hpp b/libraries/chain/include/graphene/chain/protocol/special_authority.hpp index 05a80719..3ee6f15f 100644 --- a/libraries/chain/include/graphene/chain/protocol/special_authority.hpp +++ b/libraries/chain/include/graphene/chain/protocol/special_authority.hpp @@ -48,5 +48,3 @@ void validate_special_authority( const special_authority& auth ); FC_REFLECT( graphene::chain::no_special_authority, ) FC_REFLECT( graphene::chain::top_holders_special_authority, (asset)(num_top_holders) ) FC_REFLECT_TYPENAME( graphene::chain::special_authority ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::top_holders_special_authority ) diff --git a/libraries/chain/include/graphene/chain/protocol/transaction.hpp b/libraries/chain/include/graphene/chain/protocol/transaction.hpp index 2a9909a5..95c39961 100644 --- a/libraries/chain/include/graphene/chain/protocol/transaction.hpp +++ b/libraries/chain/include/graphene/chain/protocol/transaction.hpp @@ -230,8 +230,3 @@ FC_REFLECT( graphene::chain::transaction, (ref_block_num)(ref_block_prefix)(expi // Note: not reflecting signees field for backward compatibility; in addition, it should not be in p2p messages FC_REFLECT_DERIVED( graphene::chain::signed_transaction, (graphene::chain::transaction), (signatures) ) FC_REFLECT_DERIVED( graphene::chain::processed_transaction, (graphene::chain::signed_transaction), (operation_results) ) - - -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::transaction) -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::signed_transaction) -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::processed_transaction) diff --git a/libraries/chain/include/graphene/chain/protocol/transfer.hpp b/libraries/chain/include/graphene/chain/protocol/transfer.hpp index 5366a7ab..f4417bb7 100644 --- a/libraries/chain/include/graphene/chain/protocol/transfer.hpp +++ b/libraries/chain/include/graphene/chain/protocol/transfer.hpp @@ -24,7 +24,6 @@ #pragma once #include #include -#include namespace graphene { namespace chain { @@ -106,8 +105,3 @@ FC_REFLECT( graphene::chain::override_transfer_operation::fee_parameters_type, ( FC_REFLECT( graphene::chain::override_transfer_operation, (fee)(issuer)(from)(to)(amount)(memo)(extensions) ) FC_REFLECT( graphene::chain::transfer_operation, (fee)(from)(to)(amount)(memo)(extensions) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::override_transfer_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::override_transfer_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/types.hpp b/libraries/chain/include/graphene/chain/protocol/types.hpp index f31cb3cf..1caf1f9c 100644 --- a/libraries/chain/include/graphene/chain/protocol/types.hpp +++ b/libraries/chain/include/graphene/chain/protocol/types.hpp @@ -27,15 +27,13 @@ #include #include #include -#include #include #include #include #include #include #include -#include -#include +#include #include #include #include @@ -44,34 +42,10 @@ #include #include #include +#include #include #include -#define GRAPHENE_EXTERNAL_SERIALIZATION(ext, type) \ -namespace fc { \ - ext template void from_variant( const variant& v, type& vo, uint32_t max_depth ); \ - ext template void to_variant( const type& v, variant& vo, uint32_t max_depth ); \ -namespace raw { \ - ext template void pack< datastream, type >( datastream& s, const type& tx, uint32_t _max_depth=FC_PACK_MAX_DEPTH ); \ - ext template void pack< datastream, type >( datastream& s, const type& tx, uint32_t _max_depth=FC_PACK_MAX_DEPTH ); \ - ext template void unpack< datastream, type >( datastream& s, type& tx, uint32_t _max_depth=FC_PACK_MAX_DEPTH ); \ -} } // fc::raw - -#define FC_REFLECT_DERIVED_NO_TYPENAME( TYPE, INHERITS, MEMBERS ) \ -namespace fc { \ -template<> struct reflector {\ - typedef TYPE type; \ - typedef fc::true_type is_defined; \ - typedef fc::false_type is_enum; \ - enum member_count_enum { \ - local_member_count = 0 BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_MEMBER_COUNT, +, MEMBERS ),\ - total_member_count = local_member_count BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_BASE_MEMBER_COUNT, +, INHERITS )\ - }; \ - FC_REFLECT_DERIVED_IMPL_INLINE( TYPE, INHERITS, MEMBERS ) \ -}; \ -} // fc - - namespace graphene { namespace chain { using namespace graphene::db; diff --git a/libraries/chain/include/graphene/chain/protocol/vesting.hpp b/libraries/chain/include/graphene/chain/protocol/vesting.hpp index d3eb9560..9fcbda66 100644 --- a/libraries/chain/include/graphene/chain/protocol/vesting.hpp +++ b/libraries/chain/include/graphene/chain/protocol/vesting.hpp @@ -23,24 +23,11 @@ */ #pragma once #include -#include namespace graphene { namespace chain { enum class vesting_balance_type { normal, gpos, son }; - inline std::string get_vesting_balance_type(vesting_balance_type type) { - switch (type) { - case vesting_balance_type::normal: - return "NORMAL"; - case vesting_balance_type::son: - return "SON"; - case vesting_balance_type::gpos: - default: - return "GPOS"; - } - } - struct linear_vesting_policy_initializer { /** while vesting begins on begin_timestamp, none may be claimed before vesting_cliff_seconds have passed */ @@ -137,9 +124,4 @@ FC_REFLECT(graphene::chain::cdd_vesting_policy_initializer, (start_claim)(vestin FC_REFLECT(graphene::chain::dormant_vesting_policy_initializer, ) FC_REFLECT_TYPENAME( graphene::chain::vesting_policy_initializer ) -FC_REFLECT_ENUM( graphene::chain::vesting_balance_type, (normal)(gpos)(son)) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_withdraw_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_withdraw_operation ) +FC_REFLECT_ENUM( graphene::chain::vesting_balance_type, (normal)(gpos)(son) ) diff --git a/libraries/chain/include/graphene/chain/protocol/vote.hpp b/libraries/chain/include/graphene/chain/protocol/vote.hpp index 8a46954d..7ef2c8a1 100644 --- a/libraries/chain/include/graphene/chain/protocol/vote.hpp +++ b/libraries/chain/include/graphene/chain/protocol/vote.hpp @@ -24,7 +24,12 @@ #pragma once -#include +#include +#include +#include + +#include +#include namespace graphene { namespace chain { @@ -146,5 +151,3 @@ FC_REFLECT_TYPENAME( fc::flat_set ) FC_REFLECT_ENUM( graphene::chain::vote_id_type::vote_type, (witness)(committee)(worker)(son)(VOTE_TYPE_COUNT) ) FC_REFLECT( graphene::chain::vote_id_type, (content) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vote_id_type ) diff --git a/libraries/chain/include/graphene/chain/protocol/withdraw_permission.hpp b/libraries/chain/include/graphene/chain/protocol/withdraw_permission.hpp index 7963e99f..7bc905ac 100644 --- a/libraries/chain/include/graphene/chain/protocol/withdraw_permission.hpp +++ b/libraries/chain/include/graphene/chain/protocol/withdraw_permission.hpp @@ -24,7 +24,6 @@ #pragma once #include #include -#include namespace graphene { namespace chain { @@ -180,12 +179,3 @@ FC_REFLECT( graphene::chain::withdraw_permission_update_operation, (fee)(withdra FC_REFLECT( graphene::chain::withdraw_permission_claim_operation, (fee)(withdraw_permission)(withdraw_from_account)(withdraw_to_account)(amount_to_withdraw)(memo) ); FC_REFLECT( graphene::chain::withdraw_permission_delete_operation, (fee)(withdraw_from_account)(authorized_account) (withdrawal_permission) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_claim_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_delete_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_claim_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_delete_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/witness.hpp b/libraries/chain/include/graphene/chain/protocol/witness.hpp index 2b5e88b0..b096e826 100644 --- a/libraries/chain/include/graphene/chain/protocol/witness.hpp +++ b/libraries/chain/include/graphene/chain/protocol/witness.hpp @@ -23,7 +23,6 @@ */ #pragma once #include -#include namespace graphene { namespace chain { @@ -85,8 +84,3 @@ FC_REFLECT( graphene::chain::witness_create_operation, (fee)(witness_account)(ur FC_REFLECT( graphene::chain::witness_update_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::witness_update_operation, (fee)(witness)(witness_account)(new_url)(new_signing_key)(new_initial_secret) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_update_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/worker.hpp b/libraries/chain/include/graphene/chain/protocol/worker.hpp index 11e0aa05..9e6eef35 100644 --- a/libraries/chain/include/graphene/chain/protocol/worker.hpp +++ b/libraries/chain/include/graphene/chain/protocol/worker.hpp @@ -23,7 +23,6 @@ */ #pragma once #include -#include namespace graphene { namespace chain { @@ -105,5 +104,3 @@ FC_REFLECT( graphene::chain::worker_create_operation::fee_parameters_type, (fee) FC_REFLECT( graphene::chain::worker_create_operation, (fee)(owner)(work_begin_date)(work_end_date)(daily_pay)(name)(url)(initializer) ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::worker_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::worker_create_operation ) diff --git a/libraries/chain/include/graphene/chain/pts_address.hpp b/libraries/chain/include/graphene/chain/pts_address.hpp index c0bc80ff..636e2f11 100644 --- a/libraries/chain/include/graphene/chain/pts_address.hpp +++ b/libraries/chain/include/graphene/chain/pts_address.hpp @@ -24,8 +24,6 @@ #pragma once #include -#include -#include #include namespace fc { namespace ecc { class public_key; } } @@ -77,11 +75,4 @@ namespace fc { void to_variant( const graphene::chain::pts_address& var, fc::variant& vo, uint32_t max_depth = 1 ); void from_variant( const fc::variant& var, graphene::chain::pts_address& vo, uint32_t max_depth = 1 ); -namespace raw { - extern template void pack( datastream& s, const graphene::chain::pts_address& tx, - uint32_t _max_depth=FC_PACK_MAX_DEPTH ); - extern template void pack( datastream& s, const graphene::chain::pts_address& tx, - uint32_t _max_depth=FC_PACK_MAX_DEPTH ); - extern template void unpack( datastream& s, graphene::chain::pts_address& tx, - uint32_t _max_depth=FC_PACK_MAX_DEPTH ); -} } // fc::raw +} diff --git a/libraries/chain/include/graphene/chain/special_authority_object.hpp b/libraries/chain/include/graphene/chain/special_authority_object.hpp index 75093f3a..da9ecc5e 100644 --- a/libraries/chain/include/graphene/chain/special_authority_object.hpp +++ b/libraries/chain/include/graphene/chain/special_authority_object.hpp @@ -68,5 +68,3 @@ FC_REFLECT_DERIVED( (graphene::db::object), (account) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::special_authority_object ) diff --git a/libraries/chain/include/graphene/chain/transaction_object.hpp b/libraries/chain/include/graphene/chain/transaction_object.hpp index aaaa31f1..4f76d6be 100644 --- a/libraries/chain/include/graphene/chain/transaction_object.hpp +++ b/libraries/chain/include/graphene/chain/transaction_object.hpp @@ -22,10 +22,12 @@ * THE SOFTWARE. */ #pragma once +#include #include #include #include +#include #include #include @@ -70,5 +72,3 @@ namespace graphene { namespace chain { } } FC_REFLECT_DERIVED( graphene::chain::transaction_object, (graphene::db::object), (trx)(trx_id) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transaction_object ) diff --git a/libraries/chain/include/graphene/chain/vesting_balance_evaluator.hpp b/libraries/chain/include/graphene/chain/vesting_balance_evaluator.hpp index 9bb7520e..fccfbb75 100644 --- a/libraries/chain/include/graphene/chain/vesting_balance_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/vesting_balance_evaluator.hpp @@ -46,7 +46,6 @@ class vesting_balance_withdraw_evaluator : public evaluator, - member, member_offset //member //member_offset >, composite_key_compare< std::less< asset_id_type >, - std::less< vesting_balance_type >, std::greater< share_type > //std::less< account_id_type > > @@ -255,7 +255,3 @@ FC_REFLECT_DERIVED(graphene::chain::vesting_balance_object, (graphene::db::objec (policy) (balance_type) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::linear_vesting_policy ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::cdd_vesting_policy ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_object ) diff --git a/libraries/chain/include/graphene/chain/withdraw_permission_object.hpp b/libraries/chain/include/graphene/chain/withdraw_permission_object.hpp index a6fee0c5..000573bd 100644 --- a/libraries/chain/include/graphene/chain/withdraw_permission_object.hpp +++ b/libraries/chain/include/graphene/chain/withdraw_permission_object.hpp @@ -114,5 +114,3 @@ FC_REFLECT_DERIVED( graphene::chain::withdraw_permission_object, (graphene::db:: (expiration) (claimed_this_period) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_object ) diff --git a/libraries/chain/include/graphene/chain/witness_object.hpp b/libraries/chain/include/graphene/chain/witness_object.hpp index 7928b46e..2d1b7666 100644 --- a/libraries/chain/include/graphene/chain/witness_object.hpp +++ b/libraries/chain/include/graphene/chain/witness_object.hpp @@ -29,6 +29,8 @@ namespace graphene { namespace chain { using namespace graphene::db; + class witness_object; + class witness_object : public abstract_object { public: @@ -83,5 +85,3 @@ FC_REFLECT_DERIVED( graphene::chain::witness_object, (graphene::db::object), (total_missed) (last_confirmed_block_num) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_object ) diff --git a/libraries/chain/include/graphene/chain/witness_schedule_object.hpp b/libraries/chain/include/graphene/chain/witness_schedule_object.hpp index b934fd01..fc7d6d10 100644 --- a/libraries/chain/include/graphene/chain/witness_schedule_object.hpp +++ b/libraries/chain/include/graphene/chain/witness_schedule_object.hpp @@ -153,6 +153,3 @@ FC_REFLECT_DERIVED( (recent_slots_filled) (current_shuffled_sons) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_scheduler ) -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_schedule_object ) diff --git a/libraries/chain/include/graphene/chain/worker_object.hpp b/libraries/chain/include/graphene/chain/worker_object.hpp index 5e23f0b8..1219fc1c 100644 --- a/libraries/chain/include/graphene/chain/worker_object.hpp +++ b/libraries/chain/include/graphene/chain/worker_object.hpp @@ -22,9 +22,8 @@ * THE SOFTWARE. */ #pragma once -#include +#include #include -#include namespace graphene { namespace chain { @@ -176,5 +175,3 @@ FC_REFLECT_DERIVED( graphene::chain::worker_object, (graphene::db::object), (name) (url) ) - -GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::worker_object ) diff --git a/libraries/chain/proposal_evaluator.cpp b/libraries/chain/proposal_evaluator.cpp index 6664476f..1a8e2ee2 100644 --- a/libraries/chain/proposal_evaluator.cpp +++ b/libraries/chain/proposal_evaluator.cpp @@ -46,7 +46,15 @@ struct proposal_operation_hardfork_visitor template void operator()(const T &v) const {} - void operator()(const committee_member_update_global_parameters_operation &op) const {} + void operator()(const committee_member_update_global_parameters_operation &op) const { + if( block_time < HARDFORK_1000_TIME ) // TODO: remove after hf + FC_ASSERT( !op.new_parameters.extensions.value.min_bet_multiplier.valid() + && !op.new_parameters.extensions.value.max_bet_multiplier.valid() + && !op.new_parameters.extensions.value.betting_rake_fee_percentage.valid() + && !op.new_parameters.extensions.value.permitted_betting_odds_increments.valid() + && !op.new_parameters.extensions.value.live_betting_delay_time.valid(), + "Parameter extensions are not allowed yet!" ); + } void operator()(const graphene::chain::tournament_payout_operation &o) const { // TODO: move check into tournament_payout_operation::validate after HARDFORK_999_TIME @@ -152,11 +160,6 @@ struct proposal_operation_hardfork_visitor FC_ASSERT( block_time >= HARDFORK_SON_TIME, "son_maintenance_operation not allowed yet!" ); } - void operator()(const vesting_balance_create_operation &vbco) const { - if(block_time < HARDFORK_GPOS_TIME) - FC_ASSERT( vbco.balance_type == vesting_balance_type::normal, "balance_type in vesting create not allowed yet!" ); - } - // loop and self visit in proposals void operator()(const proposal_create_operation &v) const { for (const op_wrapper &op : v.proposed_ops) diff --git a/libraries/chain/proposal_object.cpp b/libraries/chain/proposal_object.cpp index 1d5a8706..343edce2 100644 --- a/libraries/chain/proposal_object.cpp +++ b/libraries/chain/proposal_object.cpp @@ -37,7 +37,7 @@ bool proposal_object::is_authorized_to_execute(database& db) const [&]( account_id_type id ){ return &id(db).active; }, [&]( account_id_type id ){ return &id(db).owner; }, db.get_global_properties().parameters.max_authority_depth, - true, /* allow committee */ + true, /* allow committeee */ available_active_approvals, available_owner_approvals ); } @@ -90,5 +90,3 @@ void required_approval_index::object_removed( const object& obj ) } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::proposal_object ) diff --git a/libraries/chain/protocol/account.cpp b/libraries/chain/protocol/account.cpp index 2405369a..6721bb07 100644 --- a/libraries/chain/protocol/account.cpp +++ b/libraries/chain/protocol/account.cpp @@ -24,9 +24,6 @@ #include #include #include - -#include - namespace graphene { namespace chain { /** @@ -284,7 +281,6 @@ void account_update_operation::validate()const || new_options.valid() || extensions.value.owner_special_authority.valid() || extensions.value.active_special_authority.valid() - || extensions.value.update_last_voting_time.valid() ); FC_ASSERT( has_action ); @@ -330,15 +326,3 @@ void account_transfer_operation::validate()const } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_options ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_whitelist_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_upgrade_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_transfer_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_whitelist_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_upgrade_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_transfer_operation ) diff --git a/libraries/chain/protocol/address.cpp b/libraries/chain/protocol/address.cpp index f0edbd49..19bb4df5 100644 --- a/libraries/chain/protocol/address.cpp +++ b/libraries/chain/protocol/address.cpp @@ -27,10 +27,9 @@ #include #include -#include - namespace graphene { namespace chain { + address::address(){} address::address( const std::string& base58str ) { @@ -111,5 +110,3 @@ namespace fc vo = graphene::chain::address( var.as_string() ); } } - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::address ) diff --git a/libraries/chain/protocol/assert.cpp b/libraries/chain/protocol/assert.cpp index 5ce61e45..60f26e3f 100644 --- a/libraries/chain/protocol/assert.cpp +++ b/libraries/chain/protocol/assert.cpp @@ -21,11 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include -#include - -#include +#include namespace graphene { namespace chain { @@ -66,7 +62,5 @@ share_type assert_operation::calculate_fee(const fee_parameters_type& k)const return k.fee * predicates.size(); } -} } // namespace graphene::chain -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::assert_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::assert_operation ) +} } // namespace graphene::chain diff --git a/libraries/chain/protocol/asset.cpp b/libraries/chain/protocol/asset.cpp index 525e193b..e1169b0c 100644 --- a/libraries/chain/protocol/asset.cpp +++ b/libraries/chain/protocol/asset.cpp @@ -24,7 +24,6 @@ #include #include #include -#include namespace graphene { namespace chain { typedef boost::multiprecision::uint128_t uint128_t; @@ -131,11 +130,7 @@ namespace graphene { namespace chain { return ~(asset( cp.numerator().convert_to(), debt.asset_id ) / asset( cp.denominator().convert_to(), collateral.asset_id )); } FC_CAPTURE_AND_RETHROW( (debt)(collateral)(collateral_ratio) ) } - bool price::is_null() const - { - // Effectively same as "return *this == price();" but perhaps faster - return ( base.asset_id == asset_id_type() && quote.asset_id == asset_id_type() ); - } + bool price::is_null() const { return *this == price(); } void price::validate() const { try { @@ -207,7 +202,3 @@ const int64_t scaled_precision_lut[19] = }; } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::price ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::price_feed ) diff --git a/libraries/chain/protocol/asset_ops.cpp b/libraries/chain/protocol/asset_ops.cpp index 5dfd09ee..e4942aa4 100644 --- a/libraries/chain/protocol/asset_ops.cpp +++ b/libraries/chain/protocol/asset_ops.cpp @@ -24,8 +24,6 @@ #include #include -#include - namespace graphene { namespace chain { /** @@ -290,30 +288,3 @@ void lottery_asset_options::validate() const } } } // namespace graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_options ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::bitasset_options ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_global_settle_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_settle_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_fund_fee_pool_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_claim_fees_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_bitasset_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_feed_producers_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_publish_feed_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_issue_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_reserve_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_global_settle_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_settle_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_settle_cancel_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_fund_fee_pool_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_claim_fees_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_dividend_distribution_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_bitasset_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_feed_producers_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_publish_feed_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_issue_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_reserve_operation ) diff --git a/libraries/chain/protocol/authority.cpp b/libraries/chain/protocol/authority.cpp index 6cfed2ec..97470d33 100644 --- a/libraries/chain/protocol/authority.cpp +++ b/libraries/chain/protocol/authority.cpp @@ -23,7 +23,6 @@ */ #include -#include namespace graphene { namespace chain { @@ -37,5 +36,3 @@ void add_authority_accounts( } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::authority ) diff --git a/libraries/chain/protocol/block.cpp b/libraries/chain/protocol/block.cpp index 725ea3a7..d32365dd 100644 --- a/libraries/chain/protocol/block.cpp +++ b/libraries/chain/protocol/block.cpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include -#include #include #include #include @@ -91,7 +90,3 @@ namespace graphene { namespace chain { } } } - -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::block_header) -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::signed_block_header) -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::signed_block) diff --git a/libraries/chain/protocol/committee_member.cpp b/libraries/chain/protocol/committee_member.cpp index 1824870a..4c8c5d25 100644 --- a/libraries/chain/protocol/committee_member.cpp +++ b/libraries/chain/protocol/committee_member.cpp @@ -21,12 +21,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include -#include #include -#include - namespace graphene { namespace chain { void committee_member_create_operation::validate()const @@ -49,10 +45,3 @@ void committee_member_update_global_parameters_operation::validate() const } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_update_global_parameters_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_update_global_parameters_operation ) diff --git a/libraries/chain/protocol/confidential.cpp b/libraries/chain/protocol/confidential.cpp index 2e8fbc68..603befa1 100644 --- a/libraries/chain/protocol/confidential.cpp +++ b/libraries/chain/protocol/confidential.cpp @@ -27,6 +27,7 @@ #include #include +#include namespace graphene { namespace chain { @@ -140,6 +141,9 @@ share_type blind_transfer_operation::calculate_fee( const fee_parameters_type& k return k.fee + outputs.size() * k.price_per_output; } + + + /** * Packs *this then encodes as base58 encoded string. */ @@ -155,11 +159,6 @@ stealth_confirmation::stealth_confirmation( const std::string& base58 ) *this = fc::raw::unpack( fc::from_base58( base58 ) ); } -} } // graphene::chain -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_to_blind_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_from_blind_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::blind_transfer_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_to_blind_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_from_blind_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::blind_transfer_operation ) + +} } // graphene::chain diff --git a/libraries/chain/protocol/custom.cpp b/libraries/chain/protocol/custom.cpp index 72f8dd44..b69243be 100644 --- a/libraries/chain/protocol/custom.cpp +++ b/libraries/chain/protocol/custom.cpp @@ -23,8 +23,6 @@ */ #include -#include - namespace graphene { namespace chain { void custom_operation::validate()const @@ -37,6 +35,3 @@ share_type custom_operation::calculate_fee(const fee_parameters_type& k)const } } } - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::custom_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::custom_operation ) diff --git a/libraries/chain/protocol/fee_schedule.cpp b/libraries/chain/protocol/fee_schedule.cpp index 6d494e37..138d801e 100644 --- a/libraries/chain/protocol/fee_schedule.cpp +++ b/libraries/chain/protocol/fee_schedule.cpp @@ -35,8 +35,6 @@ namespace fc //template const graphene::chain::fee_schedule& smart_ref::operator*() const; } -#include - #define MAX_FEE_STABILIZATION_ITERATION 4 namespace graphene { namespace chain { @@ -210,5 +208,3 @@ namespace graphene { namespace chain { } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::fee_schedule ) diff --git a/libraries/chain/protocol/market.cpp b/libraries/chain/protocol/market.cpp index ae0a3a68..923f4763 100644 --- a/libraries/chain/protocol/market.cpp +++ b/libraries/chain/protocol/market.cpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include -#include namespace graphene { namespace chain { @@ -47,11 +46,3 @@ void call_order_update_operation::validate()const } FC_CAPTURE_AND_RETHROW((*this)) } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_cancel_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::call_order_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_cancel_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::call_order_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::fill_order_operation ) diff --git a/libraries/chain/protocol/memo.cpp b/libraries/chain/protocol/memo.cpp index afa0b486..e04b5e43 100644 --- a/libraries/chain/protocol/memo.cpp +++ b/libraries/chain/protocol/memo.cpp @@ -23,7 +23,6 @@ */ #include #include -#include namespace graphene { namespace chain { @@ -89,6 +88,3 @@ memo_message memo_message::deserialize(const string& serial) } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::memo_message ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::memo_data ) diff --git a/libraries/chain/protocol/operations.cpp b/libraries/chain/protocol/operations.cpp index 7db51078..40a37eba 100644 --- a/libraries/chain/protocol/operations.cpp +++ b/libraries/chain/protocol/operations.cpp @@ -21,10 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include #include -#include -#include namespace graphene { namespace chain { @@ -88,5 +85,3 @@ void operation_get_required_authorities( const operation& op, } } } // namespace graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::op_wrapper ) diff --git a/libraries/chain/protocol/proposal.cpp b/libraries/chain/protocol/proposal.cpp index c77e71e4..069824af 100644 --- a/libraries/chain/protocol/proposal.cpp +++ b/libraries/chain/protocol/proposal.cpp @@ -25,8 +25,6 @@ #include #include -#include - namespace graphene { namespace chain { proposal_create_operation proposal_create_operation::committee_proposal(const chain_parameters& global_params, fc::time_point_sec head_block_time ) @@ -107,10 +105,3 @@ void proposal_update_operation::get_required_owner_authorities( flat_set -#include -#include -#include -#include -#include -#include - -#include - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::balance_claim_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::buyback_account_options ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::fba_distribute_operation ) - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_withdraw_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_withdraw_operation ) - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::chain_parameters ) diff --git a/libraries/chain/protocol/tournament.cpp b/libraries/chain/protocol/tournament.cpp index 78ab4c01..57e80bf3 100644 --- a/libraries/chain/protocol/tournament.cpp +++ b/libraries/chain/protocol/tournament.cpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include -#include namespace graphene { namespace chain { diff --git a/libraries/chain/protocol/transaction.cpp b/libraries/chain/protocol/transaction.cpp index 093e7833..a11e3335 100644 --- a/libraries/chain/protocol/transaction.cpp +++ b/libraries/chain/protocol/transaction.cpp @@ -27,7 +27,6 @@ #include #include #include -#include namespace graphene { namespace chain { @@ -391,7 +390,3 @@ void signed_transaction::verify_authority( } FC_CAPTURE_AND_RETHROW( (*this) ) } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::transaction) -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::signed_transaction) -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::processed_transaction) diff --git a/libraries/chain/protocol/transfer.cpp b/libraries/chain/protocol/transfer.cpp index 0fb0aefa..3dfe4eb7 100644 --- a/libraries/chain/protocol/transfer.cpp +++ b/libraries/chain/protocol/transfer.cpp @@ -23,8 +23,6 @@ */ #include -#include - namespace graphene { namespace chain { share_type transfer_operation::calculate_fee( const fee_parameters_type& schedule )const @@ -63,8 +61,3 @@ void override_transfer_operation::validate()const } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::override_transfer_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::override_transfer_operation ) diff --git a/libraries/chain/protocol/vote.cpp b/libraries/chain/protocol/vote.cpp index 68f476f5..f78f2b4f 100644 --- a/libraries/chain/protocol/vote.cpp +++ b/libraries/chain/protocol/vote.cpp @@ -49,5 +49,3 @@ void from_variant( const variant& var, graphene::chain::vote_id_type& vo, uint32 } } // fc - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vote_id_type ) diff --git a/libraries/chain/protocol/withdraw_permission.cpp b/libraries/chain/protocol/withdraw_permission.cpp index b36c378d..33b40c85 100644 --- a/libraries/chain/protocol/withdraw_permission.cpp +++ b/libraries/chain/protocol/withdraw_permission.cpp @@ -23,8 +23,6 @@ */ #include -#include - namespace graphene { namespace chain { void withdraw_permission_update_operation::validate()const @@ -67,13 +65,6 @@ void withdraw_permission_delete_operation::validate() const FC_ASSERT( withdraw_from_account != authorized_account ); } + } } // graphene::chain -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_claim_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_delete_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_update_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_claim_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_delete_operation ) diff --git a/libraries/chain/protocol/witness.cpp b/libraries/chain/protocol/witness.cpp index 90583cd8..82fa462a 100644 --- a/libraries/chain/protocol/witness.cpp +++ b/libraries/chain/protocol/witness.cpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include -#include namespace graphene { namespace chain { @@ -40,8 +39,3 @@ void witness_update_operation::validate() const } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_update_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_create_operation ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_update_operation ) diff --git a/libraries/chain/protocol/worker.cpp b/libraries/chain/protocol/worker.cpp index 932148ec..eb133da0 100644 --- a/libraries/chain/protocol/worker.cpp +++ b/libraries/chain/protocol/worker.cpp @@ -22,7 +22,6 @@ * THE SOFTWARE. */ #include -#include namespace graphene { namespace chain { @@ -37,6 +36,3 @@ void worker_create_operation::validate() const } } } - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::worker_create_operation::fee_parameters_type ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::worker_create_operation ) diff --git a/libraries/chain/pts_address.cpp b/libraries/chain/pts_address.cpp index c6d74f58..27f3d256 100644 --- a/libraries/chain/pts_address.cpp +++ b/libraries/chain/pts_address.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include namespace graphene { namespace chain { @@ -98,12 +97,4 @@ namespace fc { vo = graphene::chain::pts_address( var.as_string() ); } - -namespace raw { - template void pack( datastream& s, const graphene::chain::pts_address& tx, - uint32_t _max_depth=FC_PACK_MAX_DEPTH ); - template void pack( datastream& s, const graphene::chain::pts_address& tx, - uint32_t _max_depth=FC_PACK_MAX_DEPTH ); - template void unpack( datastream& s, graphene::chain::pts_address& tx, - uint32_t _max_depth=FC_PACK_MAX_DEPTH ); -} } // fc::raw +} diff --git a/libraries/chain/small_objects.cpp b/libraries/chain/small_objects.cpp deleted file mode 100644 index a74fa116..00000000 --- a/libraries/chain/small_objects.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2019 BitShares Blockchain Foundation, and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::balance_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::block_summary_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::budget_record ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::budget_record_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::buyback_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::immutable_chain_parameters ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::call_order_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::force_settlement_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::chain_property_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::blinded_balance_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::fba_accumulator_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::dynamic_global_property_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::global_property_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::operation_history_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_transaction_history_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::special_authority_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transaction_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_scheduler ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_schedule_object ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::worker_object ) diff --git a/libraries/chain/special_authority.cpp b/libraries/chain/special_authority.cpp index 74889f80..ca974f30 100644 --- a/libraries/chain/special_authority.cpp +++ b/libraries/chain/special_authority.cpp @@ -25,8 +25,6 @@ #include #include -#include - namespace graphene { namespace chain { struct special_authority_validate_visitor @@ -70,6 +68,3 @@ void evaluate_special_authority( const database& db, const special_authority& a } } } // graphene::chain - - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::top_holders_special_authority ) diff --git a/libraries/chain/vesting_balance_evaluator.cpp b/libraries/chain/vesting_balance_evaluator.cpp index dc91a449..cc82aa3e 100644 --- a/libraries/chain/vesting_balance_evaluator.cpp +++ b/libraries/chain/vesting_balance_evaluator.cpp @@ -42,12 +42,12 @@ void_result vesting_balance_create_evaluator::do_evaluate( const vesting_balance FC_ASSERT( d.get_balance( creator_account.id, op.amount.asset_id ) >= op.amount ); FC_ASSERT( !op.amount.asset_id(d).is_transfer_restricted() ); + if(d.head_block_time() < HARDFORK_SON_TIME) // Todo: can be removed after gpos hf time pass + FC_ASSERT( op.balance_type == vesting_balance_type::normal); + if(d.head_block_time() >= HARDFORK_SON_TIME && op.balance_type == vesting_balance_type::son) // Todo: hf check can be removed after pass FC_ASSERT( op.amount.amount >= d.get_global_properties().parameters.son_vesting_amount() ); - if(d.head_block_time() < HARDFORK_GPOS_TIME) // Todo: can be removed after gpos hf time pass - FC_ASSERT( op.balance_type == vesting_balance_type::normal); - return void_result(); } FC_CAPTURE_AND_RETHROW( (op) ) } @@ -103,70 +103,23 @@ object_id_type vesting_balance_create_evaluator::do_apply( const vesting_balance // If making changes to this logic, check if those changes should also be made there as well. obj.owner = op.owner; obj.balance = op.amount; - if(op.balance_type == vesting_balance_type::gpos) - { - const auto &gpo = d.get_global_properties(); - // forcing gpos policy - linear_vesting_policy p; - p.begin_timestamp = now; - p.vesting_cliff_seconds = gpo.parameters.gpos_vesting_lockin_period(); - p.vesting_duration_seconds = gpo.parameters.gpos_subperiod(); - obj.policy = p; - } - else { - op.policy.visit(init_policy_visitor(obj.policy, op.amount.amount, now)); - } obj.balance_type = op.balance_type; + op.policy.visit( init_policy_visitor( obj.policy, op.amount.amount, now ) ); } ); return vbo.id; } FC_CAPTURE_AND_RETHROW( (op) ) } -operation_result vesting_balance_withdraw_evaluator::start_evaluate( transaction_evaluation_state& eval_state, const operation& op, bool apply ) -{ try { - trx_state = &eval_state; - const auto& oper = op.get(); - - //check_required_authorities(op); - auto result = evaluate( oper ); - - if( apply ) result = this->apply( oper ); - return result; -} FC_CAPTURE_AND_RETHROW() } - void_result vesting_balance_withdraw_evaluator::do_evaluate( const vesting_balance_withdraw_operation& op ) { try { const database& d = db(); const time_point_sec now = d.head_block_time(); const vesting_balance_object& vbo = op.vesting_balance( d ); - if(vbo.balance_type == vesting_balance_type::normal) - { - FC_ASSERT( op.owner == vbo.owner, "", ("op.owner", op.owner)("vbo.owner", vbo.owner) ); - FC_ASSERT( vbo.is_withdraw_allowed( now, op.amount ), "Account has insufficient ${balance_type} Vested Balance to withdraw", - ("balance_type", get_vesting_balance_type(vbo.balance_type))("now", now)("op", op)("vbo", vbo) ); - assert( op.amount <= vbo.balance ); // is_withdraw_allowed should fail before this check is reached - } - else if(now > HARDFORK_GPOS_TIME && vbo.balance_type == vesting_balance_type::gpos) - { - const account_id_type account_id = op.owner; - vector vbos; - auto vesting_range = d.get_index_type().indices().get().equal_range(account_id); - std::for_each(vesting_range.first, vesting_range.second, - [&vbos, now](const vesting_balance_object& balance) { - if(balance.balance.amount > 0 && balance.balance_type == vesting_balance_type::gpos - && balance.is_withdraw_allowed(now, balance.balance.amount) && balance.balance.asset_id == asset_id_type()) - vbos.emplace_back(balance); - }); + FC_ASSERT( op.owner == vbo.owner, "", ("op.owner", op.owner)("vbo.owner", vbo.owner) ); + FC_ASSERT( vbo.is_withdraw_allowed( now, op.amount ), "", ("now", now)("op", op)("vbo", vbo) ); + assert( op.amount <= vbo.balance ); // is_withdraw_allowed should fail before this check is reached - asset total_amount; - for (const vesting_balance_object& vesting_balance_obj : vbos) - { - total_amount += vesting_balance_obj.balance.amount; - } - FC_ASSERT( op.amount <= total_amount, "Account has either insufficient GPOS Vested Balance or lock-in period is not matured"); - } - - /* const account_object& owner_account = op.owner( d ); */ + /* const account_object& owner_account = */ op.owner( d ); // TODO: Check asset authorizations and withdrawals return void_result(); } FC_CAPTURE_AND_RETHROW( (op) ) } @@ -174,55 +127,22 @@ void_result vesting_balance_withdraw_evaluator::do_evaluate( const vesting_balan void_result vesting_balance_withdraw_evaluator::do_apply( const vesting_balance_withdraw_operation& op ) { try { database& d = db(); - const time_point_sec now = d.head_block_time(); - //Handling all GPOS withdrawls separately from normal and SONs(future extension). - // One request/transaction would be sufficient to withdraw from multiple vesting balance ids + const vesting_balance_object& vbo = op.vesting_balance( d ); - if(vbo.balance_type == vesting_balance_type::normal) + + // Allow zero balance objects to stick around, (1) to comply + // with the chain's "objects live forever" design principle, (2) + // if it's cashback or worker, it'll be filled up again. + + d.modify( vbo, [&]( vesting_balance_object& vbo ) { - // Allow zero balance objects to stick around, (1) to comply - // with the chain's "objects live forever" design principle, (2) - // if it's cashback or worker, it'll be filled up again. + vbo.withdraw( now, op.amount ); + } ); - d.modify( vbo, [&]( vesting_balance_object& vbo ) - { - vbo.withdraw( now, op.amount ); - } ); - - d.adjust_balance( op.owner, op.amount ); - } - else if(now > HARDFORK_GPOS_TIME && vbo.balance_type == vesting_balance_type::gpos) - { - const account_id_type account_id = op.owner; - vector ids; - auto vesting_range = d.get_index_type().indices().get().equal_range(account_id); - std::for_each(vesting_range.first, vesting_range.second, - [&ids, now](const vesting_balance_object& balance) { - if(balance.balance.amount > 0 && balance.balance_type == vesting_balance_type::gpos - && balance.is_withdraw_allowed(now, balance.balance.amount) && balance.balance.asset_id == asset_id_type()) - ids.emplace_back(balance.id); - }); - - asset total_withdraw_amount = op.amount; - for (const vesting_balance_id_type& id : ids) - { - const vesting_balance_object& vbo = id( d ); - if(total_withdraw_amount.amount > vbo.balance.amount) - { - total_withdraw_amount.amount -= vbo.balance.amount; - d.adjust_balance( op.owner, vbo.balance ); - d.modify( vbo, [&]( vesting_balance_object& vbo ) {vbo.withdraw( now, vbo.balance );} ); - } - else - { - d.modify( vbo, [&]( vesting_balance_object& vbo ) {vbo.withdraw( now, total_withdraw_amount );} ); - d.adjust_balance( op.owner, total_withdraw_amount); - break; - } - } - } + d.adjust_balance( op.owner, op.amount ); + // TODO: Check asset authorizations and withdrawals return void_result(); } FC_CAPTURE_AND_RETHROW( (op) ) } diff --git a/libraries/chain/vesting_balance_object.cpp b/libraries/chain/vesting_balance_object.cpp index 3334d4f6..742482ce 100644 --- a/libraries/chain/vesting_balance_object.cpp +++ b/libraries/chain/vesting_balance_object.cpp @@ -24,8 +24,6 @@ #include -#include - namespace graphene { namespace chain { inline bool sum_below_max_shares(const asset& a, const asset& b) @@ -47,33 +45,23 @@ asset linear_vesting_policy::get_allowed_withdraw( const vesting_policy_context& if( elapsed_seconds >= vesting_cliff_seconds ) { - // BLOCKBACK-154 fix, Begin balance for linear vesting applies only to initial account balance from genesis - // So, for any GPOS vesting, the begin balance would be 0 and should be able to withdraw balance amount based on lockin period - if(begin_balance == 0) + share_type total_vested = 0; + if( elapsed_seconds < vesting_duration_seconds ) { - allowed_withdraw = ctx.balance.amount; - return asset( allowed_withdraw, ctx.balance.asset_id ); + total_vested = (fc::uint128_t( begin_balance.value ) * elapsed_seconds / vesting_duration_seconds).to_uint64(); } else { - share_type total_vested = 0; - if( elapsed_seconds < vesting_duration_seconds ) - { - total_vested = (fc::uint128_t( begin_balance.value ) * elapsed_seconds / vesting_duration_seconds).to_uint64(); - } - else - { - total_vested = begin_balance; - } - assert( total_vested >= 0 ); - - const share_type withdrawn_already = begin_balance - ctx.balance.amount; - assert( withdrawn_already >= 0 ); - - allowed_withdraw = total_vested - withdrawn_already; - assert( allowed_withdraw >= 0 ); + total_vested = begin_balance; } - } + assert( total_vested >= 0 ); + + const share_type withdrawn_already = begin_balance - ctx.balance.amount; + assert( withdrawn_already >= 0 ); + + allowed_withdraw = total_vested - withdrawn_already; + assert( allowed_withdraw >= 0 ); + } } return asset( allowed_withdraw, ctx.balance.asset_id ); @@ -277,7 +265,3 @@ asset vesting_balance_object::get_allowed_withdraw(const time_point_sec& now)con } } } // graphene::chain - -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::linear_vesting_policy ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::cdd_vesting_policy ) -GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_object ) diff --git a/libraries/chain/worker_evaluator.cpp b/libraries/chain/worker_evaluator.cpp index b5aea8f3..cf6f0e00 100644 --- a/libraries/chain/worker_evaluator.cpp +++ b/libraries/chain/worker_evaluator.cpp @@ -106,7 +106,7 @@ object_id_type worker_create_evaluator::do_apply(const worker_create_evaluator:: void refund_worker_type::pay_worker(share_type pay, database& db) { total_burned += pay; - db.modify( db.get_core_dynamic_data(), [pay](asset_dynamic_data_object& d) { + db.modify(db.get(asset_id_type()).dynamic_data(db), [pay](asset_dynamic_data_object& d) { d.current_supply -= pay; }); } diff --git a/libraries/egenesis/egenesis_none.cpp b/libraries/egenesis/egenesis_none.cpp index c7a0dcdd..825f7f83 100644 --- a/libraries/egenesis/egenesis_none.cpp +++ b/libraries/egenesis/egenesis_none.cpp @@ -24,8 +24,6 @@ #include -#include - namespace graphene { namespace egenesis { using namespace graphene::chain; diff --git a/libraries/fc b/libraries/fc index a76b9ff8..f13d0632 160000 --- a/libraries/fc +++ b/libraries/fc @@ -1 +1 @@ -Subproject commit a76b9ff81c6887ebe1dc9fa03ef15e1433029c65 +Subproject commit f13d0632b08b9983a275304317a033914938e339 diff --git a/libraries/net/CMakeLists.txt b/libraries/net/CMakeLists.txt index 82522e5a..f7f549ed 100644 --- a/libraries/net/CMakeLists.txt +++ b/libraries/net/CMakeLists.txt @@ -5,7 +5,6 @@ set(SOURCES node.cpp core_messages.cpp peer_database.cpp peer_connection.cpp - message.cpp message_oriented_connection.cpp) add_library( graphene_net ${SOURCES} ${HEADERS} ) diff --git a/libraries/net/include/graphene/net/message.hpp b/libraries/net/include/graphene/net/message.hpp index 686fea24..cfef1519 100644 --- a/libraries/net/include/graphene/net/message.hpp +++ b/libraries/net/include/graphene/net/message.hpp @@ -22,16 +22,12 @@ * THE SOFTWARE. */ #pragma once -#include - -#include - #include #include #include -#include +#include #include -#include +#include namespace graphene { namespace net { @@ -112,10 +108,10 @@ namespace graphene { namespace net { } }; + + + } } // graphene::net FC_REFLECT( graphene::net::message_header, (size)(msg_type) ) FC_REFLECT_DERIVED( graphene::net::message, (graphene::net::message_header), (data) ) - -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::message_header) -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::message) diff --git a/libraries/net/include/graphene/net/peer_connection.hpp b/libraries/net/include/graphene/net/peer_connection.hpp index 61f1cef5..6f9a4b20 100644 --- a/libraries/net/include/graphene/net/peer_connection.hpp +++ b/libraries/net/include/graphene/net/peer_connection.hpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -34,7 +35,9 @@ #include #include #include +#include #include +#include #include #include @@ -261,13 +264,13 @@ namespace graphene { namespace net fc::future accept_or_connect_task_done; firewall_check_state_data *firewall_check_state = nullptr; - - private: #ifndef NDEBUG + private: fc::thread* _thread = nullptr; unsigned _send_message_queue_tasks_running = 0; // temporary debugging #endif bool _currently_handling_message = false; // true while we're in the middle of handling a message from the remote system + private: peer_connection(peer_connection_delegate* delegate); void destroy(); public: diff --git a/libraries/net/include/graphene/net/peer_database.hpp b/libraries/net/include/graphene/net/peer_database.hpp index ff7f4036..d0a06dd9 100644 --- a/libraries/net/include/graphene/net/peer_database.hpp +++ b/libraries/net/include/graphene/net/peer_database.hpp @@ -24,14 +24,13 @@ #pragma once #include -#include - #include #include #include #include #include #include +#include namespace graphene { namespace net { @@ -119,6 +118,5 @@ namespace graphene { namespace net { } } // end namespace graphene::net -FC_REFLECT_TYPENAME( graphene::net::potential_peer_record ) - -GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::potential_peer_record) +FC_REFLECT_ENUM(graphene::net::potential_peer_last_connection_disposition, (never_attempted_to_connect)(last_connection_failed)(last_connection_rejected)(last_connection_handshaking_failed)(last_connection_succeeded)) +FC_REFLECT(graphene::net::potential_peer_record, (endpoint)(last_seen_time)(last_connection_disposition)(last_connection_attempt_time)(number_of_successful_connection_attempts)(number_of_failed_connection_attempts)(last_error) ) diff --git a/libraries/net/message.cpp b/libraries/net/message.cpp deleted file mode 100644 index 6d35bfe5..00000000 --- a/libraries/net/message.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2019 BitShares Blockchain Foundation, and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#include - -#include - -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::net::message_header) -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::net::message) diff --git a/libraries/net/message_oriented_connection.cpp b/libraries/net/message_oriented_connection.cpp index 1bc1832e..5dea08d4 100644 --- a/libraries/net/message_oriented_connection.cpp +++ b/libraries/net/message_oriented_connection.cpp @@ -62,8 +62,7 @@ namespace graphene { namespace net { fc::time_point _last_message_received_time; fc::time_point _last_message_sent_time; - std::atomic_bool _send_message_in_progress; - std::atomic_bool _read_loop_in_progress; + bool _send_message_in_progress; #ifndef NDEBUG fc::thread* _thread; #endif @@ -99,8 +98,7 @@ namespace graphene { namespace net { _delegate(delegate), _bytes_received(0), _bytes_sent(0), - _send_message_in_progress(false), - _read_loop_in_progress(false) + _send_message_in_progress(false) #ifndef NDEBUG ,_thread(&fc::thread::current()) #endif @@ -140,21 +138,6 @@ namespace graphene { namespace net { _sock.bind(local_endpoint); } - class no_parallel_execution_guard final - { - std::atomic_bool* _flag; - public: - explicit no_parallel_execution_guard(std::atomic_bool* flag) : _flag(flag) - { - bool expected = false; - FC_ASSERT( flag->compare_exchange_strong( expected, true ), "Only one thread at time can visit it"); - } - ~no_parallel_execution_guard() - { - *_flag = false; - } - }; - void message_oriented_connection_impl::read_loop() { VERIFY_CORRECT_THREAD(); @@ -162,7 +145,6 @@ namespace graphene { namespace net { const int LEFTOVER = BUFFER_SIZE - sizeof(message_header); static_assert(BUFFER_SIZE >= sizeof(message_header), "insufficient buffer"); - no_parallel_execution_guard guard( &_read_loop_in_progress ); _connected_time = fc::time_point::now(); fc::oexception exception_to_rethrow; @@ -259,7 +241,17 @@ namespace graphene { namespace net { } send_message_scope_logger(remote_endpoint); #endif #endif - no_parallel_execution_guard guard( &_send_message_in_progress ); + struct verify_no_send_in_progress { + bool& var; + verify_no_send_in_progress(bool& var) : var(var) + { + if (var) + elog("Error: two tasks are calling message_oriented_connection::send_message() at the same time"); + assert(!var); + var = true; + } + ~verify_no_send_in_progress() { var = false; } + } _verify_no_send_in_progress(_send_message_in_progress); try { diff --git a/libraries/net/node.cpp b/libraries/net/node.cpp index 0fc61dde..a38199fd 100644 --- a/libraries/net/node.cpp +++ b/libraries/net/node.cpp @@ -66,7 +66,6 @@ #include #include #include -#include #include #include #include @@ -1250,7 +1249,7 @@ namespace graphene { namespace net { namespace detail { for (const peer_connection_ptr& peer : _active_connections) { // only advertise to peers who are in sync with us - idump((peer->peer_needs_sync_items_from_us)); + wdump((peer->peer_needs_sync_items_from_us)); if( !peer->peer_needs_sync_items_from_us ) { std::map > items_to_advertise_by_type; @@ -1258,7 +1257,7 @@ namespace graphene { namespace net { namespace detail { // or anything it has advertised to us // group the items we need to send by type, because we'll need to send one inventory message per type unsigned total_items_to_send_to_this_peer = 0; - idump((inventory_to_advertise)); + wdump((inventory_to_advertise)); for (const item_id& item_to_advertise : inventory_to_advertise) { auto adv_to_peer = peer->inventory_advertised_to_peer.find(item_to_advertise); @@ -1277,9 +1276,9 @@ namespace graphene { namespace net { namespace detail { else { if (adv_to_peer != peer->inventory_advertised_to_peer.end() ) - idump( (*adv_to_peer) ); + wdump( (*adv_to_peer) ); if (adv_to_us != peer->inventory_peer_advertised_to_us.end() ) - idump( (*adv_to_us) ); + wdump( (*adv_to_us) ); } } dlog("advertising ${count} new item(s) of ${types} type(s) to peer ${endpoint}", @@ -2279,7 +2278,7 @@ namespace graphene { namespace net { namespace detail { bool disconnect_from_inhibited_peer = false; // if our client doesn't have any items after the item the peer requested, it will send back // a list containing the last item the peer requested - idump((reply_message)(fetch_blockchain_item_ids_message_received.blockchain_synopsis)); + wdump((reply_message)(fetch_blockchain_item_ids_message_received.blockchain_synopsis)); if( reply_message.item_hashes_available.empty() ) originating_peer->peer_needs_sync_items_from_us = false; /* I have no items in my blockchain */ else if( !fetch_blockchain_item_ids_message_received.blockchain_synopsis.empty() && @@ -2650,6 +2649,11 @@ namespace graphene { namespace net { namespace detail { if (!item_hashes_received.empty() && !originating_peer->ids_of_items_to_get.empty()) assert(item_hashes_received.front() != originating_peer->ids_of_items_to_get.back()); + // append the remaining items to the peer's list + boost::push_back(originating_peer->ids_of_items_to_get, item_hashes_received); + + originating_peer->number_of_unfetched_item_ids = blockchain_item_ids_inventory_message_received.total_remaining_item_count; + // at any given time, there's a maximum number of blocks that can possibly be out there // [(now - genesis time) / block interval]. If they offer us more blocks than that, // they must be an attacker or have a buggy client. @@ -2672,12 +2676,6 @@ namespace graphene { namespace net { namespace detail { return; } - - // append the remaining items to the peer's list - boost::push_back(originating_peer->ids_of_items_to_get, item_hashes_received); - - originating_peer->number_of_unfetched_item_ids = blockchain_item_ids_inventory_message_received.total_remaining_item_count; - uint32_t new_number_of_unfetched_items = calculate_unsynced_block_count_from_all_peers(); if (new_number_of_unfetched_items != _total_number_of_unfetched_items) _delegate->sync_status(blockchain_item_ids_inventory_message_received.item_type, @@ -2937,7 +2935,7 @@ namespace graphene { namespace net { namespace detail { if( closing_connection_message_received.closing_due_to_error ) { - wlog( "Peer ${peer} is disconnecting us because of an error: ${msg}, exception: ${error}", + elog( "Peer ${peer} is disconnecting us because of an error: ${msg}, exception: ${error}", ( "peer", originating_peer->get_remote_endpoint() ) ( "msg", closing_connection_message_received.reason_for_closing ) ( "error", closing_connection_message_received.error ) ); diff --git a/libraries/net/peer_connection.cpp b/libraries/net/peer_connection.cpp index 9b753e6c..f1f20d3f 100644 --- a/libraries/net/peer_connection.cpp +++ b/libraries/net/peer_connection.cpp @@ -27,7 +27,6 @@ #include #include -#include #include #include @@ -261,7 +260,7 @@ namespace graphene { namespace net } catch ( fc::exception& e ) { - wlog( "fatal: error connecting to peer ${remote_endpoint}: ${e}", ("remote_endpoint", remote_endpoint )("e", e.to_detail_string() ) ); + elog( "fatal: error connecting to peer ${remote_endpoint}: ${e}", ("remote_endpoint", remote_endpoint )("e", e.to_detail_string() ) ); throw; } } // connect_to() @@ -313,24 +312,24 @@ namespace graphene { namespace net } catch (const fc::exception& send_error) { - wlog("Error sending message: ${exception}. Closing connection.", ("exception", send_error)); + elog("Error sending message: ${exception}. Closing connection.", ("exception", send_error)); try { close_connection(); } catch (const fc::exception& close_error) { - wlog("Caught error while closing connection: ${exception}", ("exception", close_error)); + elog("Caught error while closing connection: ${exception}", ("exception", close_error)); } return; } catch (const std::exception& e) { - wlog("message_oriented_exception::send_message() threw a std::exception(): ${what}", ("what", e.what())); + elog("message_oriented_exception::send_message() threw a std::exception(): ${what}", ("what", e.what())); } catch (...) { - wlog("message_oriented_exception::send_message() threw an unhandled exception"); + elog("message_oriented_exception::send_message() threw an unhandled exception"); } _queued_messages.front()->transmission_finish_time = fc::time_point::now(); _total_queued_messages_size -= _queued_messages.front()->get_size_in_queue(); @@ -346,7 +345,7 @@ namespace graphene { namespace net _queued_messages.emplace(std::move(message_to_send)); if (_total_queued_messages_size > GRAPHENE_NET_MAXIMUM_QUEUED_MESSAGES_IN_BYTES) { - wlog("send queue exceeded maximum size of ${max} bytes (current size ${current} bytes)", + elog("send queue exceeded maximum size of ${max} bytes (current size ${current} bytes)", ("max", GRAPHENE_NET_MAXIMUM_QUEUED_MESSAGES_IN_BYTES)("current", _total_queued_messages_size)); try { diff --git a/libraries/net/peer_database.cpp b/libraries/net/peer_database.cpp index 76ae9c8c..2b20364e 100644 --- a/libraries/net/peer_database.cpp +++ b/libraries/net/peer_database.cpp @@ -274,14 +274,3 @@ namespace graphene { namespace net { } } } // end namespace graphene::net - -FC_REFLECT_ENUM( graphene::net::potential_peer_last_connection_disposition, - (never_attempted_to_connect) - (last_connection_failed)(last_connection_rejected) - (last_connection_handshaking_failed)(last_connection_succeeded) ) -FC_REFLECT_DERIVED_NO_TYPENAME( graphene::net::potential_peer_record, BOOST_PP_SEQ_NIL, - (endpoint)(last_seen_time)(last_connection_disposition) - (last_connection_attempt_time)(number_of_successful_connection_attempts) - (number_of_failed_connection_attempts)(last_error) ) - -GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::net::potential_peer_record) diff --git a/libraries/plugins/CMakeLists.txt b/libraries/plugins/CMakeLists.txt index d2a5be16..fb944627 100644 --- a/libraries/plugins/CMakeLists.txt +++ b/libraries/plugins/CMakeLists.txt @@ -2,7 +2,6 @@ add_subdirectory( witness ) add_subdirectory( account_history ) add_subdirectory( accounts_list ) add_subdirectory( affiliate_stats ) -add_subdirectory( elasticsearch ) add_subdirectory( market_history ) add_subdirectory( delayed_node ) add_subdirectory( bookie ) @@ -11,4 +10,3 @@ add_subdirectory( generate_uia_sharedrop_genesis ) add_subdirectory( debug_witness ) add_subdirectory( snapshot ) add_subdirectory( peerplays_sidechain ) -add_subdirectory( es_objects ) diff --git a/libraries/plugins/account_history/account_history_plugin.cpp b/libraries/plugins/account_history/account_history_plugin.cpp index 67322f80..81acb01e 100644 --- a/libraries/plugins/account_history/account_history_plugin.cpp +++ b/libraries/plugins/account_history/account_history_plugin.cpp @@ -24,7 +24,7 @@ #include -#include +#include #include #include @@ -128,8 +128,8 @@ void account_history_plugin_impl::update_account_histories( const signed_block& if( op.op.which() == operation::tag< account_create_operation >::value ) impacted.insert( op.result.get() ); else - graphene::chain::operation_get_impacted_accounts( op.op, impacted ); - if( op.op.which() == operation::tag< lottery_end_operation >::value ) + graphene::app::operation_get_impacted_accounts( op.op, impacted ); + if( op.op.which() == operation::tag< lottery_end_operation >::value ) { auto lop = op.op.get< lottery_end_operation >(); auto asset_object = lop.lottery( db ); @@ -137,7 +137,6 @@ void account_history_plugin_impl::update_account_histories( const signed_block& for( auto benefactor : asset_object.lottery_options->benefactors ) impacted.insert( benefactor.id ); } - for( auto& a : other ) for( auto& item : a.account_auths ) impacted.insert( item.first ); diff --git a/libraries/plugins/accounts_list/accounts_list_plugin.cpp b/libraries/plugins/accounts_list/accounts_list_plugin.cpp index 757891ea..aabf711d 100644 --- a/libraries/plugins/accounts_list/accounts_list_plugin.cpp +++ b/libraries/plugins/accounts_list/accounts_list_plugin.cpp @@ -24,7 +24,7 @@ #include -#include +#include #include #include diff --git a/libraries/plugins/affiliate_stats/affiliate_stats_plugin.cpp b/libraries/plugins/affiliate_stats/affiliate_stats_plugin.cpp index da9c8a04..438b1aca 100644 --- a/libraries/plugins/affiliate_stats/affiliate_stats_plugin.cpp +++ b/libraries/plugins/affiliate_stats/affiliate_stats_plugin.cpp @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include diff --git a/libraries/plugins/bookie/bookie_plugin.cpp b/libraries/plugins/bookie/bookie_plugin.cpp index 261de241..f15ac2f7 100644 --- a/libraries/plugins/bookie/bookie_plugin.cpp +++ b/libraries/plugins/bookie/bookie_plugin.cpp @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include @@ -370,8 +370,8 @@ void bookie_plugin_impl::on_block_applied( const signed_block& ) assert(bet_iter != persistent_bets_by_bet_id.end()); if (bet_iter != persistent_bets_by_bet_id.end()) { - // ilog("Adding bet_canceled_operation ${canceled_id} to bet ${bet_id}'s associated operations", - // ("canceled_id", op.id)("bet_id", bet_canceled_op.bet_id)); + ilog("Adding bet_canceled_operation ${canceled_id} to bet ${bet_id}'s associated operations", + ("canceled_id", op.id)("bet_id", bet_canceled_op.bet_id)); if (is_operation_history_object_stored(op.id)) db.modify(*bet_iter, [&]( persistent_bet_object& obj ) { obj.associated_operations.emplace_back(op.id); @@ -386,8 +386,8 @@ void bookie_plugin_impl::on_block_applied( const signed_block& ) assert(bet_iter != persistent_bets_by_bet_id.end()); if (bet_iter != persistent_bets_by_bet_id.end()) { - // ilog("Adding bet_adjusted_operation ${adjusted_id} to bet ${bet_id}'s associated operations", - // ("adjusted_id", op.id)("bet_id", bet_adjusted_op.bet_id)); + ilog("Adding bet_adjusted_operation ${adjusted_id} to bet ${bet_id}'s associated operations", + ("adjusted_id", op.id)("bet_id", bet_adjusted_op.bet_id)); if (is_operation_history_object_stored(op.id)) db.modify(*bet_iter, [&]( persistent_bet_object& obj ) { obj.associated_operations.emplace_back(op.id); diff --git a/libraries/plugins/delayed_node/delayed_node_plugin.cpp b/libraries/plugins/delayed_node/delayed_node_plugin.cpp index d49129b0..3eadda34 100644 --- a/libraries/plugins/delayed_node/delayed_node_plugin.cpp +++ b/libraries/plugins/delayed_node/delayed_node_plugin.cpp @@ -65,7 +65,7 @@ void delayed_node_plugin::plugin_set_program_options(bpo::options_description& c void delayed_node_plugin::connect() { - my->client_connection = std::make_shared(*my->client.connect(my->remote_endpoint), GRAPHENE_MAX_NESTED_OBJECTS); + my->client_connection = std::make_shared(my->client.connect(my->remote_endpoint), GRAPHENE_MAX_NESTED_OBJECTS); my->database_api = my->client_connection->get_remote_api(0); my->client_connection_closed = my->client_connection->closed.connect([this] { connection_failed(); diff --git a/libraries/plugins/elasticsearch/CMakeLists.txt b/libraries/plugins/elasticsearch/CMakeLists.txt deleted file mode 100644 index f4815576..00000000 --- a/libraries/plugins/elasticsearch/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -file(GLOB HEADERS "include/graphene/elasticsearch/*.hpp") - -add_library( graphene_elasticsearch - elasticsearch_plugin.cpp - ) - -target_link_libraries( graphene_elasticsearch graphene_chain graphene_app curl ) -target_include_directories( graphene_elasticsearch - PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" ) - -if(MSVC) - set_source_files_properties(elasticsearch_plugin.cpp PROPERTIES COMPILE_FLAGS "/bigobj" ) -endif(MSVC) - -install( TARGETS - graphene_elasticsearch - - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib -) -INSTALL( FILES ${HEADERS} DESTINATION "include/graphene/elasticsearch" ) - diff --git a/libraries/plugins/elasticsearch/elasticsearch_plugin.cpp b/libraries/plugins/elasticsearch/elasticsearch_plugin.cpp deleted file mode 100644 index 484aef9c..00000000 --- a/libraries/plugins/elasticsearch/elasticsearch_plugin.cpp +++ /dev/null @@ -1,622 +0,0 @@ -/* - * Copyright (c) 2017 Cryptonomex, Inc., and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include -#include -#include -#include - -namespace graphene { namespace elasticsearch { - -namespace detail -{ - -class elasticsearch_plugin_impl -{ - public: - elasticsearch_plugin_impl(elasticsearch_plugin& _plugin) - : _self( _plugin ) - { curl = curl_easy_init(); } - virtual ~elasticsearch_plugin_impl(); - - bool update_account_histories( const signed_block& b ); - - graphene::chain::database& database() - { - return _self.database(); - } - - elasticsearch_plugin& _self; - primary_index< operation_history_index >* _oho_index; - - std::string _elasticsearch_node_url = "http://localhost:9200/"; - uint32_t _elasticsearch_bulk_replay = 10000; - uint32_t _elasticsearch_bulk_sync = 100; - bool _elasticsearch_visitor = false; - std::string _elasticsearch_basic_auth = ""; - std::string _elasticsearch_index_prefix = "peerplays-"; - bool _elasticsearch_operation_object = false; - uint32_t _elasticsearch_start_es_after_block = 0; - bool _elasticsearch_operation_string = true; - mode _elasticsearch_mode = mode::only_save; - CURL *curl; // curl handler - vector bulk_lines; // vector of op lines - vector prepare; - - graphene::utilities::ES es; - uint32_t limit_documents; - int16_t op_type; - operation_history_struct os; - block_struct bs; - visitor_struct vs; - bulk_struct bulk_line_struct; - std::string bulk_line; - std::string index_name; - bool is_sync = false; - fc::time_point last_sync; - private: - bool add_elasticsearch( const account_id_type account_id, const optional& oho, const uint32_t block_number ); - const account_transaction_history_object& addNewEntry(const account_statistics_object& stats_obj, - const account_id_type account_id, - const optional & oho); - const account_statistics_object& getStatsObject(const account_id_type account_id); - void growStats(const account_statistics_object& stats_obj, const account_transaction_history_object& ath); - void getOperationType(const optional & oho); - void doOperationHistory(const optional & oho); - void doBlock(const optional & oho, const signed_block& b); - void doVisitor(const optional & oho); - void checkState(const fc::time_point_sec& block_time); - void cleanObjects(const account_transaction_history_object& ath, account_id_type account_id); - void createBulkLine(const account_transaction_history_object& ath); - void prepareBulk(const account_transaction_history_id_type& ath_id); - void populateESstruct(); -}; - -elasticsearch_plugin_impl::~elasticsearch_plugin_impl() -{ - if (curl) { - curl_easy_cleanup(curl); - curl = nullptr; - } - return; -} - -bool elasticsearch_plugin_impl::update_account_histories( const signed_block& b ) -{ - checkState(b.timestamp); - index_name = graphene::utilities::generateIndexName(b.timestamp, _elasticsearch_index_prefix); - - graphene::chain::database& db = database(); - const vector >& hist = db.get_applied_operations(); - bool is_first = true; - auto skip_oho_id = [&is_first,&db,this]() { - if( is_first && db._undo_db.enabled() ) // this ensures that the current id is rolled back on undo - { - db.remove( db.create( []( operation_history_object& obj) {} ) ); - is_first = false; - } - else - _oho_index->use_next_id(); - }; - for( const optional< operation_history_object >& o_op : hist ) { - optional oho; - - auto create_oho = [&]() { - is_first = false; - return optional( - db.create([&](operation_history_object &h) { - if (o_op.valid()) - { - h.op = o_op->op; - h.result = o_op->result; - h.block_num = o_op->block_num; - h.trx_in_block = o_op->trx_in_block; - h.op_in_trx = o_op->op_in_trx; - h.virtual_op = o_op->virtual_op; - } - })); - }; - - if( !o_op.valid() ) { - skip_oho_id(); - continue; - } - oho = create_oho(); - - // populate what we can before impacted loop - getOperationType(oho); - doOperationHistory(oho); - doBlock(oho, b); - if(_elasticsearch_visitor) - doVisitor(oho); - - const operation_history_object& op = *o_op; - - // get the set of accounts this operation applies to - flat_set impacted; - vector other; - operation_get_required_authorities( op.op, impacted, impacted, other ); // fee_payer is added here - - if( op.op.which() == operation::tag< account_create_operation >::value ) - impacted.insert( op.result.get() ); - else - graphene::chain::operation_get_impacted_accounts( op.op, impacted ); - - for( auto& a : other ) - for( auto& item : a.account_auths ) - impacted.insert( item.first ); - - for( auto& account_id : impacted ) - { - if(!add_elasticsearch( account_id, oho, b.block_num() )) - return false; - } - } - // we send bulk at end of block when we are in sync for better real time client experience - if(is_sync) - { - populateESstruct(); - if(es.bulk_lines.size() > 0) - { - prepare.clear(); - if(!graphene::utilities::SendBulk(es)) - return false; - else - bulk_lines.clear(); - } - } - - return true; -} - -void elasticsearch_plugin_impl::checkState(const fc::time_point_sec& block_time) -{ - fc::time_point current_time(fc::time_point::now()); - if(((current_time - block_time) < fc::seconds(30)) || (current_time - last_sync > fc::seconds(60))) - { - limit_documents = _elasticsearch_bulk_sync; - is_sync = true; - last_sync = current_time; - } - else - { - limit_documents = _elasticsearch_bulk_replay; - is_sync = false; - } -} - -void elasticsearch_plugin_impl::getOperationType(const optional & oho) -{ - if (!oho->id.is_null()) - op_type = oho->op.which(); -} - -void elasticsearch_plugin_impl::doOperationHistory(const optional & oho) -{ - os.trx_in_block = oho->trx_in_block; - os.op_in_trx = oho->op_in_trx; - os.operation_result = fc::json::to_string(oho->result); - os.virtual_op = oho->virtual_op; - - if(_elasticsearch_operation_object) { - oho->op.visit(fc::from_static_variant(os.op_object, FC_PACK_MAX_DEPTH)); - adaptor_struct adaptor; - os.op_object = adaptor.adapt(os.op_object.get_object()); - } - if(_elasticsearch_operation_string) - os.op = fc::json::to_string(oho->op); -} - -void elasticsearch_plugin_impl::doBlock(const optional & oho, const signed_block& b) -{ - std::string trx_id = ""; - if(oho->trx_in_block < b.transactions.size()) - trx_id = b.transactions[oho->trx_in_block].id().str(); - bs.block_num = b.block_num(); - bs.block_time = b.timestamp; - bs.trx_id = trx_id; -} - -void elasticsearch_plugin_impl::doVisitor(const optional & oho) -{ - operation_visitor o_v; - oho->op.visit(o_v); - - vs.fee_data.asset = o_v.fee_asset; - vs.fee_data.amount = o_v.fee_amount; - - vs.transfer_data.asset = o_v.transfer_asset_id; - vs.transfer_data.amount = o_v.transfer_amount; - vs.transfer_data.from = o_v.transfer_from; - vs.transfer_data.to = o_v.transfer_to; - - vs.fill_data.order_id = o_v.fill_order_id; - vs.fill_data.account_id = o_v.fill_account_id; - vs.fill_data.pays_asset_id = o_v.fill_pays_asset_id; - vs.fill_data.pays_amount = o_v.fill_pays_amount; - vs.fill_data.receives_asset_id = o_v.fill_receives_asset_id; - vs.fill_data.receives_amount = o_v.fill_receives_amount; - //vs.fill_data.fill_price = o_v.fill_fill_price; - //vs.fill_data.is_maker = o_v.fill_is_maker; -} - -bool elasticsearch_plugin_impl::add_elasticsearch( const account_id_type account_id, - const optional & oho, - const uint32_t block_number) -{ - const auto &stats_obj = getStatsObject(account_id); - const auto &ath = addNewEntry(stats_obj, account_id, oho); - growStats(stats_obj, ath); - if(block_number > _elasticsearch_start_es_after_block) { - createBulkLine(ath); - prepareBulk(ath.id); - } - cleanObjects(ath, account_id); - - if (curl && bulk_lines.size() >= limit_documents) { // we are in bulk time, ready to add data to elasticsearech - prepare.clear(); - populateESstruct(); - if(!graphene::utilities::SendBulk(es)) - return false; - else - bulk_lines.clear(); - } - - return true; -} - -const account_statistics_object& elasticsearch_plugin_impl::getStatsObject(const account_id_type account_id) -{ - graphene::chain::database& db = database(); - const auto &acct = db.get(account_id); - return acct.statistics(db); -} - -const account_transaction_history_object& elasticsearch_plugin_impl::addNewEntry(const account_statistics_object& stats_obj, - const account_id_type account_id, - const optional & oho) -{ - graphene::chain::database& db = database(); - const auto &ath = db.create([&](account_transaction_history_object &obj) { - obj.operation_id = oho->id; - obj.account = account_id; - obj.sequence = stats_obj.total_ops + 1; - obj.next = stats_obj.most_recent_op; - }); - - return ath; -} - -void elasticsearch_plugin_impl::growStats(const account_statistics_object& stats_obj, - const account_transaction_history_object& ath) -{ - graphene::chain::database& db = database(); - db.modify(stats_obj, [&](account_statistics_object &obj) { - obj.most_recent_op = ath.id; - obj.total_ops = ath.sequence; - }); -} - -void elasticsearch_plugin_impl::createBulkLine(const account_transaction_history_object& ath) -{ - bulk_line_struct.account_history = ath; - bulk_line_struct.operation_history = os; - bulk_line_struct.operation_type = op_type; - bulk_line_struct.operation_id_num = ath.operation_id.instance.value; - bulk_line_struct.block_data = bs; - if(_elasticsearch_visitor) - bulk_line_struct.additional_data = vs; - bulk_line = fc::json::to_string(bulk_line_struct); -} - -void elasticsearch_plugin_impl::prepareBulk(const account_transaction_history_id_type& ath_id) -{ - const std::string _id = fc::json::to_string(ath_id); - fc::mutable_variant_object bulk_header; - bulk_header["_index"] = index_name; - bulk_header["_type"] = "data"; - bulk_header["_id"] = fc::to_string(ath_id.space_id) + "." + fc::to_string(ath_id.type_id) + "." + ath_id.instance; - prepare = graphene::utilities::createBulk(bulk_header, bulk_line); - bulk_lines.insert(bulk_lines.end(), prepare.begin(), prepare.end()); -} - -void elasticsearch_plugin_impl::cleanObjects(const account_transaction_history_object& ath, account_id_type account_id) -{ - graphene::chain::database& db = database(); - // remove everything except current object from ath - const auto &his_idx = db.get_index_type(); - const auto &by_seq_idx = his_idx.indices().get(); - auto itr = by_seq_idx.lower_bound(boost::make_tuple(account_id, 0)); - if (itr != by_seq_idx.end() && itr->account == account_id && itr->id != ath.id) { - // if found, remove the entry - const auto remove_op_id = itr->operation_id; - const auto itr_remove = itr; - ++itr; - db.remove( *itr_remove ); - // modify previous node's next pointer - // this should be always true, but just have a check here - if( itr != by_seq_idx.end() && itr->account == account_id ) - { - db.modify( *itr, [&]( account_transaction_history_object& obj ){ - obj.next = account_transaction_history_id_type(); - }); - } - // do the same on oho - const auto &by_opid_idx = his_idx.indices().get(); - if (by_opid_idx.find(remove_op_id) == by_opid_idx.end()) { - db.remove(remove_op_id(db)); - } - } -} - -void elasticsearch_plugin_impl::populateESstruct() -{ - es.curl = curl; - es.bulk_lines = bulk_lines; - es.elasticsearch_url = _elasticsearch_node_url; - es.auth = _elasticsearch_basic_auth; -} - -} // end namespace detail - -elasticsearch_plugin::elasticsearch_plugin() : - my( new detail::elasticsearch_plugin_impl(*this) ) -{ -} - -elasticsearch_plugin::~elasticsearch_plugin() -{ -} - -std::string elasticsearch_plugin::plugin_name()const -{ - return "elasticsearch"; -} -std::string elasticsearch_plugin::plugin_description()const -{ - return "Stores account history data in elasticsearch database(EXPERIMENTAL)."; -} - -void elasticsearch_plugin::plugin_set_program_options( - boost::program_options::options_description& cli, - boost::program_options::options_description& cfg - ) -{ - cli.add_options() - ("elasticsearch-node-url", boost::program_options::value(), - "Elastic Search database node url(http://localhost:9200/)") - ("elasticsearch-bulk-replay", boost::program_options::value(), - "Number of bulk documents to index on replay(10000)") - ("elasticsearch-bulk-sync", boost::program_options::value(), - "Number of bulk documents to index on a syncronied chain(100)") - ("elasticsearch-visitor", boost::program_options::value(), - "Use visitor to index additional data(slows down the replay(false))") - ("elasticsearch-basic-auth", boost::program_options::value(), - "Pass basic auth to elasticsearch database('')") - ("elasticsearch-index-prefix", boost::program_options::value(), - "Add a prefix to the index(peerplays-)") - ("elasticsearch-operation-object", boost::program_options::value(), - "Save operation as object(false)") - ("elasticsearch-start-es-after-block", boost::program_options::value(), - "Start doing ES job after block(0)") - ("elasticsearch-operation-string", boost::program_options::value(), - "Save operation as string. Needed to serve history api calls(true)") - ("elasticsearch-mode", boost::program_options::value(), - "Mode of operation: only_save(0), only_query(1), all(2) - Default: 0") - ; - cfg.add(cli); -} - -void elasticsearch_plugin::plugin_initialize(const boost::program_options::variables_map& options) -{ - my->_oho_index = database().add_index< primary_index< operation_history_index > >(); - database().add_index< primary_index< account_transaction_history_index > >(); - - if (options.count("elasticsearch-node-url")) { - my->_elasticsearch_node_url = options["elasticsearch-node-url"].as(); - } - if (options.count("elasticsearch-bulk-replay")) { - my->_elasticsearch_bulk_replay = options["elasticsearch-bulk-replay"].as(); - } - if (options.count("elasticsearch-bulk-sync")) { - my->_elasticsearch_bulk_sync = options["elasticsearch-bulk-sync"].as(); - } - if (options.count("elasticsearch-visitor")) { - my->_elasticsearch_visitor = options["elasticsearch-visitor"].as(); - } - if (options.count("elasticsearch-basic-auth")) { - my->_elasticsearch_basic_auth = options["elasticsearch-basic-auth"].as(); - } - if (options.count("elasticsearch-index-prefix")) { - my->_elasticsearch_index_prefix = options["elasticsearch-index-prefix"].as(); - } - if (options.count("elasticsearch-operation-object")) { - my->_elasticsearch_operation_object = options["elasticsearch-operation-object"].as(); - } - if (options.count("elasticsearch-start-es-after-block")) { - my->_elasticsearch_start_es_after_block = options["elasticsearch-start-es-after-block"].as(); - } - if (options.count("elasticsearch-operation-string")) { - my->_elasticsearch_operation_string = options["elasticsearch-operation-string"].as(); - } - if (options.count("elasticsearch-mode")) { - const auto option_number = options["elasticsearch-mode"].as(); - if(option_number > mode::all) - FC_THROW_EXCEPTION(fc::exception, "Elasticsearch mode not valid"); - my->_elasticsearch_mode = static_cast(options["elasticsearch-mode"].as()); - } - - if(my->_elasticsearch_mode != mode::only_query) { - if (my->_elasticsearch_mode == mode::all && !my->_elasticsearch_operation_string) - FC_THROW_EXCEPTION(fc::exception, - "If elasticsearch-mode is set to all then elasticsearch-operation-string need to be true"); - - database().applied_block.connect([this](const signed_block &b) { - if (!my->update_account_histories(b)) - FC_THROW_EXCEPTION(fc::exception, - "Error populating ES database, we are going to keep trying."); - }); - } -} - -void elasticsearch_plugin::plugin_startup() -{ - graphene::utilities::ES es; - es.curl = my->curl; - es.elasticsearch_url = my->_elasticsearch_node_url; - es.auth = my->_elasticsearch_basic_auth; - - if(!graphene::utilities::checkES(es)) - FC_THROW_EXCEPTION(fc::exception, "ES database is not up in url ${url}", ("url", my->_elasticsearch_node_url)); - ilog("elasticsearch ACCOUNT HISTORY: plugin_startup() begin"); -} - -operation_history_object elasticsearch_plugin::get_operation_by_id(operation_history_id_type id) -{ - const string operation_id_string = std::string(object_id_type(id)); - - const string query = R"( - { - "query": { - "match": - { - "account_history.operation_id": )" + operation_id_string + R"(" - } - } - } - )"; - - auto es = prepareHistoryQuery(query); - const auto response = graphene::utilities::simpleQuery(es); - variant variant_response = fc::json::from_string(response); - const auto source = variant_response["hits"]["hits"][size_t(0)]["_source"]; - return fromEStoOperation(source); -} - -vector elasticsearch_plugin::get_account_history( - const account_id_type account_id, - operation_history_id_type stop = operation_history_id_type(), - unsigned limit = 100, - operation_history_id_type start = operation_history_id_type()) -{ - const string account_id_string = std::string(object_id_type(account_id)); - - const auto stop_number = stop.instance.value; - const auto start_number = start.instance.value; - - string range = ""; - if(stop_number == 0) - range = " AND operation_id_num: ["+fc::to_string(stop_number)+" TO "+fc::to_string(start_number)+"]"; - else if(stop_number > 0) - range = " AND operation_id_num: {"+fc::to_string(stop_number)+" TO "+fc::to_string(start_number)+"]"; - - const string query = R"( - { - "size": )" + fc::to_string(limit) + R"(, - "sort" : [{ "operation_id_num" : {"order" : "desc"}}], - "query": { - "bool": { - "must": [ - { - "query_string": { - "query": "account_history.account: )" + account_id_string + range + R"(" - } - } - ] - } - } - } - )"; - - auto es = prepareHistoryQuery(query); - - vector result; - - if(!graphene::utilities::checkES(es)) - return result; - - const auto response = graphene::utilities::simpleQuery(es); - variant variant_response = fc::json::from_string(response); - - const auto hits = variant_response["hits"]["total"]["value"]; - uint32_t size; - if( hits.is_object() ) // ES-7 ? - size = static_cast(hits["value"].as_uint64()); - else // probably ES-6 - size = static_cast(hits.as_uint64()); - - size = std::min( size, limit ); - - for(unsigned i=0; i_elasticsearch_node_url; - es.index_prefix = my->_elasticsearch_index_prefix; - es.endpoint = es.index_prefix + "*/data/_search"; - es.query = query; - - return es; -} - -mode elasticsearch_plugin::get_running_mode() -{ - return my->_elasticsearch_mode; -} - - -} } diff --git a/libraries/plugins/elasticsearch/include/graphene/elasticsearch/elasticsearch_plugin.hpp b/libraries/plugins/elasticsearch/include/graphene/elasticsearch/elasticsearch_plugin.hpp deleted file mode 100644 index 01a83244..00000000 --- a/libraries/plugins/elasticsearch/include/graphene/elasticsearch/elasticsearch_plugin.hpp +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (c) 2017 Cryptonomex, Inc., and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#pragma once - -#include -#include -#include -#include - -namespace graphene { namespace elasticsearch { - using namespace chain; - -// -// Plugins should #define their SPACE_ID's so plugins with -// conflicting SPACE_ID assignments can be compiled into the -// same binary (by simply re-assigning some of the conflicting #defined -// SPACE_ID's in a build script). -// -// Assignment of SPACE_ID's cannot be done at run-time because -// various template automagic depends on them being known at compile -// time. -// -#ifndef ELASTICSEARCH_SPACE_ID -#define ELASTICSEARCH_SPACE_ID 6 -#endif - -namespace detail -{ - class elasticsearch_plugin_impl; -} - -enum mode { only_save = 0 , only_query = 1, all = 2 }; - -class elasticsearch_plugin : public graphene::app::plugin -{ - public: - elasticsearch_plugin(); - virtual ~elasticsearch_plugin(); - - std::string plugin_name()const override; - std::string plugin_description()const override; - virtual void plugin_set_program_options( - boost::program_options::options_description& cli, - boost::program_options::options_description& cfg) override; - virtual void plugin_initialize(const boost::program_options::variables_map& options) override; - virtual void plugin_startup() override; - - operation_history_object get_operation_by_id(operation_history_id_type id); - vector get_account_history(const account_id_type account_id, - operation_history_id_type stop, unsigned limit, operation_history_id_type start); - mode get_running_mode(); - - friend class detail::elasticsearch_plugin_impl; - std::unique_ptr my; - - private: - operation_history_object fromEStoOperation(variant source); - graphene::utilities::ES prepareHistoryQuery(string query); -}; - - -struct operation_visitor -{ - typedef void result_type; - - share_type fee_amount; - asset_id_type fee_asset; - - asset_id_type transfer_asset_id; - share_type transfer_amount; - account_id_type transfer_from; - account_id_type transfer_to; - - void operator()( const graphene::chain::transfer_operation& o ) - { - fee_asset = o.fee.asset_id; - fee_amount = o.fee.amount; - - transfer_asset_id = o.amount.asset_id; - transfer_amount = o.amount.amount; - transfer_from = o.from; - transfer_to = o.to; - } - - object_id_type fill_order_id; - account_id_type fill_account_id; - asset_id_type fill_pays_asset_id; - share_type fill_pays_amount; - asset_id_type fill_receives_asset_id; - share_type fill_receives_amount; - //double fill_fill_price; - //bool fill_is_maker; - - void operator()( const graphene::chain::fill_order_operation& o ) - { - fee_asset = o.fee.asset_id; - fee_amount = o.fee.amount; - - fill_order_id = o.order_id; - fill_account_id = o.account_id; - fill_pays_asset_id = o.pays.asset_id; - fill_pays_amount = o.pays.amount; - fill_receives_asset_id = o.receives.asset_id; - fill_receives_amount = o.receives.amount; - //fill_fill_price = o.fill_price.to_real(); - //fill_is_maker = o.is_maker; - } - - template - void operator()( const T& o ) - { - fee_asset = o.fee.asset_id; - fee_amount = o.fee.amount; - } -}; - -struct operation_history_struct { - int trx_in_block; - int op_in_trx; - std::string operation_result; - int virtual_op; - std::string op; - variant op_object; -}; - -struct block_struct { - int block_num; - fc::time_point_sec block_time; - std::string trx_id; -}; - -struct fee_struct { - asset_id_type asset; - share_type amount; -}; - -struct transfer_struct { - asset_id_type asset; - share_type amount; - account_id_type from; - account_id_type to; -}; - -struct fill_struct { - object_id_type order_id; - account_id_type account_id; - asset_id_type pays_asset_id; - share_type pays_amount; - asset_id_type receives_asset_id; - share_type receives_amount; - double fill_price; - bool is_maker; -}; - -struct visitor_struct { - fee_struct fee_data; - transfer_struct transfer_data; - fill_struct fill_data; -}; - -struct bulk_struct { - account_transaction_history_object account_history; - operation_history_struct operation_history; - int operation_type; - int operation_id_num; - block_struct block_data; - optional additional_data; -}; - -struct adaptor_struct { - variant adapt(const variant_object& op) - { - fc::mutable_variant_object o(op); - vector keys_to_rename; - for (auto i = o.begin(); i != o.end(); ++i) - { - auto& element = (*i).value(); - if (element.is_object()) - { - const string& name = (*i).key(); - auto& vo = element.get_object(); - if (vo.contains(name.c_str())) - keys_to_rename.emplace_back(name); - element = adapt(vo); - } - else if (element.is_array()) - adapt(element.get_array()); - } - for (const auto& i : keys_to_rename) - { - string new_name = i + "_"; - o[new_name] = variant(o[i]); - o.erase(i); - } - - if (o.find("memo") != o.end()) - { - auto& memo = o["memo"]; - if (memo.is_string()) - { - o["memo_"] = o["memo"]; - o.erase("memo"); - } - else if (memo.is_object()) - { - fc::mutable_variant_object tmp(memo.get_object()); - if (tmp.find("nonce") != tmp.end()) - { - tmp["nonce"] = tmp["nonce"].as_string(); - o["memo"] = tmp; - } - } - } - if (o.find("new_parameters") != o.end()) - { - auto& tmp = o["new_parameters"]; - if (tmp.is_object()) - { - fc::mutable_variant_object tmp2(tmp.get_object()); - if (tmp2.find("current_fees") != tmp2.end()) - { - tmp2.erase("current_fees"); - o["new_parameters"] = tmp2; - } - } - } - if (o.find("owner") != o.end() && o["owner"].is_string()) - { - o["owner_"] = o["owner"].as_string(); - o.erase("owner"); - } - if (o.find("proposed_ops") != o.end()) - { - o["proposed_ops"] = fc::json::to_string(o["proposed_ops"]); - } - if (o.find("initializer") != o.end()) - { - o["initializer"] = fc::json::to_string(o["initializer"]); - } - - variant v; - fc::to_variant(o, v, FC_PACK_MAX_DEPTH); - return v; - } - - void adapt(fc::variants& v) - { - for (auto& array_element : v) - { - if (array_element.is_object()) - array_element = adapt(array_element.get_object()); - else if (array_element.is_array()) - adapt(array_element.get_array()); - else - array_element = array_element.as_string(); - } - } -}; -} } //graphene::elasticsearch - -FC_REFLECT_ENUM( graphene::elasticsearch::mode, (only_save)(only_query)(all) ) -FC_REFLECT( graphene::elasticsearch::operation_history_struct, (trx_in_block)(op_in_trx)(operation_result)(virtual_op)(op)(op_object) ) -FC_REFLECT( graphene::elasticsearch::block_struct, (block_num)(block_time)(trx_id) ) -FC_REFLECT( graphene::elasticsearch::fee_struct, (asset)(amount) ) -FC_REFLECT( graphene::elasticsearch::transfer_struct, (asset)(amount)(from)(to) ) -FC_REFLECT( graphene::elasticsearch::fill_struct, (order_id)(account_id)(pays_asset_id)(pays_amount)(receives_asset_id)(receives_amount)(fill_price)(is_maker)) -FC_REFLECT( graphene::elasticsearch::visitor_struct, (fee_data)(transfer_data)(fill_data) ) -FC_REFLECT( graphene::elasticsearch::bulk_struct, (account_history)(operation_history)(operation_type)(operation_id_num)(block_data)(additional_data) ) diff --git a/libraries/plugins/es_objects/CMakeLists.txt b/libraries/plugins/es_objects/CMakeLists.txt deleted file mode 100644 index 92e3d150..00000000 --- a/libraries/plugins/es_objects/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -file(GLOB HEADERS "include/graphene/es_objects/*.hpp") - -add_library( graphene_es_objects - es_objects.cpp - ) - -target_link_libraries( graphene_es_objects graphene_chain graphene_app curl ) -target_include_directories( graphene_es_objects - PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" ) - -if(MSVC) - set_source_files_properties(es_objects.cpp PROPERTIES COMPILE_FLAGS "/bigobj" ) -endif(MSVC) - -install( TARGETS - graphene_es_objects - - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib -) -INSTALL( FILES ${HEADERS} DESTINATION "include/graphene/es_objects" ) - diff --git a/libraries/plugins/es_objects/es_objects.cpp b/libraries/plugins/es_objects/es_objects.cpp deleted file mode 100644 index b9083cbc..00000000 --- a/libraries/plugins/es_objects/es_objects.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/* - * Copyright (c) 2018 oxarbitrage, and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include - -#include - -#include -#include -#include -#include -#include -#include - -#include - -namespace graphene { namespace es_objects { - -namespace detail -{ - -class es_objects_plugin_impl -{ - public: - es_objects_plugin_impl(es_objects_plugin& _plugin) - : _self( _plugin ) - { curl = curl_easy_init(); } - virtual ~es_objects_plugin_impl(); - - bool index_database(const vector& ids, std::string action); - bool genesis(); - void remove_from_database(object_id_type id, std::string index); - - es_objects_plugin& _self; - std::string _es_objects_elasticsearch_url = "http://localhost:9200/"; - std::string _es_objects_auth = ""; - uint32_t _es_objects_bulk_replay = 10000; - uint32_t _es_objects_bulk_sync = 100; - bool _es_objects_proposals = true; - bool _es_objects_accounts = true; - bool _es_objects_assets = true; - bool _es_objects_balances = true; - bool _es_objects_limit_orders = true; - bool _es_objects_asset_bitasset = true; - std::string _es_objects_index_prefix = "ppobjects-"; - uint32_t _es_objects_start_es_after_block = 0; - CURL *curl; // curl handler - vector bulk; - vector prepare; - - bool _es_objects_keep_only_current = true; - - uint32_t block_number; - fc::time_point_sec block_time; - - private: - template - void prepareTemplate(T blockchain_object, string index_name); -}; - -bool es_objects_plugin_impl::genesis() -{ - - ilog("elasticsearch OBJECTS: inserting data from genesis"); - - graphene::chain::database &db = _self.database(); - - block_number = db.head_block_num(); - block_time = db.head_block_time(); - - if (_es_objects_accounts) { - auto &index_accounts = db.get_index(1, 2); - index_accounts.inspect_all_objects([this, &db](const graphene::db::object &o) { - auto obj = db.find_object(o.id); - auto a = static_cast(obj); - prepareTemplate(*a, "account"); - }); - } - if (_es_objects_assets) { - auto &index_assets = db.get_index(1, 3); - index_assets.inspect_all_objects([this, &db](const graphene::db::object &o) { - auto obj = db.find_object(o.id); - auto a = static_cast(obj); - prepareTemplate(*a, "asset"); - }); - } - if (_es_objects_balances) { - auto &index_balances = db.get_index(2, 5); - index_balances.inspect_all_objects([this, &db](const graphene::db::object &o) { - auto obj = db.find_object(o.id); - auto b = static_cast(obj); - prepareTemplate(*b, "balance"); - }); - } - - graphene::utilities::ES es; - es.curl = curl; - es.bulk_lines = bulk; - es.elasticsearch_url = _es_objects_elasticsearch_url; - es.auth = _es_objects_auth; - if (!graphene::utilities::SendBulk(es)) - FC_THROW_EXCEPTION(fc::exception, "Error inserting genesis data."); - else - bulk.clear(); - - return true; -} - -bool es_objects_plugin_impl::index_database(const vector& ids, std::string action) -{ - graphene::chain::database &db = _self.database(); - - block_time = db.head_block_time(); - block_number = db.head_block_num(); - - if(block_number > _es_objects_start_es_after_block) { - - // check if we are in replay or in sync and change number of bulk documents accordingly - uint32_t limit_documents = 0; - if ((fc::time_point::now() - block_time) < fc::seconds(30)) - limit_documents = _es_objects_bulk_sync; - else - limit_documents = _es_objects_bulk_replay; - - - for (auto const &value: ids) { - if (value.is() && _es_objects_proposals) { - auto obj = db.find_object(value); - auto p = static_cast(obj); - if (p != nullptr) { - if (action == "delete") - remove_from_database(p->id, "proposal"); - else - prepareTemplate(*p, "proposal"); - } - } else if (value.is() && _es_objects_accounts) { - auto obj = db.find_object(value); - auto a = static_cast(obj); - if (a != nullptr) { - if (action == "delete") - remove_from_database(a->id, "account"); - else - prepareTemplate(*a, "account"); - } - } else if (value.is() && _es_objects_assets) { - auto obj = db.find_object(value); - auto a = static_cast(obj); - if (a != nullptr) { - if (action == "delete") - remove_from_database(a->id, "asset"); - else - prepareTemplate(*a, "asset"); - } - } else if (value.is() && _es_objects_balances) { - auto obj = db.find_object(value); - auto b = static_cast(obj); - if (b != nullptr) { - if (action == "delete") - remove_from_database(b->id, "balance"); - else - prepareTemplate(*b, "balance"); - } - } else if (value.is() && _es_objects_limit_orders) { - auto obj = db.find_object(value); - auto l = static_cast(obj); - if (l != nullptr) { - if (action == "delete") - remove_from_database(l->id, "limitorder"); - else - prepareTemplate(*l, "limitorder"); - } - } else if (value.is() && _es_objects_asset_bitasset) { - auto obj = db.find_object(value); - auto ba = static_cast(obj); - if (ba != nullptr) { - if (action == "delete") - remove_from_database(ba->id, "bitasset"); - else - prepareTemplate(*ba, "bitasset"); - } - } - } - - if (curl && bulk.size() >= limit_documents) { // we are in bulk time, ready to add data to elasticsearech - - graphene::utilities::ES es; - es.curl = curl; - es.bulk_lines = bulk; - es.elasticsearch_url = _es_objects_elasticsearch_url; - es.auth = _es_objects_auth; - - if (!graphene::utilities::SendBulk(es)) - return false; - else - bulk.clear(); - } - } - - return true; -} - -void es_objects_plugin_impl::remove_from_database( object_id_type id, std::string index) -{ - if(_es_objects_keep_only_current) - { - fc::mutable_variant_object delete_line; - delete_line["_id"] = string(id); - delete_line["_index"] = _es_objects_index_prefix + index; - delete_line["_type"] = "data"; - fc::mutable_variant_object final_delete_line; - final_delete_line["delete"] = delete_line; - prepare.push_back(fc::json::to_string(final_delete_line)); - std::move(prepare.begin(), prepare.end(), std::back_inserter(bulk)); - prepare.clear(); - } -} - -template -void es_objects_plugin_impl::prepareTemplate(T blockchain_object, string index_name) -{ - fc::mutable_variant_object bulk_header; - bulk_header["_index"] = _es_objects_index_prefix + index_name; - bulk_header["_type"] = "data"; - if(_es_objects_keep_only_current) - { - bulk_header["_id"] = string(blockchain_object.id); - } - - adaptor_struct adaptor; - fc::variant blockchain_object_variant; - fc::to_variant( blockchain_object, blockchain_object_variant, GRAPHENE_NET_MAX_NESTED_OBJECTS ); - fc::mutable_variant_object o = adaptor.adapt(blockchain_object_variant.get_object()); - - o["object_id"] = string(blockchain_object.id); - o["block_time"] = block_time; - o["block_number"] = block_number; - - string data = fc::json::to_string(o); - - prepare = graphene::utilities::createBulk(bulk_header, std::move(data)); - std::move(prepare.begin(), prepare.end(), std::back_inserter(bulk)); - prepare.clear(); -} - -es_objects_plugin_impl::~es_objects_plugin_impl() -{ - if (curl) { - curl_easy_cleanup(curl); - curl = nullptr; - } - return; -} - -} // end namespace detail - -es_objects_plugin::es_objects_plugin() : - my( new detail::es_objects_plugin_impl(*this) ) -{ -} - -es_objects_plugin::~es_objects_plugin() -{ -} - -std::string es_objects_plugin::plugin_name()const -{ - return "es_objects"; -} -std::string es_objects_plugin::plugin_description()const -{ - return "Stores blockchain objects in ES database. Experimental."; -} - -void es_objects_plugin::plugin_set_program_options( - boost::program_options::options_description& cli, - boost::program_options::options_description& cfg - ) -{ - cli.add_options() - ("es-objects-elasticsearch-url", boost::program_options::value(), "Elasticsearch node url(http://localhost:9200/)") - ("es-objects-auth", boost::program_options::value(), "Basic auth username:password('')") - ("es-objects-bulk-replay", boost::program_options::value(), "Number of bulk documents to index on replay(10000)") - ("es-objects-bulk-sync", boost::program_options::value(), "Number of bulk documents to index on a synchronized chain(100)") - ("es-objects-proposals", boost::program_options::value(), "Store proposal objects(true)") - ("es-objects-accounts", boost::program_options::value(), "Store account objects(true)") - ("es-objects-assets", boost::program_options::value(), "Store asset objects(true)") - ("es-objects-balances", boost::program_options::value(), "Store balances objects(true)") - ("es-objects-limit-orders", boost::program_options::value(), "Store limit order objects(true)") - ("es-objects-asset-bitasset", boost::program_options::value(), "Store feed data(true)") - ("es-objects-index-prefix", boost::program_options::value(), "Add a prefix to the index(ppobjects-)") - ("es-objects-keep-only-current", boost::program_options::value(), "Keep only current state of the objects(true)") - ("es-objects-start-es-after-block", boost::program_options::value(), "Start doing ES job after block(0)") - ; - cfg.add(cli); -} - -void es_objects_plugin::plugin_initialize(const boost::program_options::variables_map& options) -{ - database().applied_block.connect([this](const signed_block &b) { - if(b.block_num() == 1) { - if (!my->genesis()) - FC_THROW_EXCEPTION(fc::exception, "Error populating genesis data."); - } - }); - - database().new_objects.connect([this]( const vector& ids, const flat_set& impacted_accounts ) { - if(!my->index_database(ids, "create")) - { - FC_THROW_EXCEPTION(fc::exception, "Error creating object from ES database, we are going to keep trying."); - } - }); - database().changed_objects.connect([this]( const vector& ids, const flat_set& impacted_accounts ) { - if(!my->index_database(ids, "update")) - { - FC_THROW_EXCEPTION(fc::exception, "Error updating object from ES database, we are going to keep trying."); - } - }); - database().removed_objects.connect([this](const vector& ids, const vector& objs, const flat_set& impacted_accounts) { - if(!my->index_database(ids, "delete")) - { - FC_THROW_EXCEPTION(fc::exception, "Error deleting object from ES database, we are going to keep trying."); - } - }); - - - if (options.count("es-objects-elasticsearch-url")) { - my->_es_objects_elasticsearch_url = options["es-objects-elasticsearch-url"].as(); - } - if (options.count("es-objects-auth")) { - my->_es_objects_auth = options["es-objects-auth"].as(); - } - if (options.count("es-objects-bulk-replay")) { - my->_es_objects_bulk_replay = options["es-objects-bulk-replay"].as(); - } - if (options.count("es-objects-bulk-sync")) { - my->_es_objects_bulk_sync = options["es-objects-bulk-sync"].as(); - } - if (options.count("es-objects-proposals")) { - my->_es_objects_proposals = options["es-objects-proposals"].as(); - } - if (options.count("es-objects-accounts")) { - my->_es_objects_accounts = options["es-objects-accounts"].as(); - } - if (options.count("es-objects-assets")) { - my->_es_objects_assets = options["es-objects-assets"].as(); - } - if (options.count("es-objects-balances")) { - my->_es_objects_balances = options["es-objects-balances"].as(); - } - if (options.count("es-objects-limit-orders")) { - my->_es_objects_limit_orders = options["es-objects-limit-orders"].as(); - } - if (options.count("es-objects-asset-bitasset")) { - my->_es_objects_asset_bitasset = options["es-objects-asset-bitasset"].as(); - } - if (options.count("es-objects-index-prefix")) { - my->_es_objects_index_prefix = options["es-objects-index-prefix"].as(); - } - if (options.count("es-objects-keep-only-current")) { - my->_es_objects_keep_only_current = options["es-objects-keep-only-current"].as(); - } - if (options.count("es-objects-start-es-after-block")) { - my->_es_objects_start_es_after_block = options["es-objects-start-es-after-block"].as(); - } -} - -void es_objects_plugin::plugin_startup() -{ - graphene::utilities::ES es; - es.curl = my->curl; - es.elasticsearch_url = my->_es_objects_elasticsearch_url; - es.auth = my->_es_objects_auth; - es.auth = my->_es_objects_index_prefix; - - if(!graphene::utilities::checkES(es)) - FC_THROW_EXCEPTION(fc::exception, "ES database is not up in url ${url}", ("url", my->_es_objects_elasticsearch_url)); - ilog("elasticsearch OBJECTS: plugin_startup() begin"); -} - -} } diff --git a/libraries/plugins/es_objects/include/graphene/es_objects/es_objects.hpp b/libraries/plugins/es_objects/include/graphene/es_objects/es_objects.hpp deleted file mode 100644 index fa91e3bd..00000000 --- a/libraries/plugins/es_objects/include/graphene/es_objects/es_objects.hpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2018 oxarbitrage, and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#pragma once - -#include -#include - -namespace graphene { namespace es_objects { - -using namespace chain; - -namespace detail -{ - class es_objects_plugin_impl; -} - -class es_objects_plugin : public graphene::app::plugin -{ - public: - es_objects_plugin(); - virtual ~es_objects_plugin(); - - std::string plugin_name()const override; - std::string plugin_description()const override; - virtual void plugin_set_program_options( - boost::program_options::options_description& cli, - boost::program_options::options_description& cfg) override; - virtual void plugin_initialize(const boost::program_options::variables_map& options) override; - virtual void plugin_startup() override; - - friend class detail::es_objects_plugin_impl; - std::unique_ptr my; -}; - -struct adaptor_struct { - fc::mutable_variant_object adapt(const variant_object &obj) { - fc::mutable_variant_object o(obj); - vector keys_to_rename; - for (auto i = o.begin(); i != o.end(); ++i) { - auto &element = (*i).value(); - if (element.is_object()) { - const string &name = (*i).key(); - auto &vo = element.get_object(); - if (vo.contains(name.c_str())) - keys_to_rename.emplace_back(name); - element = adapt(vo); - } else if (element.is_array()) - adapt(element.get_array()); - } - for (const auto &i : keys_to_rename) { - string new_name = i + "_"; - o[new_name] = variant(o[i]); - o.erase(i); - } - if (o.find("owner") != o.end() && o["owner"].is_string()) - { - o["owner_"] = o["owner"].as_string(); - o.erase("owner"); - } - if (o.find("active_special_authority") != o.end()) - { - o["active_special_authority"] = fc::json::to_string(o["active_special_authority"]); - } - if (o.find("owner_special_authority") != o.end()) - { - o["owner_special_authority"] = fc::json::to_string(o["owner_special_authority"]); - } - if (o.find("feeds") != o.end()) - { - o["feeds"] = fc::json::to_string(o["feeds"]); - } - if (o.find("operations") != o.end()) - { - o["operations"] = fc::json::to_string(o["operations"]); - } - - return o; - } - - void adapt(fc::variants &v) { - for (auto &array_element : v) { - if (array_element.is_object()) - array_element = adapt(array_element.get_object()); - else if (array_element.is_array()) - adapt(array_element.get_array()); - else - array_element = array_element.as_string(); - } - } -}; - -} } //graphene::es_objects diff --git a/libraries/plugins/snapshot/CMakeLists.txt b/libraries/plugins/snapshot/CMakeLists.txt index 728740de..227c3860 100644 --- a/libraries/plugins/snapshot/CMakeLists.txt +++ b/libraries/plugins/snapshot/CMakeLists.txt @@ -15,5 +15,3 @@ install( TARGETS LIBRARY DESTINATION lib ARCHIVE DESTINATION lib ) - -INSTALL( FILES ${HEADERS} DESTINATION "include/graphene/snapshot" ) diff --git a/libraries/plugins/snapshot/include/graphene/snapshot/snapshot.hpp b/libraries/plugins/snapshot/include/graphene/snapshot/snapshot.hpp index eb8d3a16..b3ee30c6 100644 --- a/libraries/plugins/snapshot/include/graphene/snapshot/snapshot.hpp +++ b/libraries/plugins/snapshot/include/graphene/snapshot/snapshot.hpp @@ -35,7 +35,6 @@ class snapshot_plugin : public graphene::app::plugin { ~snapshot_plugin() {} std::string plugin_name()const override; - std::string plugin_description()const override; virtual void plugin_set_program_options( boost::program_options::options_description &command_line_options, diff --git a/libraries/plugins/snapshot/snapshot.cpp b/libraries/plugins/snapshot/snapshot.cpp index f74ad589..fe856ecb 100644 --- a/libraries/plugins/snapshot/snapshot.cpp +++ b/libraries/plugins/snapshot/snapshot.cpp @@ -54,11 +54,6 @@ std::string snapshot_plugin::plugin_name()const return "snapshot"; } -std::string snapshot_plugin::plugin_description()const -{ - return "Create snapshots at a specified time or block number."; -} - void snapshot_plugin::plugin_initialize(const boost::program_options::variables_map& options) { try { ilog("snapshot plugin: plugin_initialize() begin"); diff --git a/libraries/utilities/CMakeLists.txt b/libraries/utilities/CMakeLists.txt index 98086b10..f2d646d5 100644 --- a/libraries/utilities/CMakeLists.txt +++ b/libraries/utilities/CMakeLists.txt @@ -14,7 +14,6 @@ set(sources string_escape.cpp tempdir.cpp words.cpp - elasticsearch.cpp ${HEADERS}) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/git_revision.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/git_revision.cpp" @ONLY) diff --git a/libraries/utilities/elasticsearch.cpp b/libraries/utilities/elasticsearch.cpp deleted file mode 100644 index 11a9561b..00000000 --- a/libraries/utilities/elasticsearch.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2018 oxarbitrage, and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#include - -#include -#include -#include -#include - -size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) -{ - ((std::string*)userp)->append((char*)contents, size * nmemb); - return size * nmemb; -} - -namespace graphene { namespace utilities { - -bool checkES(ES& es) -{ - graphene::utilities::CurlRequest curl_request; - curl_request.handler = es.curl; - curl_request.url = es.elasticsearch_url + "_nodes"; - curl_request.auth = es.auth; - curl_request.type = "GET"; - - if(doCurl(curl_request).empty()) - return false; - return true; - -} -const std::string simpleQuery(ES& es) -{ - graphene::utilities::CurlRequest curl_request; - curl_request.handler = es.curl; - curl_request.url = es.elasticsearch_url + es.endpoint; - curl_request.auth = es.auth; - curl_request.type = "POST"; - curl_request.query = es.query; - - return doCurl(curl_request); -} - -bool SendBulk(ES& es) -{ - std::string bulking = joinBulkLines(es.bulk_lines); - - graphene::utilities::CurlRequest curl_request; - curl_request.handler = es.curl; - curl_request.url = es.elasticsearch_url + "_bulk"; - curl_request.auth = es.auth; - curl_request.type = "POST"; - curl_request.query = bulking; - - auto curlResponse = doCurl(curl_request); - - if(handleBulkResponse(getResponseCode(curl_request.handler), curlResponse)) - return true; - return false; -} - -const std::string joinBulkLines(const std::vector& bulk) -{ - auto bulking = boost::algorithm::join(bulk, "\n"); - bulking = bulking + "\n"; - - return bulking; -} -long getResponseCode(CURL *handler) -{ - long http_code = 0; - curl_easy_getinfo (handler, CURLINFO_RESPONSE_CODE, &http_code); - return http_code; -} - -bool handleBulkResponse(long http_code, const std::string& CurlReadBuffer) -{ - if(http_code == 200) { - // all good, but check errors in response - fc::variant j = fc::json::from_string(CurlReadBuffer); - bool errors = j["errors"].as_bool(); - if(errors == true) { - return false; - } - } - else { - if(http_code == 413) { - elog( "413 error: Can be low disk space" ); - } - else if(http_code == 401) { - elog( "401 error: Unauthorized" ); - } - else { - elog( std::to_string(http_code) + " error: Unknown error" ); - } - return false; - } - return true; -} - -const std::vector createBulk(const fc::mutable_variant_object& bulk_header, const std::string& data) -{ - std::vector bulk; - fc::mutable_variant_object final_bulk_header; - final_bulk_header["index"] = bulk_header; - bulk.push_back(fc::json::to_string(final_bulk_header)); - bulk.push_back(data); - - return bulk; -} - -bool deleteAll(ES& es) -{ - graphene::utilities::CurlRequest curl_request; - curl_request.handler = es.curl; - curl_request.url = es.elasticsearch_url + es.index_prefix + "*"; - curl_request.auth = es.auth; - curl_request.type = "DELETE"; - - auto curl_response = doCurl(curl_request); - if(curl_response.empty()) - return false; - else - return true; -} -const std::string getEndPoint(ES& es) -{ - graphene::utilities::CurlRequest curl_request; - curl_request.handler = es.curl; - curl_request.url = es.elasticsearch_url + es.endpoint; - curl_request.auth = es.auth; - curl_request.type = "GET"; - - return doCurl(curl_request); -} - -const std::string generateIndexName(const fc::time_point_sec& block_date, const std::string& _elasticsearch_index_prefix) -{ - auto block_date_string = block_date.to_iso_string(); - std::vector parts; - boost::split(parts, block_date_string, boost::is_any_of("-")); - std::string index_name = _elasticsearch_index_prefix + parts[0] + "-" + parts[1]; - return index_name; -} - -const std::string doCurl(CurlRequest& curl) -{ - std::string CurlReadBuffer; - struct curl_slist *headers = NULL; - headers = curl_slist_append(headers, "Content-Type: application/json"); - - curl_easy_setopt(curl.handler, CURLOPT_HTTPHEADER, headers); - curl_easy_setopt(curl.handler, CURLOPT_URL, curl.url.c_str()); - curl_easy_setopt(curl.handler, CURLOPT_CUSTOMREQUEST, curl.type.c_str()); - if(curl.type == "POST") - { - curl_easy_setopt(curl.handler, CURLOPT_POST, true); - curl_easy_setopt(curl.handler, CURLOPT_POSTFIELDS, curl.query.c_str()); - } - curl_easy_setopt(curl.handler, CURLOPT_WRITEFUNCTION, WriteCallback); - curl_easy_setopt(curl.handler, CURLOPT_WRITEDATA, (void *)&CurlReadBuffer); - curl_easy_setopt(curl.handler, CURLOPT_USERAGENT, "libcrp/0.1"); - if(!curl.auth.empty()) - curl_easy_setopt(curl.handler, CURLOPT_USERPWD, curl.auth.c_str()); - curl_easy_perform(curl.handler); - - return CurlReadBuffer; -} - -} } // end namespace graphene::utilities diff --git a/libraries/utilities/include/graphene/utilities/elasticsearch.hpp b/libraries/utilities/include/graphene/utilities/elasticsearch.hpp deleted file mode 100644 index 898464b1..00000000 --- a/libraries/utilities/include/graphene/utilities/elasticsearch.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2018 oxarbitrage, and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#pragma once -#include -#include -#include - -#include -#include -#include - -size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp); - -namespace graphene { namespace utilities { - - class ES { - public: - CURL *curl; - std::vector bulk_lines; - std::string elasticsearch_url; - std::string index_prefix; - std::string auth; - std::string endpoint; - std::string query; - }; - class CurlRequest { - public: - CURL *handler; - std::string url; - std::string type; - std::string auth; - std::string query; - }; - - bool SendBulk(ES& es); - const std::vector createBulk(const fc::mutable_variant_object& bulk_header, const std::string& data); - bool checkES(ES& es); - const std::string simpleQuery(ES& es); - bool deleteAll(ES& es); - bool handleBulkResponse(long http_code, const std::string& CurlReadBuffer); - const std::string getEndPoint(ES& es); - const std::string generateIndexName(const fc::time_point_sec& block_date, const std::string& _elasticsearch_index_prefix); - const std::string doCurl(CurlRequest& curl); - const std::string joinBulkLines(const std::vector& bulk); - long getResponseCode(CURL *handler); - -} } // end namespace graphene::utilities diff --git a/libraries/wallet/include/graphene/wallet/wallet.hpp b/libraries/wallet/include/graphene/wallet/wallet.hpp index b051346d..364fb20b 100644 --- a/libraries/wallet/include/graphene/wallet/wallet.hpp +++ b/libraries/wallet/include/graphene/wallet/wallet.hpp @@ -498,11 +498,6 @@ class wallet_api * @ingroup Transaction Builder API */ signed_transaction sign_builder_transaction(transaction_handle_type transaction_handle, bool broadcast = true); - /** Broadcast signed transaction - * @param tx signed transaction - * @returns the transaction ID along with the signed transaction. - */ - pair broadcast_transaction(signed_transaction tx); /** * @ingroup Transaction Builder API */ @@ -602,12 +597,6 @@ class wallet_api */ bool load_wallet_file(string wallet_filename = ""); - /** Quitting from Peerplays wallet. - * - * The current wallet will be closed. - */ - void quit(); - /** Saves the current wallet to the given filename. * * @warning This does not change the wallet filename that will be used for future @@ -1307,12 +1296,6 @@ class wallet_api */ witness_object get_witness(string owner_account); - /** Returns true if the account is witness, false otherwise - * @param owner_account the name or id of the witness account owner, or the id of the witness - * @returns true if account is witness, false otherwise - */ - bool is_witness(string owner_account); - /** Returns information about the given committee_member. * @param owner_account the name or id of the committee_member account owner, or the id of the committee_member * @returns the information about the committee_member stored in the block chain @@ -1587,7 +1570,7 @@ class wallet_api vector< vesting_balance_object_with_info > get_vesting_balances( string account_name ); /** - * Withdraw a normal(old) vesting balance. + * Withdraw a vesting balance. * * @param witness_name The account name of the witness, also accepts account ID or vesting balance ID type. * @param amount The amount to withdraw. @@ -1600,20 +1583,6 @@ class wallet_api string asset_symbol, bool broadcast = false); - /** - * Withdraw a GPOS vesting balance. - * - * @param account_name The account name of the witness/user, also accepts account ID or vesting balance ID type. - * @param amount The amount to withdraw. - * @param asset_symbol The symbol of the asset to withdraw. - * @param broadcast true if you wish to broadcast the transaction - */ - signed_transaction withdraw_GPOS_vesting_balance( - string account_name, - string amount, - string asset_symbol, - bool broadcast = false); - /** Vote for a given committee_member. * * An account can publish a list of all committee_memberes they approve of. This @@ -1802,37 +1771,6 @@ class wallet_api */ signed_transaction sign_transaction(signed_transaction tx, bool broadcast = false); - /** Get transaction signers. - * - * Returns information about who signed the transaction, specifically, - * the corresponding public keys of the private keys used to sign the transaction. - * @param tx the signed transaction - * @return the set of public_keys - */ - flat_set get_transaction_signers(const signed_transaction &tx) const; - - /** Get key references. - * - * Returns accounts related to given public keys. - * @param keys public keys to search for related accounts - * @return the set of related accounts - */ - vector> get_key_references(const vector &keys) const; - - /** Signs a transaction. - * - * Given a fully-formed transaction with or without signatures, signs - * the transaction with the owned keys and optionally broadcasts the - * transaction. - * - * @param tx the unsigned transaction - * @param broadcast true if you wish to broadcast the transaction - * - * @return the signed transaction - */ - signed_transaction add_transaction_signature( signed_transaction tx, - bool broadcast = false ); - /** Returns an uninitialized object representing a given blockchain operation. * * This returns a default-initialized object of the given type; it can be used @@ -2171,8 +2109,6 @@ class wallet_api } } -extern template class fc::api; - FC_REFLECT( graphene::wallet::key_label, (label)(key) ) FC_REFLECT( graphene::wallet::blind_balance, (amount)(from)(to)(one_time_key)(blinding_factor)(commitment)(used) ) FC_REFLECT( graphene::wallet::blind_confirmation::output, (label)(pub_key)(decrypted_memo)(confirmation)(auth)(confirmation_receipt) ) @@ -2242,7 +2178,6 @@ FC_API( graphene::wallet::wallet_api, (set_fees_on_builder_transaction) (preview_builder_transaction) (sign_builder_transaction) - (broadcast_transaction) (propose_builder_transaction) (propose_builder_transaction2) (remove_builder_transaction) @@ -2294,7 +2229,6 @@ FC_API( graphene::wallet::wallet_api, (create_committee_member) (get_son) (get_witness) - (is_witness) (get_committee_member) (list_witnesses) (list_committee_members) @@ -2319,9 +2253,9 @@ FC_API( graphene::wallet::wallet_api, (update_witness) (create_worker) (update_worker_votes) + (create_vesting_balance) (get_vesting_balances) (withdraw_vesting) - (withdraw_GPOS_vesting_balance) (vote_for_committee_member) (vote_for_son) (update_son_votes) @@ -2350,9 +2284,6 @@ FC_API( graphene::wallet::wallet_api, (save_wallet_file) (serialize_transaction) (sign_transaction) - (get_transaction_signers) - (get_key_references) - (add_transaction_signature) (get_prototype_operation) (propose_parameter_change) (propose_fee_change) @@ -2408,7 +2339,6 @@ FC_API( graphene::wallet::wallet_api, (tournament_join) (tournament_leave) (rps_throw) - (create_vesting_balance) (get_upcoming_tournaments) (get_tournaments) (get_tournaments_by_state) @@ -2420,5 +2350,4 @@ FC_API( graphene::wallet::wallet_api, (get_matched_bets_for_bettor) (get_all_matched_bets_for_bettor) (buy_ticket) - (quit) ) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index f836fb70..aca8c04f 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -55,7 +55,6 @@ #include #include #include -#include #include #include #include @@ -91,8 +90,6 @@ # include #endif -template class fc::api; - #define BRAIN_KEY_WORD_COUNT 16 namespace graphene { namespace wallet { @@ -278,7 +275,6 @@ public: private: void claim_registered_account(const account_object& account) { - bool import_keys = false; auto it = _wallet.pending_account_registrations.find( account.name ); FC_ASSERT( it != _wallet.pending_account_registrations.end() ); for (const std::string& wif_key : it->second) @@ -294,13 +290,8 @@ private: // possibility of migrating to a fork where the // name is available, the user can always // manually re-register) - } else { - import_keys = true; } _wallet.pending_account_registrations.erase( it ); - - if (import_keys) - save_wallet_file(); } // after a son registration succeeds, this saves the private key in the wallet permanently @@ -376,8 +367,7 @@ private: for( const fc::optional& optional_account : owner_account_objects ) if (optional_account) { - std::string account_id = account_id_to_string(optional_account->id); - fc::optional witness_obj = _remote_db->get_witness_by_account(account_id); + fc::optional witness_obj = _remote_db->get_witness_by_account(optional_account->id); if (witness_obj) claim_registered_witness(optional_account->name); } @@ -645,13 +635,6 @@ public: fc::async([this, object]{subscribed_object_changed(object);}, "Object changed"); } - void quit() - { - ilog( "Quitting Cli Wallet ..." ); - - throw fc::canceled_exception(); - } - bool copy_wallet_file( string destination_filename ) { fc::path src_path = get_wallet_filename(); @@ -770,17 +753,9 @@ public: { return _remote_db->get_dynamic_global_properties(); } - std::string account_id_to_string(account_id_type id) const - { - std::string account_id = fc::to_string(id.space_id) - + "." + fc::to_string(id.type_id) - + "." + fc::to_string(id.instance.value); - return account_id; - } account_object get_account(account_id_type id) const { - std::string account_id = account_id_to_string(id); - auto rec = _remote_db->get_accounts({account_id}).front(); + auto rec = _remote_db->get_accounts({id}).front(); FC_ASSERT(rec); return *rec; } @@ -802,16 +777,9 @@ public: { return get_account(account_name_or_id).get_id(); } - std::string asset_id_to_string(asset_id_type id) const - { - std::string asset_id = fc::to_string(id.space_id) + - "." + fc::to_string(id.type_id) + - "." + fc::to_string(id.instance.value); - return asset_id; - } optional find_asset(asset_id_type id)const { - auto rec = _remote_db->get_assets({asset_id_to_string(id)}).front(); + auto rec = _remote_db->get_assets({id}).front(); if( rec ) _asset_cache[id] = *rec; return rec; @@ -1075,7 +1043,7 @@ public: ("chain_id", _chain_id) ); size_t account_pagination = 100; - vector< std::string > account_ids_to_send; + vector< account_id_type > account_ids_to_send; size_t n = _wallet.my_accounts.size(); account_ids_to_send.reserve( std::min( account_pagination, n ) ); auto it = _wallet.my_accounts.begin(); @@ -1090,8 +1058,7 @@ public: { assert( it != _wallet.my_accounts.end() ); old_accounts.push_back( *it ); - std::string account_id = account_id_to_string(old_accounts.back().id); - account_ids_to_send.push_back( account_id ); + account_ids_to_send.push_back( old_accounts.back().id ); ++it; } std::vector< optional< account_object > > accounts = _remote_db->get_accounts(account_ids_to_send); @@ -1123,7 +1090,6 @@ public: return true; } - void save_wallet_file(string wallet_filename = "") { // @@ -1138,7 +1104,7 @@ public: if( wallet_filename == "" ) wallet_filename = _wallet_filename; - ilog( "saving wallet to file ${fn}", ("fn", wallet_filename) ); + wlog( "saving wallet to file ${fn}", ("fn", wallet_filename) ); string data = fc::json::to_pretty_string( _wallet ); try @@ -1150,38 +1116,14 @@ public: // // http://en.wikipedia.org/wiki/Most_vexing_parse // - std::string tmp_wallet_filename = wallet_filename + ".tmp"; - fc::ofstream outfile{ fc::path( tmp_wallet_filename ) }; + fc::ofstream outfile{ fc::path( wallet_filename ) }; outfile.write( data.c_str(), data.length() ); outfile.flush(); outfile.close(); - - ilog( "saved successfully wallet to tmp file ${fn}", ("fn", tmp_wallet_filename) ); - - std::string wallet_file_content; - fc::read_file_contents(tmp_wallet_filename, wallet_file_content); - - if (wallet_file_content == data) { - dlog( "validated successfully tmp wallet file ${fn}", ("fn", tmp_wallet_filename) ); - fc::rename( tmp_wallet_filename, wallet_filename ); - dlog( "renamed successfully tmp wallet file ${fn}", ("fn", tmp_wallet_filename) ); - } - else - { - FC_THROW("tmp wallet file cannot be validated ${fn}", ("fn", tmp_wallet_filename) ); - } - - ilog( "successfully saved wallet to file ${fn}", ("fn", wallet_filename) ); - disable_umask_protection(); } catch(...) { - string ws_password = _wallet.ws_password; - _wallet.ws_password = ""; - elog("wallet file content is: ${data}", ("data", fc::json::to_pretty_string( _wallet ) ) ); - _wallet.ws_password = ws_password; - disable_umask_protection(); throw; } @@ -1243,20 +1185,6 @@ public: return _builder_transactions[transaction_handle] = sign_transaction(_builder_transactions[transaction_handle], broadcast); } - - pair broadcast_transaction(signed_transaction tx) - { - try { - _remote_net_broadcast->broadcast_transaction(tx); - } - catch (const fc::exception& e) { - elog("Caught exception while broadcasting tx ${id}: ${e}", - ("id", tx.id().str())("e", e.to_detail_string())); - throw; - } - return std::make_pair(tx.id(),tx); - } - signed_transaction propose_builder_transaction( transaction_handle_type handle, time_point_sec expiration = time_point::now() + fc::minutes(1), @@ -1817,7 +1745,7 @@ public: committee_member_create_operation committee_member_create_op; committee_member_create_op.committee_member_account = get_account_id(owner_account); committee_member_create_op.url = url; - if (_remote_db->get_committee_member_by_account(owner_account)) + if (_remote_db->get_committee_member_by_account(committee_member_create_op.committee_member_account)) FC_THROW("Account ${owner_account} is already a committee_member", ("owner_account", owner_account)); signed_transaction tx; @@ -1847,7 +1775,7 @@ public: // then maybe it's the owner account try { - std::string owner_account_id = account_id_to_string(get_account_id(owner_account)); + account_id_type owner_account_id = get_account_id(owner_account); fc::optional witness = _remote_db->get_witness_by_account(owner_account_id); if (witness) return *witness; @@ -1898,42 +1826,6 @@ public: FC_CAPTURE_AND_RETHROW( (owner_account) ) } - bool is_witness(string owner_account) - { - try - { - fc::optional witness_id = maybe_id(owner_account); - if (witness_id) - { - std::vector ids_to_get; - ids_to_get.push_back(*witness_id); - std::vector> witness_objects = _remote_db->get_witnesses(ids_to_get); - if (witness_objects.front()) - return true; - else - return false; - } - else - { - // then maybe it's the owner account - try - { - std::string owner_account_id = account_id_to_string(get_account_id(owner_account)); - fc::optional witness = _remote_db->get_witness_by_account(owner_account_id); - if (witness) - return true; - else - return false; - } - catch (const fc::exception&) - { - return false; - } - } - } - FC_CAPTURE_AND_RETHROW( (owner_account) ) - } - committee_member_object get_committee_member(string owner_account) { try @@ -1953,7 +1845,8 @@ public: // then maybe it's the owner account try { - fc::optional committee_member = _remote_db->get_committee_member_by_account(owner_account); + account_id_type owner_account_id = get_account_id(owner_account); + fc::optional committee_member = _remote_db->get_committee_member_by_account(owner_account_id); if (committee_member) return *committee_member; else @@ -2096,16 +1989,13 @@ public: return swi.son_id; }); std::vector> son_objects = _remote_db->get_sons(son_ids); - vector owners; + vector owners; for(auto obj: son_objects) { if (obj) - { - std::string acc_id = account_id_to_string(obj->son_account); - owners.push_back(acc_id); - } + owners.push_back(obj->son_account); } - vector< optional< account_object> > accs = _remote_db->get_accounts(owners); + vector> accs = _remote_db->get_accounts(owners); std::remove_if(son_objects.begin(), son_objects.end(), [](const fc::optional& obj) -> bool { return obj.valid(); }); map result; @@ -2228,7 +2118,7 @@ public: witness_create_op.initial_secret = enc.result(); - if (_remote_db->get_witness_by_account(account_id_to_string(witness_create_op.witness_account))) + if (_remote_db->get_witness_by_account(witness_create_op.witness_account)) FC_THROW("Account ${owner_account} is already a witness", ("owner_account", owner_account)); signed_transaction tx; @@ -2388,14 +2278,13 @@ public: vesting_balance_type vesting_type, bool broadcast /* = false */) { try { - FC_ASSERT( !is_locked() ); - account_object user_account = get_account(owner_account); + account_object son_account = get_account(owner_account); fc::optional asset_obj = get_asset(asset_symbol); FC_ASSERT(asset_obj, "Invalid asset symbol {asst}", ("asst", asset_symbol)); vesting_balance_create_operation op; - op.creator = user_account.get_id(); - op.owner = user_account.get_id(); + op.creator = son_account.get_id(); + op.owner = son_account.get_id(); op.amount = asset_obj->amount_from_string(amount); op.balance_type = vesting_type; if (op.balance_type == vesting_balance_type::son) @@ -2421,7 +2310,12 @@ public: return result; } - vector< vesting_balance_object > vbos = _remote_db->get_vesting_balances( account_name ); + // try casting to avoid a round-trip if we were given an account ID + fc::optional acct_id = maybe_id( account_name ); + if( !acct_id ) + acct_id = get_account( account_name ).id; + + vector< vesting_balance_object > vbos = _remote_db->get_vesting_balances( *acct_id ); if( vbos.size() == 0 ) return result; @@ -2442,21 +2336,12 @@ public: fc::optional vbid = maybe_id(witness_name); if( !vbid ) { - if (is_witness(witness_name)) - { - witness_object wit = get_witness( witness_name ); - FC_ASSERT( wit.pay_vb, "Account ${account} has no core Token ${TOKEN} vested and thus its not allowed to withdraw.", ("account", witness_name)("TOKEN", GRAPHENE_SYMBOL)); - vbid = wit.pay_vb; - } - else - FC_THROW("Account ${account} has no core Token ${TOKEN} vested and thus its not allowed to withdraw.", ("account", witness_name)("TOKEN", GRAPHENE_SYMBOL)); + witness_object wit = get_witness( witness_name ); + FC_ASSERT( wit.pay_vb ); + vbid = wit.pay_vb; } vesting_balance_object vbo = get_object< vesting_balance_object >( *vbid ); - - if(vbo.balance_type != vesting_balance_type::normal) - FC_THROW("Allowed to withdraw only Normal type vest balances with this method"); - vesting_balance_withdraw_operation vesting_balance_withdraw_op; vesting_balance_withdraw_op.vesting_balance = *vbid; @@ -2472,100 +2357,21 @@ public: } FC_CAPTURE_AND_RETHROW( (witness_name)(amount) ) } - signed_transaction withdraw_GPOS_vesting_balance( - string account_name, - string amount, - string asset_symbol, - bool broadcast = false) - { try { - - //Can be deleted after GPOS hardfork time - time_point_sec now = time_point::now(); - if(now < HARDFORK_GPOS_TIME) - FC_THROW("GPOS related functionality is not avaiable until next Spring"); - - asset_object asset_obj = get_asset( asset_symbol ); - vector< vesting_balance_object > vbos; - vesting_balance_object vbo; - fc::optional vbid = maybe_id(account_name); - if( !vbid ) - { - vbos = _remote_db->get_vesting_balances( account_name ); - if( vbos.size() == 0 ) - FC_THROW("Account ${account} has no core TOKEN vested and thus its not allowed to withdraw.", ("account", account_name)); - } - - //whether it is a witness or user, keep it in a container and iterate over to process all vesting balances and types - if(!vbos.size()) - vbos.emplace_back( get_object(*vbid) ); - - for (const vesting_balance_object& vesting_balance_obj: vbos) { - if(vesting_balance_obj.balance_type == vesting_balance_type::gpos) - { - vbo = vesting_balance_obj; - break; - } - } - - vesting_balance_withdraw_operation vesting_balance_withdraw_op; - - vesting_balance_withdraw_op.vesting_balance = vbo.id; - vesting_balance_withdraw_op.owner = vbo.owner; - vesting_balance_withdraw_op.amount = asset_obj.amount_from_string(amount); - - signed_transaction tx; - tx.operations.push_back( vesting_balance_withdraw_op ); - set_operation_fees( tx, _remote_db->get_global_properties().parameters.current_fees ); - tx.validate(); - - return sign_transaction( tx, broadcast ); - } FC_CAPTURE_AND_RETHROW( (account_name)(amount) ) - } - signed_transaction vote_for_committee_member(string voting_account, string committee_member, bool approve, bool broadcast /* = false */) { try { - std::vector vbo_info = get_vesting_balances(voting_account); - - time_point_sec now = time_point::now(); - if(now >= HARDFORK_GPOS_TIME) //can be removed after GPOS HARDFORK time pass - { - std::vector::iterator vbo_iter; - vbo_iter = std::find_if(vbo_info.begin(), vbo_info.end(), [](vesting_balance_object_with_info const& obj){return obj.balance_type == vesting_balance_type::gpos;}); - if( vbo_info.size() == 0 || vbo_iter == vbo_info.end()) - FC_THROW("Account ${account} has no core Token ${TOKEN} vested and will not be allowed to vote for the committee member", ("account", voting_account)("TOKEN", GRAPHENE_SYMBOL)); - } - account_object voting_account_object = get_account(voting_account); - fc::optional committee_member_obj = _remote_db->get_committee_member_by_account(committee_member); + account_id_type committee_member_owner_account_id = get_account_id(committee_member); + fc::optional committee_member_obj = _remote_db->get_committee_member_by_account(committee_member_owner_account_id); if (!committee_member_obj) FC_THROW("Account ${committee_member} is not registered as a committee_member", ("committee_member", committee_member)); - - bool update_vote_time = false; - if (approve) { auto insert_result = voting_account_object.options.votes.insert(committee_member_obj->vote_id); - if(now >= HARDFORK_GPOS_TIME) //can be removed after GPOS HARDFORK time pass - { - account_id_type stake_account = get_account_id(voting_account); - const auto gpos_info = _remote_db->get_gpos_info(stake_account); - const auto vesting_subperiod = _remote_db->get_global_properties().parameters.gpos_subperiod(); - const auto gpos_start_time = fc::time_point_sec(_remote_db->get_global_properties().parameters.gpos_period_start()); - const auto subperiod_start_time = gpos_start_time.sec_since_epoch() + (gpos_info.current_subperiod - 1) * vesting_subperiod; - - if (!insert_result.second && (gpos_info.last_voted_time.sec_since_epoch() >= subperiod_start_time)) - FC_THROW("Account ${account} was already voting for committee_member ${committee_member} in the current GPOS sub-period", ("account", voting_account)("committee_member", committee_member)); - else - update_vote_time = true; //Allow user to vote in each sub-period(Update voting time, which is reference in calculating VF) - } - else - { - if (!insert_result.second) - FC_THROW("Account ${account} was already voting for committee_member ${committee_member}", ("account", voting_account)("committee_member", committee_member)); - } + if (!insert_result.second) + FC_THROW("Account ${account} was already voting for committee_member ${committee_member}", ("account", voting_account)("committee_member", committee_member)); } else { @@ -2576,7 +2382,6 @@ public: account_update_operation account_update_op; account_update_op.account = voting_account_object.id; account_update_op.new_options = voting_account_object.options; - account_update_op.extensions.value.update_last_voting_time = update_vote_time; signed_transaction tx; tx.operations.push_back( account_update_op ); @@ -2591,13 +2396,6 @@ public: bool approve, bool broadcast /* = false */) { try { - - std::vector vbo_info = get_vesting_balances(voting_account); - std::vector::iterator vbo_iter; - vbo_iter = std::find_if(vbo_info.begin(), vbo_info.end(), [](vesting_balance_object_with_info const& obj){return obj.balance_type == vesting_balance_type::gpos;}); - if( vbo_info.size() == 0 || vbo_iter == vbo_info.end()) - FC_THROW("Account ${account} has no core Token ${TOKEN} vested and will not be allowed to vote for the SON account", ("account", voting_account)("TOKEN", GRAPHENE_SYMBOL)); - account_object voting_account_object = get_account(voting_account); account_id_type son_account_id = get_account_id(son); fc::optional son_obj = _remote_db->get_son_by_account(son_account_id); @@ -2674,57 +2472,26 @@ public: bool approve, bool broadcast /* = false */) { try { - std::vector vbo_info = get_vesting_balances(voting_account); - - time_point_sec now = time_point::now(); - if(now >= HARDFORK_GPOS_TIME) //can be removed after GPOS HARDFORK time pass - { - std::vector::iterator vbo_iter; - vbo_iter = std::find_if(vbo_info.begin(), vbo_info.end(), [](vesting_balance_object_with_info const& obj){return obj.balance_type == vesting_balance_type::gpos;}); - if( vbo_info.size() == 0 || vbo_iter == vbo_info.end()) - FC_THROW("Account ${account} has no core Token ${TOKEN} vested and will not be allowed to vote for the witness", ("account", voting_account)("TOKEN", GRAPHENE_SYMBOL)); - } - account_object voting_account_object = get_account(voting_account); - - fc::optional witness_obj = _remote_db->get_witness_by_account(witness); + account_id_type witness_owner_account_id = get_account_id(witness); + fc::optional witness_obj = _remote_db->get_witness_by_account(witness_owner_account_id); if (!witness_obj) FC_THROW("Account ${witness} is not registered as a witness", ("witness", witness)); - - bool update_vote_time = false; if (approve) { auto insert_result = voting_account_object.options.votes.insert(witness_obj->vote_id); - if(now >= HARDFORK_GPOS_TIME) //can be removed after GPOS HARDFORK time pass - { - account_id_type stake_account = get_account_id(voting_account); - const auto gpos_info = _remote_db->get_gpos_info(stake_account); - const auto vesting_subperiod = _remote_db->get_global_properties().parameters.gpos_subperiod(); - const auto gpos_start_time = fc::time_point_sec(_remote_db->get_global_properties().parameters.gpos_period_start()); - const auto subperiod_start_time = gpos_start_time.sec_since_epoch() + (gpos_info.current_subperiod - 1) * vesting_subperiod; - - if (!insert_result.second && (gpos_info.last_voted_time.sec_since_epoch() >= subperiod_start_time)) - FC_THROW("Account ${account} was already voting for witness ${witness} in the current GPOS sub-period", ("account", voting_account)("witness", witness)); - else - update_vote_time = true; //Allow user to vote in each sub-period(Update voting time, which is reference in calculating VF) - } - else - { - if (!insert_result.second) - FC_THROW("Account ${account} was already voting for witness ${witness}", ("account", voting_account)("witness", witness)); - } + if (!insert_result.second) + FC_THROW("Account ${account} was already voting for witness ${witness}", ("account", voting_account)("witness", witness)); } else { unsigned votes_removed = voting_account_object.options.votes.erase(witness_obj->vote_id); if (!votes_removed) - FC_THROW("Account ${account} has not voted for witness ${witness}", ("account", voting_account)("witness", witness)); + FC_THROW("Account ${account} is already not voting for witness ${witness}", ("account", voting_account)("witness", witness)); } - account_update_operation account_update_op; account_update_op.account = voting_account_object.id; account_update_op.new_options = voting_account_object.options; - account_update_op.extensions.value.update_last_voting_time = update_vote_time; signed_transaction tx; tx.operations.push_back( account_update_op ); @@ -2743,7 +2510,8 @@ public: account_object voting_account_object = get_account(voting_account); for (const std::string& witness : witnesses_to_approve) { - fc::optional witness_obj = _remote_db->get_witness_by_account(witness); + account_id_type witness_owner_account_id = get_account_id(witness); + fc::optional witness_obj = _remote_db->get_witness_by_account(witness_owner_account_id); if (!witness_obj) FC_THROW("Account ${witness} is not registered as a witness", ("witness", witness)); auto insert_result = voting_account_object.options.votes.insert(witness_obj->vote_id); @@ -2752,7 +2520,8 @@ public: } for (const std::string& witness : witnesses_to_reject) { - fc::optional witness_obj = _remote_db->get_witness_by_account(witness); + account_id_type witness_owner_account_id = get_account_id(witness); + fc::optional witness_obj = _remote_db->get_witness_by_account(witness_owner_account_id); if (!witness_obj) FC_THROW("Account ${witness} is not registered as a witness", ("witness", witness)); unsigned votes_removed = voting_account_object.options.votes.erase(witness_obj->vote_id); @@ -2893,84 +2662,6 @@ public: return tx; } - flat_set get_transaction_signers(const signed_transaction &tx) const - { - return tx.get_signature_keys(_chain_id); - } - - vector> get_key_references(const vector &keys) const - { - return _remote_db->get_key_references(keys); - } - - /** - * Get the required public keys to sign the transaction which had been - * owned by us - * - * NOTE, if `erase_existing_sigs` set to true, the original trasaction's - * signatures will be erased - * - * @param tx The transaction to be signed - * @param erase_existing_sigs - * The transaction could have been partially signed already, - * if set to false, the corresponding public key of existing - * signatures won't be returned. - * If set to true, the existing signatures will be erased and - * all required keys returned. - */ - set get_owned_required_keys( signed_transaction &tx, - bool erase_existing_sigs = true) - { - set pks = _remote_db->get_potential_signatures( tx ); - flat_set owned_keys; - owned_keys.reserve( pks.size() ); - std::copy_if( pks.begin(), pks.end(), - std::inserter( owned_keys, owned_keys.end() ), - [this]( const public_key_type &pk ) { - return _keys.find( pk ) != _keys.end(); - } ); - - if ( erase_existing_sigs ) - tx.signatures.clear(); - - return _remote_db->get_required_signatures( tx, owned_keys ); - } - - signed_transaction add_transaction_signature( signed_transaction tx, - bool broadcast ) - { - set approving_key_set = get_owned_required_keys(tx, false); - - if ( ( ( tx.ref_block_num == 0 && tx.ref_block_prefix == 0 ) || - tx.expiration == fc::time_point_sec() ) && - tx.signatures.empty() ) - { - auto dyn_props = get_dynamic_global_properties(); - auto parameters = get_global_properties().parameters; - fc::time_point_sec now = dyn_props.time; - tx.set_reference_block( dyn_props.head_block_id ); - tx.set_expiration( now + parameters.maximum_time_until_expiration ); - } - for ( const public_key_type &key : approving_key_set ) - tx.sign( get_private_key( key ), _chain_id ); - - if ( broadcast ) - { - try - { - _remote_net_broadcast->broadcast_transaction( tx ); - } - catch ( const fc::exception &e ) - { - elog( "Caught exception while broadcasting tx ${id}: ${e}", - ( "id", tx.id().str() )( "e", e.to_detail_string() ) ); - FC_THROW( "Caught exception while broadcasting tx" ); - } - } - - return tx; - } - signed_transaction sell_asset(string seller_account, string amount_to_sell, string symbol_to_sell, @@ -4136,8 +3827,8 @@ map wallet_api::list_accounts(const string& lowerbound, vector wallet_api::list_account_balances(const string& id) { if( auto real_id = detail::maybe_id(id) ) - return my->_remote_db->get_account_balances(id, flat_set()); - return my->_remote_db->get_account_balances(id, flat_set()); + return my->_remote_db->get_account_balances(*real_id, flat_set()); + return my->_remote_db->get_account_balances(get_account(id).id, flat_set()); } vector wallet_api::list_assets(const string& lowerbound, uint32_t limit)const @@ -4173,7 +3864,8 @@ asset wallet_api::get_lottery_balance( asset_id_type lottery_id )const vector wallet_api::get_account_history(string name, int limit) const { vector result; - + auto account_id = get_account(name).get_id(); + while (limit > 0) { bool skip_first_row = false; @@ -4193,7 +3885,7 @@ vector wallet_api::get_account_history(string name, int limit) int page_limit = skip_first_row ? std::min(100, limit + 1) : std::min(100, limit); - vector current = my->_remote_hist->get_account_history(name, operation_history_id_type(), + vector current = my->_remote_hist->get_account_history(account_id, operation_history_id_type(), page_limit, start); bool first_row = true; for (auto &o : current) @@ -4228,10 +3920,11 @@ vector wallet_api::get_relative_account_history(string name, u FC_ASSERT( start > 0 || limit <= 100 ); vector result; + auto account_id = get_account(name).get_id(); while( limit > 0 ) { - vector current = my->_remote_hist->get_relative_account_history(name, stop, std::min(100, limit), start); + vector current = my->_remote_hist->get_relative_account_history(account_id, stop, std::min(100, limit), start); for (auto &o : current) { std::stringstream ss; auto memo = o.op.visit(detail::operation_printer(ss, *my, o.result)); @@ -4252,22 +3945,22 @@ vector wallet_api::list_core_accounts()const vector wallet_api::get_market_history( string symbol1, string symbol2, uint32_t bucket , fc::time_point_sec start, fc::time_point_sec end )const { - return my->_remote_hist->get_market_history( symbol1, symbol2, bucket, start, end ); + return my->_remote_hist->get_market_history( get_asset_id(symbol1), get_asset_id(symbol2), bucket, start, end ); } vector wallet_api::get_limit_orders(string a, string b, uint32_t limit)const { - return my->_remote_db->get_limit_orders(a, b, limit); + return my->_remote_db->get_limit_orders(get_asset(a).id, get_asset(b).id, limit); } vector wallet_api::get_call_orders(string a, uint32_t limit)const { - return my->_remote_db->get_call_orders(a, limit); + return my->_remote_db->get_call_orders(get_asset(a).id, limit); } vector wallet_api::get_settle_orders(string a, uint32_t limit)const { - return my->_remote_db->get_settle_orders(a, limit); + return my->_remote_db->get_settle_orders(get_asset(a).id, limit); } brain_key_info wallet_api::suggest_brain_key()const @@ -4364,11 +4057,6 @@ signed_transaction wallet_api::sign_builder_transaction(transaction_handle_type return my->sign_builder_transaction(transaction_handle, broadcast); } -pair wallet_api::broadcast_transaction(signed_transaction tx) -{ - return my->broadcast_transaction(tx); -} - signed_transaction wallet_api::propose_builder_transaction( transaction_handle_type handle, time_point_sec expiration, @@ -4738,11 +4426,6 @@ witness_object wallet_api::get_witness(string owner_account) return my->get_witness(owner_account); } -bool wallet_api::is_witness(string owner_account) -{ - return my->is_witness(owner_account); -} - committee_member_object wallet_api::get_committee_member(string owner_account) { return my->get_committee_member(owner_account); @@ -4911,20 +4594,11 @@ signed_transaction wallet_api::withdraw_vesting( string witness_name, string amount, string asset_symbol, - bool broadcast) + bool broadcast /* = false */) { return my->withdraw_vesting( witness_name, amount, asset_symbol, broadcast ); } -signed_transaction wallet_api::withdraw_GPOS_vesting_balance( - string account_name, - string amount, - string asset_symbol, - bool broadcast) -{ - return my->withdraw_GPOS_vesting_balance( account_name, amount, asset_symbol, broadcast ); -} - signed_transaction wallet_api::vote_for_committee_member(string voting_account, string witness, bool approve, @@ -4993,22 +4667,6 @@ signed_transaction wallet_api::sign_transaction(signed_transaction tx, bool broa return my->sign_transaction( tx, broadcast); } FC_CAPTURE_AND_RETHROW( (tx) ) } -signed_transaction wallet_api::add_transaction_signature( signed_transaction tx, - bool broadcast ) -{ - return my->add_transaction_signature( tx, broadcast ); -} - -flat_set wallet_api::get_transaction_signers(const signed_transaction &tx) const -{ try { - return my->get_transaction_signers(tx); -} FC_CAPTURE_AND_RETHROW( (tx) ) } - -vector> wallet_api::get_key_references(const vector &keys) const -{ try { - return my->get_key_references(keys); -} FC_CAPTURE_AND_RETHROW( (keys) ) } - operation wallet_api::get_prototype_operation(string operation_name) { return my->get_prototype_operation( operation_name ); @@ -5196,11 +4854,6 @@ bool wallet_api::load_wallet_file( string wallet_filename ) return my->load_wallet_file( wallet_filename ); } -void wallet_api::quit() -{ - my->quit(); -} - void wallet_api::save_wallet_file( string wallet_filename ) { my->save_wallet_file( wallet_filename ); @@ -6738,10 +6391,7 @@ vesting_balance_object_with_info::vesting_balance_object_with_info( const vestin : vesting_balance_object( vbo ) { allowed_withdraw = get_allowed_withdraw( now ); - if(vbo.balance_type == vesting_balance_type::gpos) - allowed_withdraw_time = vbo.policy.get().begin_timestamp + vbo.policy.get().vesting_cliff_seconds; - else - allowed_withdraw_time = now; + allowed_withdraw_time = now; } } } // graphene::wallet diff --git a/programs/cli_wallet/main.cpp b/programs/cli_wallet/main.cpp index b7abdabe..d68f25b8 100644 --- a/programs/cli_wallet/main.cpp +++ b/programs/cli_wallet/main.cpp @@ -113,13 +113,11 @@ int main( int argc, char** argv ) cfg.appenders.push_back(fc::appender_config( "rpc", "file", fc::variant(ac, 5))); cfg.loggers = { fc::logger_config("default"), fc::logger_config( "rpc") }; - cfg.loggers.front().level = fc::log_level::warn; + cfg.loggers.front().level = fc::log_level::info; cfg.loggers.front().appenders = {"default"}; - cfg.loggers.back().level = fc::log_level::info; + cfg.loggers.back().level = fc::log_level::debug; cfg.loggers.back().appenders = {"rpc"}; - fc::configure_logging( cfg ); - fc::ecc::private_key committee_private_key = fc::ecc::private_key::regenerate(fc::sha256::hash(string("null_key"))); idump( (key_to_wif( committee_private_key ) ) ); @@ -176,7 +174,7 @@ int main( int argc, char** argv ) fc::http::websocket_client client; idump((wdata.ws_server)); auto con = client.connect( wdata.ws_server ); - auto apic = std::make_shared(*con, GRAPHENE_MAX_NESTED_OBJECTS); + auto apic = std::make_shared(con, GRAPHENE_MAX_NESTED_OBJECTS); auto remote_api = apic->get_remote_api< login_api >(1); edump((wdata.ws_user)(wdata.ws_password) ); @@ -215,7 +213,7 @@ int main( int argc, char** argv ) _websocket_server->on_connection([&wapi]( const fc::http::websocket_connection_ptr& c ){ std::cout << "here... \n"; wlog("." ); - auto wsc = std::make_shared(*c, GRAPHENE_MAX_NESTED_OBJECTS); + auto wsc = std::make_shared(c, GRAPHENE_MAX_NESTED_OBJECTS); wsc->register_api(wapi); c->set_session_data( wsc ); }); @@ -232,7 +230,7 @@ int main( int argc, char** argv ) if( options.count("rpc-tls-endpoint") ) { _websocket_tls_server->on_connection([&]( const fc::http::websocket_connection_ptr& c ){ - auto wsc = std::make_shared(*c, GRAPHENE_MAX_NESTED_OBJECTS); + auto wsc = std::make_shared(c, GRAPHENE_MAX_NESTED_OBJECTS); wsc->register_api(wapi); c->set_session_data( wsc ); }); diff --git a/programs/witness_node/CMakeLists.txt b/programs/witness_node/CMakeLists.txt index 44048602..e43172a0 100644 --- a/programs/witness_node/CMakeLists.txt +++ b/programs/witness_node/CMakeLists.txt @@ -11,7 +11,7 @@ endif() # We have to link against graphene_debug_witness because deficiency in our API infrastructure doesn't allow plugins to be fully abstracted #246 target_link_libraries( witness_node - PRIVATE graphene_app graphene_account_history graphene_affiliate_stats graphene_market_history graphene_witness graphene_chain graphene_debug_witness graphene_bookie graphene_egenesis_full fc graphene_snapshot graphene_es_objects peerplays_sidechain ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) + PRIVATE graphene_app graphene_account_history graphene_affiliate_stats graphene_market_history graphene_witness graphene_chain graphene_debug_witness graphene_bookie graphene_egenesis_full fc peerplays_sidechain ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) # also add dependencies to graphene_generate_genesis graphene_generate_uia_sharedrop_genesis if you want those plugins install( TARGETS diff --git a/programs/witness_node/genesis.json b/programs/witness_node/genesis.json index 12f2581e..1e18d592 100644 --- a/programs/witness_node/genesis.json +++ b/programs/witness_node/genesis.json @@ -1,5 +1,5 @@ { - "initial_timestamp": "2020-01-13T06:03:15", + "initial_timestamp": "2019-05-14T18:47:51", "max_core_supply": "1000000000000000", "initial_parameters": { "current_fees": { @@ -307,27 +307,6 @@ 75,{} ],[ 76,{} - ],[ - 77,{ - "lottery_asset": 2000000, - "price_per_kbyte": 10 - } - ],[ - 78,{ - "fee": 0 - } - ],[ - 79,{ - "fee": 0 - } - ],[ - 80,{ - "fee": 0 - } - ],[ - 81,{ - "fee": 2000000 - } ] ], "scale": 10000 @@ -374,20 +353,13 @@ "maximum_tournament_start_delay": 604800, "maximum_tournament_number_of_wins": 100, "extensions": { - "sweeps_distribution_percentage": 200, - "sweeps_distribution_asset": "1.3.0", - "sweeps_vesting_accumulator_account": "1.2.0", - "gpos_period": 15552000, - "gpos_subperiod": 2592000, - "gpos_period_start": 1601528400, - "gpos_vesting_lockin_period": 2592000, - "son_vesting_amount": 5000000, - "son_vesting_period": 172800, - "son_pay_daily_max": 20000000, - "son_pay_time": 86400, - "son_deregister_time": 43200, - "son_heartbeat_frequency": 180, - "son_down_time": 360 + "son_vesting_amount": 5000000, + "son_vesting_period": 172800, + "son_pay_daily_max": 20000000, + "son_pay_time": 86400, + "son_deregister_time": 43200, + "son_heartbeat_frequency": 180, + "son_down_time": 360 } }, "initial_bts_accounts": [], diff --git a/programs/witness_node/main.cpp b/programs/witness_node/main.cpp index 7823fed3..6675ee87 100644 --- a/programs/witness_node/main.cpp +++ b/programs/witness_node/main.cpp @@ -25,11 +25,8 @@ #include #include -#include #include #include -#include -#include #include //#include //#include @@ -37,7 +34,7 @@ #include #include #include -#include +//#include #include #include @@ -87,10 +84,7 @@ int main(int argc, char** argv) { "Space-separated list of plugins to activate"); auto witness_plug = node->register_plugin(); - auto debug_witness_plug = node->register_plugin(); auto history_plug = node->register_plugin(); - auto elasticsearch_plug = node->register_plugin(); - auto es_objects_plug = node->register_plugin(); auto market_history_plug = node->register_plugin(); //auto generate_genesis_plug = node->register_plugin(); //auto generate_uia_sharedrop_genesis_plug = node->register_plugin(); @@ -98,7 +92,7 @@ int main(int argc, char** argv) { auto affiliate_stats_plug = node->register_plugin(); auto bookie_plug = node->register_plugin(); auto peerplays_sidechain = node->register_plugin(); - auto snapshot_plug = node->register_plugin(); +// auto snapshot_plug = node->register_plugin(); // add plugin options to config try @@ -177,7 +171,7 @@ int main(int argc, char** argv) { exit_promise->set_value(signal); }, SIGTERM); - ilog("Started Peerplays node on a chain with ${h} blocks.", ("h", node->chain_database()->head_block_num())); + ilog("Started witness node on a chain with ${h} blocks.", ("h", node->chain_database()->head_block_num())); ilog("Chain ID is ${id}", ("id", node->chain_database()->get_chain_id()) ); int signal = exit_promise->wait(); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5162f692..b49e089e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -8,55 +8,51 @@ endif() file(GLOB UNIT_TESTS "tests/*.cpp") add_executable( chain_test ${UNIT_TESTS} ${COMMON_SOURCES} ) -target_link_libraries( chain_test graphene_chain graphene_app graphene_account_history graphene_bookie graphene_elasticsearch graphene_es_objects peerplays_sidechain graphene_egenesis_none fc graphene_wallet ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( chain_test graphene_chain graphene_app graphene_account_history graphene_bookie peerplays_sidechain graphene_egenesis_none fc graphene_wallet ${PLATFORM_SPECIFIC_LIBS} ) if(MSVC) set_source_files_properties( tests/serialization_tests.cpp PROPERTIES COMPILE_FLAGS "/bigobj" ) endif(MSVC) file(GLOB PERFORMANCE_TESTS "performance/*.cpp") add_executable( performance_test ${PERFORMANCE_TESTS} ${COMMON_SOURCES} ) -target_link_libraries( performance_test graphene_chain graphene_app graphene_account_history graphene_elasticsearch graphene_es_objects graphene_bookie graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( performance_test graphene_chain graphene_app graphene_account_history graphene_bookie graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) file(GLOB BENCH_MARKS "benchmarks/*.cpp") add_executable( chain_bench ${BENCH_MARKS} ${COMMON_SOURCES} ) -target_link_libraries( chain_bench graphene_chain graphene_app graphene_account_history graphene_elasticsearch graphene_es_objects graphene_bookie graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( chain_bench graphene_chain graphene_app graphene_account_history graphene_bookie graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) file(GLOB APP_SOURCES "app/*.cpp") add_executable( app_test ${APP_SOURCES} ) -target_link_libraries( app_test graphene_app graphene_account_history graphene_witness graphene_bookie graphene_elasticsearch graphene_es_objects graphene_net graphene_chain graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( app_test graphene_app graphene_account_history graphene_witness graphene_bookie graphene_net graphene_chain graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) file(GLOB INTENSE_SOURCES "intense/*.cpp") add_executable( intense_test ${INTENSE_SOURCES} ${COMMON_SOURCES} ) -target_link_libraries( intense_test graphene_chain graphene_app graphene_account_history graphene_elasticsearch graphene_es_objects graphene_bookie graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( intense_test graphene_chain graphene_app graphene_account_history graphene_bookie graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) file(GLOB BETTING_TESTS "betting/*.cpp") add_executable( betting_test ${BETTING_TESTS} ${COMMON_SOURCES} ) -target_link_libraries( betting_test graphene_chain graphene_app graphene_account_history graphene_elasticsearch graphene_es_objects graphene_bookie graphene_egenesis_none fc graphene_wallet ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( betting_test graphene_chain graphene_app graphene_account_history graphene_bookie graphene_egenesis_none fc graphene_wallet ${PLATFORM_SPECIFIC_LIBS} ) file(GLOB PEERPLAYS_SIDECHAIN_TESTS "peerplays_sidechain/*.cpp") add_executable( peerplays_sidechain_test ${PEERPLAYS_SIDECHAIN_TESTS} ${COMMON_SOURCES} ) -target_link_libraries( peerplays_sidechain_test graphene_chain graphene_app graphene_account_history graphene_bookie graphene_elasticsearch graphene_es_objects graphene_egenesis_none fc graphene_wallet ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( peerplays_sidechain_test graphene_chain graphene_app graphene_account_history graphene_bookie graphene_egenesis_none fc graphene_wallet ${PLATFORM_SPECIFIC_LIBS} ) file(GLOB TOURNAMENT_TESTS "tournament/*.cpp") add_executable( tournament_test ${TOURNAMENT_TESTS} ${COMMON_SOURCES} ) -target_link_libraries( tournament_test graphene_chain graphene_app graphene_account_history graphene_elasticsearch graphene_es_objects graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( tournament_test graphene_chain graphene_app graphene_account_history graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) file(GLOB RANDOM_SOURCES "random/*.cpp") add_executable( random_test ${RANDOM_SOURCES} ${COMMON_SOURCES} ) -target_link_libraries( random_test graphene_chain graphene_app graphene_elasticsearch graphene_es_objects graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( random_test graphene_chain graphene_app graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) file(GLOB CLI_SOURCES "cli/*.cpp") add_executable( cli_test ${CLI_SOURCES} ) if(WIN32) list(APPEND PLATFORM_SPECIFIC_LIBS ws2_32) endif() -target_link_libraries( cli_test graphene_chain graphene_app graphene_witness graphene_wallet graphene_elasticsearch graphene_es_objects graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) +target_link_libraries( cli_test graphene_chain graphene_app graphene_witness graphene_wallet graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) if(MSVC) set_source_files_properties( cli/main.cpp PROPERTIES COMPILE_FLAGS "/bigobj" ) endif(MSVC) -file(GLOB ES_SOURCES "elasticsearch/*.cpp") -add_executable( es_test ${ES_SOURCES} ${COMMON_SOURCES} ) -target_link_libraries( es_test graphene_chain graphene_app graphene_account_history graphene_elasticsearch graphene_es_objects graphene_egenesis_none fc ${PLATFORM_SPECIFIC_LIBS} ) - add_subdirectory( generate_empty_blocks ) diff --git a/tests/app/main.cpp b/tests/app/main.cpp index 68b9e1f0..b3775b1f 100644 --- a/tests/app/main.cpp +++ b/tests/app/main.cpp @@ -63,7 +63,6 @@ BOOST_AUTO_TEST_CASE( two_node_network ) app1.register_plugin(); boost::program_options::variables_map cfg; cfg.emplace("p2p-endpoint", boost::program_options::variable_value(string("127.0.0.1:0"), false)); - cfg.emplace("plugins", boost::program_options::variable_value(string(" "), false)); app1.initialize(app_dir.path(), cfg); cfg.emplace("genesis-json", boost::program_options::variable_value(create_genesis_file(app_dir), false)); diff --git a/tests/cli/cli_fixture.cpp b/tests/cli/cli_fixture.cpp index 8a382e0b..5b5fd7ad 100644 --- a/tests/cli/cli_fixture.cpp +++ b/tests/cli/cli_fixture.cpp @@ -129,7 +129,7 @@ client_connection::client_connection( wallet_data.ws_password = ""; websocket_connection = websocket_client.connect( wallet_data.ws_server ); - api_connection = std::make_shared(*websocket_connection, GRAPHENE_MAX_NESTED_OBJECTS); + api_connection = std::make_shared(websocket_connection, GRAPHENE_MAX_NESTED_OBJECTS); remote_login_api = api_connection->get_remote_api< graphene::app::login_api >(1); BOOST_CHECK(remote_login_api->login( wallet_data.ws_user, wallet_data.ws_password ) ); diff --git a/tests/cli/main.cpp b/tests/cli/main.cpp index 106f3c8c..cc155979 100644 --- a/tests/cli/main.cpp +++ b/tests/cli/main.cpp @@ -88,7 +88,6 @@ BOOST_AUTO_TEST_CASE( cli_vote_for_2_witnesses ) witness_object init1_obj = con.wallet_api_ptr->get_witness("init1"); int init1_start_votes = init1_obj.total_votes; // Vote for a witness - con.wallet_api_ptr->create_vesting_balance("nathan", "10000", "1.3.0", vesting_balance_type::gpos, true); signed_transaction vote_witness1_tx = con.wallet_api_ptr->vote_for_witness("nathan", "init1", true, true); // generate a block to get things started @@ -162,4 +161,4 @@ BOOST_AUTO_TEST_CASE( account_history_pagination ) } } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/cli/son.cpp b/tests/cli/son.cpp index 7b1f395e..3630000c 100644 --- a/tests/cli/son.cpp +++ b/tests/cli/son.cpp @@ -213,7 +213,6 @@ BOOST_AUTO_TEST_CASE( son_voting ) son2_obj = con.wallet_api_ptr->get_son("son2account"); son2_start_votes = son2_obj.total_votes; - con.wallet_api_ptr->create_vesting_balance("nathan", "1000", "1.3.0", vesting_balance_type::gpos, true); // Vote for a son1account BOOST_TEST_MESSAGE("Voting for son1account"); vote_son1_tx = con.wallet_api_ptr->vote_for_son("nathan", "son1account", true, true); @@ -332,10 +331,6 @@ BOOST_FIXTURE_TEST_CASE( select_top_fifteen_sons, cli_fixture ) BOOST_TEST_MESSAGE("Voting for SONs"); for(unsigned int i = 0; i < son_number + 1; i++) { - con.wallet_api_ptr->transfer( - "nathan", "sonaccount" + fc::to_pretty_string(i), "1000", "1.3.0", "Here are some CORE tokens for your new account", true ); - con.wallet_api_ptr->create_vesting_balance("sonaccount" + fc::to_pretty_string(i), "500", "1.3.0", vesting_balance_type::gpos, true); - std::string name = "sonaccount" + fc::to_pretty_string(i); vote_tx = con.wallet_api_ptr->vote_for_son(name, name, true, true); } @@ -454,7 +449,6 @@ BOOST_AUTO_TEST_CASE( update_son_votes_test ) rejected.clear(); accepted.push_back("son1account"); accepted.push_back("son2account"); - con.wallet_api_ptr->create_vesting_balance("nathan", "1000", "1.3.0", vesting_balance_type::gpos, true); update_votes_tx = con.wallet_api_ptr->update_son_votes("nathan", accepted, rejected, 2, true); BOOST_CHECK(generate_block()); @@ -475,7 +469,6 @@ BOOST_AUTO_TEST_CASE( update_son_votes_test ) accepted.clear(); rejected.clear(); rejected.push_back("son1account"); - con.wallet_api_ptr->create_vesting_balance("nathan", "1000", "1.3.0", vesting_balance_type::gpos, true); update_votes_tx = con.wallet_api_ptr->update_son_votes("nathan", accepted, rejected, 1, true); BOOST_CHECK(generate_maintenance_block()); @@ -626,9 +619,6 @@ BOOST_FIXTURE_TEST_CASE( cli_list_active_sons, cli_fixture ) "http://son" + fc::to_pretty_string(i), sidechain_public_keys, false); - con.wallet_api_ptr->transfer( - "nathan", "sonaccount" + fc::to_pretty_string(i), "1000", "1.3.0", "Here are some CORE tokens for your new account", true ); - con.wallet_api_ptr->create_vesting_balance("sonaccount" + fc::to_pretty_string(i), "500", "1.3.0", vesting_balance_type::gpos, true); } BOOST_CHECK(generate_maintenance_block()); @@ -701,10 +691,7 @@ BOOST_AUTO_TEST_CASE( maintenance_test ) BOOST_TEST_MESSAGE("Voting for SONs"); for(unsigned int i = 1; i < son_number + 1; i++) { - con.wallet_api_ptr->transfer( - "nathan", "sonaccount" + fc::to_pretty_string(i), "1000", "1.3.0", "Here are some CORE tokens for your new account", true ); - con.wallet_api_ptr->create_vesting_balance("sonaccount" + fc::to_pretty_string(i), "500", "1.3.0", vesting_balance_type::gpos, true); - con.wallet_api_ptr->vote_for_son("sonaccount" + fc::to_pretty_string(i), name, true, true); + con.wallet_api_ptr->vote_for_son("sonaccount" + fc::to_pretty_string(i), name, true, true); } BOOST_CHECK(generate_maintenance_block()); diff --git a/tests/common/database_fixture.cpp b/tests/common/database_fixture.cpp index ba5bde4e..4e171b14 100644 --- a/tests/common/database_fixture.cpp +++ b/tests/common/database_fixture.cpp @@ -29,9 +29,11 @@ #include #include #include -#include -#include +#include + +#include +#include #include #include #include @@ -52,6 +54,7 @@ #include #include #include +#include #include "database_fixture.hpp" @@ -79,7 +82,7 @@ database_fixture::database_fixture() std::cout << "running test " << boost::unit_test::framework::current_test_case().p_name << std::endl; } - //auto ahplugin = app.register_plugin(); + auto ahplugin = app.register_plugin(); auto mhplugin = app.register_plugin(); auto bookieplugin = app.register_plugin(); auto affiliateplugin = app.register_plugin(); @@ -110,7 +113,7 @@ database_fixture::database_fixture() // add account tracking for ahplugin for special test case with track-account enabled if( !options.count("track-account") && boost::unit_test::framework::current_test_case().p_name.value == "track_account") { std::vector track_account; - std::string track = "\"1.2.19\""; + std::string track = "\"1.2.18\""; track_account.push_back(track); options.insert(std::make_pair("track-account", boost::program_options::variable_value(track_account, false))); options.insert(std::make_pair("partial-operations", boost::program_options::variable_value(true, false))); @@ -120,63 +123,14 @@ database_fixture::database_fixture() std::vector track_account; std::string track = "\"1.2.0\""; track_account.push_back(track); - track = "\"1.2.18\""; + track = "\"1.2.17\""; track_account.push_back(track); options.insert(std::make_pair("track-account", boost::program_options::variable_value(track_account, false))); } - // standby votes tracking - if( boost::unit_test::framework::current_test_case().p_name.value == "track_votes_witnesses_disabled" || - boost::unit_test::framework::current_test_case().p_name.value == "track_votes_committee_disabled") { - app.chain_database()->enable_standby_votes_tracking( false ); - } - // app.initialize(); - - auto test_name = boost::unit_test::framework::current_test_case().p_name.value; - if(test_name == "elasticsearch_account_history" || test_name == "elasticsearch_suite" || - test_name == "elasticsearch_history_api") { - auto esplugin = app.register_plugin(); - esplugin->plugin_set_app(&app); - - options.insert(std::make_pair("elasticsearch-node-url", boost::program_options::variable_value(string("http://localhost:9200/"), false))); - options.insert(std::make_pair("elasticsearch-bulk-replay", boost::program_options::variable_value(uint32_t(2), false))); - options.insert(std::make_pair("elasticsearch-bulk-sync", boost::program_options::variable_value(uint32_t(2), false))); - options.insert(std::make_pair("elasticsearch-start-es-after-block", boost::program_options::variable_value(uint32_t(0), false))); - options.insert(std::make_pair("elasticsearch-visitor", boost::program_options::variable_value(false, false))); - options.insert(std::make_pair("elasticsearch-operation-object", boost::program_options::variable_value(true, false))); - options.insert(std::make_pair("elasticsearch-operation-string", boost::program_options::variable_value(true, false))); - options.insert(std::make_pair("elasticsearch-mode", boost::program_options::variable_value(uint16_t(2), false))); - - esplugin->plugin_initialize(options); - esplugin->plugin_startup(); - } - else { - auto ahplugin = app.register_plugin(); - app.enable_plugin("affiliate_stats"); - ahplugin->plugin_set_app(&app); - ahplugin->plugin_initialize(options); - ahplugin->plugin_startup(); - } - - if(test_name == "elasticsearch_objects" || test_name == "elasticsearch_suite") { - auto esobjects_plugin = app.register_plugin(); - esobjects_plugin->plugin_set_app(&app); - - options.insert(std::make_pair("es-objects-elasticsearch-url", boost::program_options::variable_value(string("http://localhost:9200/"), false))); - options.insert(std::make_pair("es-objects-bulk-replay", boost::program_options::variable_value(uint32_t(2), false))); - options.insert(std::make_pair("es-objects-bulk-sync", boost::program_options::variable_value(uint32_t(2), false))); - options.insert(std::make_pair("es-objects-proposals", boost::program_options::variable_value(true, false))); - options.insert(std::make_pair("es-objects-accounts", boost::program_options::variable_value(true, false))); - options.insert(std::make_pair("es-objects-assets", boost::program_options::variable_value(true, false))); - options.insert(std::make_pair("es-objects-balances", boost::program_options::variable_value(true, false))); - options.insert(std::make_pair("es-objects-limit-orders", boost::program_options::variable_value(true, false))); - options.insert(std::make_pair("es-objects-asset-bitasset", boost::program_options::variable_value(true, false))); - - esobjects_plugin->plugin_initialize(options); - esobjects_plugin->plugin_startup(); - } - + ahplugin->plugin_set_app(&app); + ahplugin->plugin_initialize(options); mhplugin->plugin_set_app(&app); mhplugin->plugin_initialize(options); bookieplugin->plugin_set_app(&app); @@ -184,6 +138,7 @@ database_fixture::database_fixture() affiliateplugin->plugin_set_app(&app); affiliateplugin->plugin_initialize(options); + ahplugin->plugin_startup(); mhplugin->plugin_startup(); bookieplugin->plugin_startup(); affiliateplugin->plugin_startup(); @@ -239,7 +194,7 @@ void database_fixture::verify_asset_supplies( const database& db ) const asset_dynamic_data_object& core_asset_data = db.get_core_asset().dynamic_asset_data_id(db); BOOST_CHECK(core_asset_data.fee_pool == 0); - const auto& statistics_index = db.get_index_type().indices(); + const simple_index& statistics_index = db.get_index_type>(); const auto& balance_index = db.get_index_type().indices(); const auto& settle_index = db.get_index_type().indices(); const auto& tournaments_index = db.get_index_type().indices(); diff --git a/tests/common/genesis_file_util.hpp b/tests/common/genesis_file_util.hpp index 27a2080f..e058df02 100644 --- a/tests/common/genesis_file_util.hpp +++ b/tests/common/genesis_file_util.hpp @@ -1,5 +1,5 @@ #pragma once -#include + ///////// /// @brief forward declaration, using as a hack to generate a genesis.json file /// for testing diff --git a/tests/elasticsearch/main.cpp b/tests/elasticsearch/main.cpp deleted file mode 100644 index 28d3522c..00000000 --- a/tests/elasticsearch/main.cpp +++ /dev/null @@ -1,535 +0,0 @@ -/* - * Copyright (c) 2018 oxarbitrage and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include -#include - -#include -#include - -#include "../common/database_fixture.hpp" - -#define BOOST_TEST_MODULE Elastic Search Database Tests -#include - -using namespace graphene::chain; -using namespace graphene::chain::test; -using namespace graphene::app; - -BOOST_FIXTURE_TEST_SUITE( elasticsearch_tests, database_fixture ) - -BOOST_AUTO_TEST_CASE(elasticsearch_account_history) { - try { - - CURL *curl; // curl handler - curl = curl_easy_init(); - - graphene::utilities::ES es; - es.curl = curl; - es.elasticsearch_url = "http://localhost:9200/"; - es.index_prefix = "peerplays-"; - //es.auth = "elastic:changeme"; - - // delete all first - auto delete_account_history = graphene::utilities::deleteAll(es); - fc::usleep(fc::milliseconds(1000)); // this is because index.refresh_interval, nothing to worry - - if(delete_account_history) { // all records deleted - - //account_id_type() do 3 ops - create_bitasset("USD", account_id_type()); - auto dan = create_account("dan"); - auto bob = create_account("bob"); - - generate_block(); - fc::usleep(fc::milliseconds(1000)); - - // for later use - //int asset_crobjeate_op_id = operation::tag::value; - //int account_create_op_id = operation::tag::value; - - string query = "{ \"query\" : { \"bool\" : { \"must\" : [{\"match_all\": {}}] } } }"; - es.endpoint = es.index_prefix + "*/data/_count"; - es.query = query; - - auto res = graphene::utilities::simpleQuery(es); - variant j = fc::json::from_string(res); - auto total = j["count"].as_string(); - BOOST_CHECK_EQUAL(total, "5"); - - es.endpoint = es.index_prefix + "*/data/_search"; - res = graphene::utilities::simpleQuery(es); - j = fc::json::from_string(res); - auto first_id = j["hits"]["hits"][size_t(0)]["_id"].as_string(); - BOOST_CHECK_EQUAL(first_id, "2.9.0"); - - generate_block(); - auto willie = create_account("willie"); - generate_block(); - - fc::usleep(fc::milliseconds(1000)); // index.refresh_interval - - es.endpoint = es.index_prefix + "*/data/_count"; - res = graphene::utilities::simpleQuery(es); - j = fc::json::from_string(res); - - total = j["count"].as_string(); - BOOST_CHECK_EQUAL(total, "7"); - - // do some transfers in 1 block - transfer(account_id_type()(db), bob, asset(100)); - transfer(account_id_type()(db), bob, asset(200)); - transfer(account_id_type()(db), bob, asset(300)); - - generate_block(); - fc::usleep(fc::milliseconds(1000)); // index.refresh_interval - - res = graphene::utilities::simpleQuery(es); - j = fc::json::from_string(res); - - total = j["count"].as_string(); - BOOST_CHECK_EQUAL(total, "13"); - - // check the visitor data - auto block_date = db.head_block_time(); - std::string index_name = graphene::utilities::generateIndexName(block_date, "peerplays-"); - - es.endpoint = index_name + "/data/2.9.12"; // we know last op is a transfer of amount 300 - res = graphene::utilities::getEndPoint(es); - j = fc::json::from_string(res); - auto last_transfer_amount = j["_source"]["operation_history"]["op_object"]["amount_"]["amount"].as_string(); - BOOST_CHECK_EQUAL(last_transfer_amount, "300"); - } - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE(elasticsearch_objects) { - try { - - CURL *curl; // curl handler - curl = curl_easy_init(); - - graphene::utilities::ES es; - es.curl = curl; - es.elasticsearch_url = "http://localhost:9200/"; - es.index_prefix = "ppobjects-"; - //es.auth = "elastic:changeme"; - - // delete all first - auto delete_objects = graphene::utilities::deleteAll(es); - - generate_block(); - fc::usleep(fc::milliseconds(1000)); - - if(delete_objects) { // all records deleted - - // asset and bitasset - create_bitasset("USD", account_id_type()); - generate_block(); - fc::usleep(fc::milliseconds(1000)); - - string query = "{ \"query\" : { \"bool\" : { \"must\" : [{\"match_all\": {}}] } } }"; - es.endpoint = es.index_prefix + "*/data/_count"; - es.query = query; - - auto res = graphene::utilities::simpleQuery(es); - variant j = fc::json::from_string(res); - auto total = j["count"].as_string(); - BOOST_CHECK_EQUAL(total, "2"); - - es.endpoint = es.index_prefix + "asset/data/_search"; - res = graphene::utilities::simpleQuery(es); - j = fc::json::from_string(res); - auto first_id = j["hits"]["hits"][size_t(0)]["_source"]["symbol"].as_string(); - BOOST_CHECK_EQUAL(first_id, "USD"); - - auto bitasset_data_id = j["hits"]["hits"][size_t(0)]["_source"]["bitasset_data_id"].as_string(); - es.endpoint = es.index_prefix + "bitasset/data/_search"; - es.query = "{ \"query\" : { \"bool\": { \"must\" : [{ \"term\": { \"object_id\": \""+bitasset_data_id+"\"}}] } } }"; - res = graphene::utilities::simpleQuery(es); - j = fc::json::from_string(res); - auto bitasset_object_id = j["hits"]["hits"][size_t(0)]["_source"]["object_id"].as_string(); - BOOST_CHECK_EQUAL(bitasset_object_id, bitasset_data_id); - } - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE(elasticsearch_suite) { - try { - - CURL *curl; // curl handler - curl = curl_easy_init(); - - graphene::utilities::ES es; - es.curl = curl; - es.elasticsearch_url = "http://localhost:9200/"; - es.index_prefix = "peerplays-"; - auto delete_account_history = graphene::utilities::deleteAll(es); - fc::usleep(fc::milliseconds(1000)); - es.index_prefix = "ppobjects-"; - auto delete_objects = graphene::utilities::deleteAll(es); - fc::usleep(fc::milliseconds(1000)); - - if(delete_account_history && delete_objects) { // all records deleted - - - } - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE(elasticsearch_history_api) { - try { - CURL *curl; // curl handler - curl = curl_easy_init(); - - graphene::utilities::ES es; - es.curl = curl; - es.elasticsearch_url = "http://localhost:9200/"; - es.index_prefix = "peerplays-"; - - auto delete_account_history = graphene::utilities::deleteAll(es); - - generate_block(); - fc::usleep(fc::milliseconds(1000)); - - if(delete_account_history) { - - create_bitasset("USD", account_id_type()); // create op 0 - const account_object& dan = create_account("dan"); // create op 1 - create_bitasset("CNY", dan.id); // create op 2 - create_bitasset("BTC", account_id_type()); // create op 3 - create_bitasset("XMR", dan.id); // create op 4 - create_bitasset("EUR", account_id_type()); // create op 5 - create_bitasset("OIL", dan.id); // create op 6 - - generate_block(); - fc::usleep(fc::milliseconds(1000)); - - graphene::app::history_api hist_api(app); - app.enable_plugin("elasticsearch"); - - // f(A, 0, 4, 9) = { 5, 3, 1, 0 } - auto histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 4, operation_history_id_type(9)); - - BOOST_CHECK_EQUAL(histories.size(), 4u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); - - // f(A, 0, 4, 6) = { 5, 3, 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 4, operation_history_id_type(6)); - BOOST_CHECK_EQUAL(histories.size(), 4u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); - - // f(A, 0, 4, 5) = { 5, 3, 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 4, operation_history_id_type(5)); - BOOST_CHECK_EQUAL(histories.size(), 4u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); - - // f(A, 0, 4, 4) = { 3, 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 4, operation_history_id_type(4)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); - - // f(A, 0, 4, 3) = { 3, 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 4, operation_history_id_type(3)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); - - // f(A, 0, 4, 2) = { 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 4, operation_history_id_type(2)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); - - // f(A, 0, 4, 1) = { 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 4, operation_history_id_type(1)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); - - // f(A, 0, 4, 0) = { 5, 3, 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 4, operation_history_id_type()); - BOOST_CHECK_EQUAL(histories.size(), 4u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); - - // f(A, 1, 5, 9) = { 5, 3 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(1), 5, operation_history_id_type(9)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - - // f(A, 1, 5, 6) = { 5, 3 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(1), 5, operation_history_id_type(6)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - - // f(A, 1, 5, 5) = { 5, 3 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(1), 5, operation_history_id_type(5)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - - // f(A, 1, 5, 4) = { 3 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(1), 5, operation_history_id_type(4)); - BOOST_CHECK_EQUAL(histories.size(), 1u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); - - // f(A, 1, 5, 3) = { 3 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(1), 5, operation_history_id_type(3)); - BOOST_CHECK_EQUAL(histories.size(), 1u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); - - // f(A, 1, 5, 2) = { } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(1), 5, operation_history_id_type(2)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // f(A, 1, 5, 1) = { } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(1), 5, operation_history_id_type(1)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // f(A, 1, 5, 0) = { 5, 3 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(1), 5, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - - // f(A, 0, 3, 9) = { 5, 3, 1 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 3, operation_history_id_type(9)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - - // f(A, 0, 3, 6) = { 5, 3, 1 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 3, operation_history_id_type(6)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - - // f(A, 0, 3, 5) = { 5, 3, 1 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 3, operation_history_id_type(5)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - - // f(A, 0, 3, 4) = { 3, 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 3, operation_history_id_type(4)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); - - // f(A, 0, 3, 3) = { 3, 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 3, operation_history_id_type(3)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); - - // f(A, 0, 3, 2) = { 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 3, operation_history_id_type(2)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); - - // f(A, 0, 3, 1) = { 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 3, operation_history_id_type(1)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); - - // f(A, 0, 3, 0) = { 5, 3, 1 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(), 3, operation_history_id_type()); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - - // f(B, 0, 4, 9) = { 6, 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(9)); - BOOST_CHECK_EQUAL(histories.size(), 4u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 2u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 1u); - - // f(B, 0, 4, 6) = { 6, 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(6)); - BOOST_CHECK_EQUAL(histories.size(), 4u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 2u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 1u); - - // f(B, 0, 4, 5) = { 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(5)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 2u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - - // f(B, 0, 4, 4) = { 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(4)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 2u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - - // f(B, 0, 4, 3) = { 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(3)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 2u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); - - // f(B, 0, 4, 2) = { 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(2)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 2u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); - - // f(B, 0, 4, 1) = { 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(1)); - BOOST_CHECK_EQUAL(histories.size(), 1u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); - - // f(B, 0, 4, 0) = { 6, 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type()); - BOOST_CHECK_EQUAL(histories.size(), 4u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 2u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 1u); - - // f(B, 2, 4, 9) = { 6, 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(9)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); - - // f(B, 2, 4, 6) = { 6, 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(6)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); - - // f(B, 2, 4, 5) = { 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(5)); - BOOST_CHECK_EQUAL(histories.size(), 1u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); - - // f(B, 2, 4, 4) = { 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(4)); - BOOST_CHECK_EQUAL(histories.size(), 1u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); - - // f(B, 2, 4, 3) = { } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(3)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // f(B, 2, 4, 2) = { } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(2)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // f(B, 2, 4, 1) = { } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(1)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // f(B, 2, 4, 0) = { 6, 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); - - // 0 limits - histories = hist_api.get_account_history("dan", operation_history_id_type(0), 0, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(3), 0, operation_history_id_type(9)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // non existent account - histories = hist_api.get_account_history("1.2.18", operation_history_id_type(0), 4, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // create a new account C = alice { 7 } - auto alice = create_account("alice"); - - generate_block(); - fc::usleep(fc::milliseconds(1000)); - - // f(C, 0, 4, 10) = { 7 } - histories = hist_api.get_account_history("alice", operation_history_id_type(0), 4, operation_history_id_type(10)); - BOOST_CHECK_EQUAL(histories.size(), 1u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 7u); - - // f(C, 8, 4, 10) = { } - histories = hist_api.get_account_history("alice", operation_history_id_type(8), 4, operation_history_id_type(10)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // f(A, 0, 10, 0) = { 7, 5, 3, 1, 0 } - histories = hist_api.get_account_history("1.2.0", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 5u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 7u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 5u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[4].id.instance(), 0u); - } - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} -BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/tests/block_tests.cpp b/tests/tests/block_tests.cpp index b7ed69fe..9f74a34c 100644 --- a/tests/tests/block_tests.cpp +++ b/tests/tests/block_tests.cpp @@ -745,8 +745,6 @@ BOOST_FIXTURE_TEST_CASE( maintenance_interval, database_fixture ) PUSH_TX( db, trx, ~0 ); trx.operations.clear(); } - - generate_block(); transfer(account_id_type()(db), nathan, asset(5000)); generate_blocks(maintenence_time - initial_properties.parameters.block_interval); @@ -961,23 +959,18 @@ BOOST_FIXTURE_TEST_CASE( pop_block_twice, database_fixture ) processed_transaction ptx; account_object committee_account_object = committee_account(db); - generate_block(skip_flags); // transfer from committee account to Sam account transfer(committee_account_object, sam_account_object, core.amount(100000)); generate_block(skip_flags); - private_key_type charlie_key = generate_private_key("charlie"); - create_account("charlie", charlie_key); + create_account("alice"); generate_block(skip_flags); + create_account("bob"); generate_block(skip_flags); - private_key_type bob_key = generate_private_key("bob"); - create_account("bob", bob_key); - generate_block(skip_flags); - + db.pop_block(); db.pop_block(); - } catch(const fc::exception& e) { edump( (e.to_detail_string()) ); throw; diff --git a/tests/tests/gpos_tests.cpp b/tests/tests/gpos_tests.cpp deleted file mode 100644 index aa9969ee..00000000 --- a/tests/tests/gpos_tests.cpp +++ /dev/null @@ -1,1453 +0,0 @@ -/* - * Copyright (c) 2018 oxarbitrage and contributors. - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "../common/database_fixture.hpp" - -#include - -using namespace graphene::chain; -using namespace graphene::chain::test; - -struct gpos_fixture: database_fixture -{ - const worker_object& create_worker( const account_id_type owner, const share_type daily_pay, - const fc::microseconds& duration ) { - worker_create_operation op; - op.owner = owner; - op.daily_pay = daily_pay; - op.initializer = vesting_balance_worker_initializer(1); - op.work_begin_date = db.head_block_time(); - op.work_end_date = op.work_begin_date + duration; - trx.operations.push_back(op); - set_expiration(db, trx); - trx.validate(); - processed_transaction ptx = db.push_transaction(trx, ~0); - trx.clear(); - return db.get(ptx.operation_results[0].get()); - } - const vesting_balance_object& create_vesting(const account_id_type owner, const asset amount, - const vesting_balance_type type) - { - vesting_balance_create_operation op; - op.creator = owner; - op.owner = owner; - op.amount = amount; - op.balance_type = type; - - trx.operations.push_back(op); - set_expiration(db, trx); - processed_transaction ptx = PUSH_TX(db, trx, ~0); - trx.clear(); - return db.get(ptx.operation_results[0].get()); - } - - void withdraw_gpos_vesting(const vesting_balance_id_type v_bid, const account_id_type owner, const asset amount, - /*const vesting_balance_type type, */const fc::ecc::private_key& key) - { - vesting_balance_withdraw_operation op; - op.vesting_balance = v_bid; - op.owner = owner; - op.amount = amount; - //op.balance_type = type; - - trx.operations.push_back(op); - set_expiration(db, trx); - trx.validate(); - sign(trx, key); - PUSH_TX(db, trx); - trx.clear(); - } - - void update_payout_interval(std::string asset_name, fc::time_point start, uint32_t interval) - { - auto dividend_holder_asset_object = get_asset(asset_name); - asset_update_dividend_operation op; - op.issuer = dividend_holder_asset_object.issuer; - op.asset_to_update = dividend_holder_asset_object.id; - op.new_options.next_payout_time = start; - op.new_options.payout_interval = interval; - trx.operations.push_back(op); - set_expiration(db, trx); - PUSH_TX(db, trx, ~0); - trx.operations.clear(); - } - - void update_gpos_global(uint32_t vesting_period, uint32_t vesting_subperiod, fc::time_point_sec period_start) - { - db.modify(db.get_global_properties(), [vesting_period, vesting_subperiod, period_start](global_property_object& p) { - p.parameters.extensions.value.gpos_period = vesting_period; - p.parameters.extensions.value.gpos_subperiod = vesting_subperiod; - p.parameters.extensions.value.gpos_period_start = period_start.sec_since_epoch(); - p.parameters.extensions.value.gpos_vesting_lockin_period = vesting_subperiod; - }); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period(), vesting_period); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod(), vesting_subperiod); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), period_start.sec_since_epoch()); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_vesting_lockin_period(), vesting_subperiod); - } - - void update_maintenance_interval(uint32_t new_interval) - { - db.modify(db.get_global_properties(), [new_interval](global_property_object& p) { - p.parameters.maintenance_interval = new_interval; - }); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.maintenance_interval, new_interval); - } - - void vote_for(const account_id_type account_id, const vote_id_type vote_for, const fc::ecc::private_key& key) - { - account_update_operation op; - op.account = account_id; - op.new_options = account_id(db).options; - op.new_options->votes.insert(vote_for); - op.extensions.value.update_last_voting_time = true; - trx.operations.push_back(op); - set_expiration(db, trx); - trx.validate(); - sign(trx, key); - PUSH_TX(db, trx); - trx.clear(); - } - void fill_reserve_pool(const account_id_type account_id, asset amount) - { - asset_reserve_operation op; - op.payer = account_id; - op.amount_to_reserve = amount; - trx.operations.push_back(op); - trx.validate(); - set_expiration(db, trx); - PUSH_TX( db, trx, ~0 ); - trx.clear(); - } - - void advance_x_maint(int periods) - { - for(int i=0; i(ptx.operation_results[0].get()); - - // check created vesting amount and policy - BOOST_CHECK_EQUAL(alice_vesting.balance.amount.value, 100); - BOOST_CHECK_EQUAL(alice_vesting.policy.get().vesting_duration_seconds, - db.get_global_properties().parameters.gpos_subperiod()); - BOOST_CHECK_EQUAL(alice_vesting.policy.get().vesting_cliff_seconds, - db.get_global_properties().parameters.gpos_subperiod()); - - // bob creates a gpos vesting with his custom policy - { - vesting_balance_create_operation op; - op.creator = bob_id; - op.owner = bob_id; - op.amount = core.amount(200); - op.balance_type = vesting_balance_type::gpos; - op.policy = cdd_vesting_policy_initializer{ 60*60*24 }; - - trx.operations.push_back(op); - set_expiration(db, trx); - ptx = PUSH_TX(db, trx, ~0); - trx.clear(); - } - auto bob_vesting = db.get(ptx.operation_results[0].get()); - - generate_block(); - - // policy is not the one defined by the user but default - BOOST_CHECK_EQUAL(bob_vesting.balance.amount.value, 200); - BOOST_CHECK_EQUAL(bob_vesting.policy.get().vesting_duration_seconds, - db.get_global_properties().parameters.gpos_subperiod()); - BOOST_CHECK_EQUAL(bob_vesting.policy.get().vesting_cliff_seconds, - db.get_global_properties().parameters.gpos_subperiod()); - - } - catch (fc::exception& e) - { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( dividends ) -{ - ACTORS((alice)(bob)); - try - { - // move to 1 week before hardfork - generate_blocks( HARDFORK_GPOS_TIME - fc::days(7) ); - generate_block(); - - const auto& core = asset_id_type()(db); - - // all core coins are in the committee_account - BOOST_CHECK_EQUAL(get_balance(committee_account(db), core), 1000000000000000); - - // transfer half of the total stake to alice so not all the dividends will go to the committee_account - transfer( committee_account, alice_id, core.amount( 500000000000000 ) ); - generate_block(); - - // send some to bob - transfer( committee_account, bob_id, core.amount( 1000 ) ); - generate_block(); - - // committee balance - BOOST_CHECK_EQUAL(get_balance(committee_account(db), core), 499999999999000); - - // alice balance - BOOST_CHECK_EQUAL(get_balance(alice_id(db), core), 500000000000000); - - // bob balance - BOOST_CHECK_EQUAL(get_balance(bob_id(db), core), 1000); - - // get core asset object - const auto& dividend_holder_asset_object = get_asset(GRAPHENE_SYMBOL); - - // by default core token pays dividends once per month - const auto& dividend_data = dividend_holder_asset_object.dividend_data(db); - BOOST_CHECK_EQUAL(*dividend_data.options.payout_interval, 2592000); // 30 days - - // update the payout interval for speed purposes of the test - update_payout_interval(core.symbol, db.head_block_time() + fc::minutes(1), 60 * 60 * 24); // 1 day - - generate_block(); - - BOOST_CHECK_EQUAL(*dividend_data.options.payout_interval, 86400); // 1 day now - - // get the dividend distribution account - const account_object& dividend_distribution_account = dividend_data.dividend_distribution_account(db); - - // transfering some coins to distribution account. - // simulating the blockchain haves some dividends to pay. - transfer( committee_account, dividend_distribution_account.id, core.amount( 100 ) ); - generate_block(); - - // committee balance - BOOST_CHECK_EQUAL(get_balance(committee_account(db), core), 499999999998900 ); - - // distribution account balance - BOOST_CHECK_EQUAL(get_balance(dividend_distribution_account, core), 100); - - // get when is the next payout time as we need to advance there - auto next_payout_time = dividend_data.options.next_payout_time; - - // advance to next payout - generate_blocks(*next_payout_time); - wdump((*next_payout_time)); - - // advance to next maint after payout time arrives - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // check balances now, dividends are paid "normally" - BOOST_CHECK_EQUAL(get_balance(committee_account(db), core), 499999999998949 ); - BOOST_CHECK_EQUAL(get_balance(alice_id(db), core), 500000000000050 ); - BOOST_CHECK_EQUAL(get_balance(bob_id(db), core), 1000 ); - BOOST_CHECK_EQUAL(get_balance(dividend_distribution_account, core), 1); - - // advance to hardfork - generate_blocks( HARDFORK_GPOS_TIME ); - - // advance to next maint - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // send 99 to the distribution account so it will have 100 PPY again to share - transfer( committee_account, dividend_distribution_account.id, core.amount( 99 ) ); - generate_block(); - - // get when is the next payout time as we need to advance there - next_payout_time = dividend_data.options.next_payout_time; - - // advance to next payout - generate_blocks(*next_payout_time); - - // advance to next maint - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // make sure no dividends were paid "normally" - BOOST_CHECK_EQUAL(get_balance(committee_account(db), core), 499999999998850 ); - BOOST_CHECK_EQUAL(get_balance(alice_id(db), core), 500000000000050 ); - BOOST_CHECK_EQUAL(get_balance(bob_id(db), core), 1000 ); - BOOST_CHECK_EQUAL(get_balance(dividend_distribution_account, core), 100); - - // create vesting balance - create_vesting(bob_id, core.amount(100), vesting_balance_type::gpos); - - // need to vote to get paid - auto witness1 = witness_id_type(1)(db); - vote_for(bob_id, witness1.vote_id, bob_private_key); - - generate_block(); - - // check balances - BOOST_CHECK_EQUAL(get_balance(bob_id(db), core), 900 ); - BOOST_CHECK_EQUAL(get_balance(dividend_distribution_account, core), 100); - - // advance to next payout - generate_blocks(*next_payout_time); - - // advance to next maint - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // check balances, dividends paid to bob - BOOST_CHECK_EQUAL(get_balance(bob_id(db), core), 1000 ); - BOOST_CHECK_EQUAL(get_balance(dividend_distribution_account, core), 0); - } - catch (fc::exception& e) - { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( gpos_basic_dividend_distribution_to_core_asset ) -{ - using namespace graphene; - ACTORS((alice)(bob)(carol)(dave)); - try { - const auto& core = asset_id_type()(db); - BOOST_TEST_MESSAGE("Creating test asset"); - { - asset_create_operation creator; - creator.issuer = account_id_type(); - creator.fee = asset(); - creator.symbol = "TESTB"; - creator.common_options.max_supply = 100000000; - creator.precision = 2; - creator.common_options.market_fee_percent = GRAPHENE_MAX_MARKET_FEE_PERCENT/100; /*1%*/ - creator.common_options.issuer_permissions = UIA_ASSET_ISSUER_PERMISSION_MASK; - creator.common_options.flags = charge_market_fee; - creator.common_options.core_exchange_rate = price({asset(2),asset(1,asset_id_type(1))}); - trx.operations.push_back(std::move(creator)); - set_expiration(db, trx); - PUSH_TX( db, trx, ~0 ); - trx.operations.clear(); - } - - // pass hardfork - generate_blocks( HARDFORK_GPOS_TIME ); - generate_block(); - - const auto& dividend_holder_asset_object = asset_id_type(0)(db); - const auto& dividend_data = dividend_holder_asset_object.dividend_data(db); - const account_object& dividend_distribution_account = dividend_data.dividend_distribution_account(db); - const account_object& alice = get_account("alice"); - const account_object& bob = get_account("bob"); - const account_object& carol = get_account("carol"); - const account_object& dave = get_account("dave"); - const auto& test_asset_object = get_asset("TESTB"); - - auto issue_asset_to_account = [&](const asset_object& asset_to_issue, const account_object& destination_account, int64_t amount_to_issue) - { - asset_issue_operation op; - op.issuer = asset_to_issue.issuer; - op.asset_to_issue = asset(amount_to_issue, asset_to_issue.id); - op.issue_to_account = destination_account.id; - trx.operations.push_back( op ); - set_expiration(db, trx); - PUSH_TX( db, trx, ~0 ); - trx.operations.clear(); - }; - - auto verify_pending_balance = [&](const account_object& holder_account_obj, const asset_object& payout_asset_obj, int64_t expected_balance) { - int64_t pending_balance = get_dividend_pending_payout_balance(dividend_holder_asset_object.id, - holder_account_obj.id, - payout_asset_obj.id); - BOOST_CHECK_EQUAL(pending_balance, expected_balance); - }; - - auto advance_to_next_payout_time = [&]() { - // Advance to the next upcoming payout time - BOOST_REQUIRE(dividend_data.options.next_payout_time); - fc::time_point_sec next_payout_scheduled_time = *dividend_data.options.next_payout_time; - idump((next_payout_scheduled_time)); - // generate blocks up to the next scheduled time - generate_blocks(next_payout_scheduled_time); - // if the scheduled time fell on a maintenance interval, then we should have paid out. - // if not, we need to advance to the next maintenance interval to trigger the payout - if (dividend_data.options.next_payout_time) - { - // we know there was a next_payout_time set when we entered this, so if - // it has been cleared, we must have already processed payouts, no need to - // further advance time. - BOOST_REQUIRE(dividend_data.options.next_payout_time); - if (*dividend_data.options.next_payout_time == next_payout_scheduled_time) - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); // get the maintenance skip slots out of the way - } - idump((db.head_block_time())); - }; - - // the first test will be testing pending balances, so we need to hit a - // maintenance interval that isn't the payout interval. Payout is - // every 3 days, maintenance interval is every 1 day. - advance_to_next_payout_time(); - - // Set up the first test, issue alice, bob, and carol, and dave each 1/4 of the total - // supply of the core asset. - // Then deposit 400 TEST in the distribution account, and see that they - // each are credited 100 TEST. - transfer( committee_account(db), alice, asset( 250000000000000 ) ); - transfer( committee_account(db), bob, asset( 250000000000000 ) ); - transfer( committee_account(db), carol, asset( 250000000000000 ) ); - transfer( committee_account(db), dave, asset( 250000000000000 ) ); - - // create vesting balance - // bob has not vested anything - create_vesting(alice_id, core.amount(25000000), vesting_balance_type::gpos); - create_vesting(carol_id, core.amount(25000000), vesting_balance_type::gpos); - create_vesting(dave_id, core.amount(25000000), vesting_balance_type::gpos); - - // need to vote to get paid - // carol doesn't participate in voting - auto witness1 = witness_id_type(1)(db); - vote_for(alice_id, witness1.vote_id, alice_private_key); - vote_for(bob_id, witness1.vote_id, bob_private_key); - vote_for(dave_id, witness1.vote_id, dave_private_key); - - // issuing 30000 TESTB to the dividend account - // alice and dave should receive 10000 TESTB as they have gpos vesting and - // participated in voting - // bob should not receive any TESTB as he doesn't have gpos vested - // carol should not receive any TESTB as she doesn't participated in voting - // remaining 10000 TESTB should be deposited in commitee_accoount. - BOOST_TEST_MESSAGE("Issuing 30000 TESTB to the dividend account"); - issue_asset_to_account(test_asset_object, dividend_distribution_account, 30000); - - generate_block(); - - BOOST_TEST_MESSAGE( "Generating blocks until next maintenance interval" ); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); // get the maintenance skip slots out of the way - - verify_pending_balance(alice, test_asset_object, 10000); - verify_pending_balance(bob, test_asset_object, 0); - verify_pending_balance(carol, test_asset_object, 0); - verify_pending_balance(dave, test_asset_object, 10000); - - advance_to_next_payout_time(); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); // get the maintenance skip slots out of the way - - auto verify_dividend_payout_operations = [&](const account_object& destination_account, const asset& expected_payout) - { - BOOST_TEST_MESSAGE("Verifying the virtual op was created"); - const account_transaction_history_index& hist_idx = db.get_index_type(); - auto account_history_range = hist_idx.indices().get().equal_range(boost::make_tuple(destination_account.id)); - BOOST_REQUIRE(account_history_range.first != account_history_range.second); - const operation_history_object& history_object = std::prev(account_history_range.second)->operation_id(db); - const asset_dividend_distribution_operation& distribution_operation = history_object.op.get(); - BOOST_CHECK(distribution_operation.account_id == destination_account.id); - BOOST_CHECK(std::find(distribution_operation.amounts.begin(), distribution_operation.amounts.end(), expected_payout) - != distribution_operation.amounts.end()); - }; - - BOOST_TEST_MESSAGE("Verifying the payouts"); - BOOST_CHECK_EQUAL(get_balance(alice, test_asset_object), 10000); - verify_dividend_payout_operations(alice, asset(10000, test_asset_object.id)); - verify_pending_balance(alice, test_asset_object, 0); - - BOOST_CHECK_EQUAL(get_balance(bob, test_asset_object), 0); - verify_pending_balance(bob, test_asset_object, 0); - - BOOST_CHECK_EQUAL(get_balance(carol, test_asset_object), 0); - verify_pending_balance(carol, test_asset_object, 0); - - BOOST_CHECK_EQUAL(get_balance(dave, test_asset_object), 10000); - verify_dividend_payout_operations(dave, asset(10000, test_asset_object.id)); - verify_pending_balance(dave, test_asset_object, 0); - - BOOST_CHECK_EQUAL(get_balance(account_id_type(0)(db), test_asset_object), 10000); - } catch(fc::exception& e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( votes_on_gpos_activation ) -{ - ACTORS((alice)(bob)); - try { - const auto& core = asset_id_type()(db); - - // send some asset to alice and bob - transfer( committee_account, alice_id, core.amount( 1000 ) ); - transfer( committee_account, bob_id, core.amount( 1000 ) ); - generate_block(); - - // update default gpos - auto now = db.head_block_time(); - // 5184000 = 60x60x24x6 = 6 days - // 864000 = 60x60x24x1 = 1 days - update_gpos_global(518400, 86400, HARDFORK_GPOS_TIME); - - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period(), 518400); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod(), 86400); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), HARDFORK_GPOS_TIME.sec_since_epoch()); - // no votes for witness 1 - auto witness1 = witness_id_type(1)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 0); - - // no votes for witness 2 - auto witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness2.total_votes, 0); - - // vote for witness1 and witness2 - this before GPOS period starts - vote_for(alice_id, witness1.vote_id, alice_private_key); - vote_for(bob_id, witness2.vote_id, bob_private_key); - - // go to maint - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // vote is the same as amount in the first subperiod since voting - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 1000); - BOOST_CHECK_EQUAL(witness2.total_votes, 1000); - - update_maintenance_interval(3600); //update maintenance interval to 1hr to evaluate sub-periods - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.maintenance_interval, 3600); - - // move to hardfork - generate_blocks( HARDFORK_GPOS_TIME ); - generate_block(); - - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 1000); - BOOST_CHECK_EQUAL(witness2.total_votes, 1000); - - // add some vesting to alice and don't add anything for Bob - create_vesting(alice_id, core.amount(99), vesting_balance_type::gpos); - generate_block(); - vote_for(alice_id, witness1.vote_id, alice_private_key); - generate_block(); - - advance_x_maint(1); - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - //System needs to consider votes based on both regular balance + GPOS balance for 1/2 sub-period on GPOS activation - BOOST_CHECK_EQUAL(witness1.total_votes, 1000); - BOOST_CHECK_EQUAL(witness2.total_votes, 1000); - - advance_x_maint(6); - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 1000); - BOOST_CHECK_EQUAL(witness2.total_votes, 1000); - - advance_x_maint(5); - generate_block(); - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - //Since Alice has votes, votes should be based on GPOS balance i.e 99 - //Since Bob not voted after GPOS activation, witness2 votes should be 0 after crossing 1/2 sub-period(12 maintanence intervals in this case) - BOOST_CHECK_EQUAL(witness1.total_votes, 99); - BOOST_CHECK_EQUAL(witness2.total_votes, 0); - - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( voting ) -{ - ACTORS((alice)(bob)); - try { - // move to hardfork - generate_blocks( HARDFORK_GPOS_TIME ); - generate_block(); - - const auto& core = asset_id_type()(db); - - // send some asset to alice and bob - transfer( committee_account, alice_id, core.amount( 1000 ) ); - transfer( committee_account, bob_id, core.amount( 1000 ) ); - generate_block(); - - // default maintenance_interval is 1 day - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.maintenance_interval, 86400); - - // add some vesting to alice and bob - create_vesting(alice_id, core.amount(100), vesting_balance_type::gpos); - create_vesting(bob_id, core.amount(100), vesting_balance_type::gpos); - generate_block(); - - // default gpos values - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period(), 15552000); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod(), 2592000); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), HARDFORK_GPOS_TIME.sec_since_epoch()); - - // update default gpos for test speed - auto now = db.head_block_time(); - // 5184000 = 60x60x24x60 = 60 days - // 864000 = 60x60x24x10 = 10 days - update_gpos_global(5184000, 864000, now); - - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period(), 5184000); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod(), 864000); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch()); - // end global changes - - generate_block(); - - // no votes for witness 1 - auto witness1 = witness_id_type(1)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 0); - - // no votes for witness 2 - auto witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness2.total_votes, 0); - - // vote for witness1 and witness2 - sub-period 1 - vote_for(alice_id, witness1.vote_id, alice_private_key); - vote_for(bob_id, witness2.vote_id, bob_private_key); - - // go to maint - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // need to consider both gpos and regular balance for first 1/2 sub period - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 1000); - BOOST_CHECK_EQUAL(witness2.total_votes, 1000); - - advance_x_maint(6); - - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 100); - BOOST_CHECK_EQUAL(witness2.total_votes, 100); - - advance_x_maint(4); - - //Bob votes for witness2 - sub-period 2 - vote_for(bob_id, witness2.vote_id, bob_private_key); - // go to maint - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - // vote decay as time pass - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - - BOOST_CHECK_EQUAL(witness1.total_votes, 83); - BOOST_CHECK_EQUAL(witness2.total_votes, 100); - - advance_x_maint(10); - //Bob votes for witness2 - sub-period 3 - vote_for(bob_id, witness2.vote_id, bob_private_key); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - // decay more - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 66); - BOOST_CHECK_EQUAL(witness2.total_votes, 100); - - advance_x_maint(10); - - // Bob votes for witness2 - sub-period 4 - vote_for(bob_id, witness2.vote_id, bob_private_key); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - // decay more - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 50); - BOOST_CHECK_EQUAL(witness2.total_votes, 100); - - advance_x_maint(10); - - // Bob votes for witness2 - sub-period 5 - vote_for(bob_id, witness2.vote_id, bob_private_key); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - // decay more - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - - BOOST_CHECK_EQUAL(witness1.total_votes, 33); - BOOST_CHECK_EQUAL(witness2.total_votes, 100); - - advance_x_maint(10); - - // Bob votes for witness2 - sub-period 6 - vote_for(bob_id, witness2.vote_id, bob_private_key); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - // decay more - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 16); - BOOST_CHECK_EQUAL(witness2.total_votes, 100); - - // we are still in gpos period 1 - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch()); - - advance_x_maint(5); - // a new GPOS period is in but vote from user is before the start. Whoever votes in 6th sub-period, votes will carry - now = db.head_block_time(); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch()); - - generate_block(); - - // we are in the second GPOS period, at subperiod 1, - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 0); - //It's critical here, since bob votes in 6th sub-period of last vesting period, witness2 should retain his votes - BOOST_CHECK_EQUAL(witness2.total_votes, 100); - - - // lets vote here from alice to generate votes for witness 1 - //vote from bob to reatin VF 1 - vote_for(alice_id, witness1.vote_id, alice_private_key); - vote_for(bob_id, witness2.vote_id, bob_private_key); - generate_block(); - - // go to maint - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - - BOOST_CHECK_EQUAL(witness1.total_votes, 100); - BOOST_CHECK_EQUAL(witness2.total_votes, 100); - - advance_x_maint(10); - - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - - BOOST_CHECK_EQUAL(witness1.total_votes, 83); - BOOST_CHECK_EQUAL(witness2.total_votes, 83); - - vote_for(bob_id, witness2.vote_id, bob_private_key); - generate_block(); - - advance_x_maint(10); - - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - - BOOST_CHECK_EQUAL(witness1.total_votes, 66); - BOOST_CHECK_EQUAL(witness2.total_votes, 83); - - // alice votes again, now for witness 2, her vote worth 100 now - vote_for(alice_id, witness2.vote_id, alice_private_key); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - witness1 = witness_id_type(1)(db); - witness2 = witness_id_type(2)(db); - - BOOST_CHECK_EQUAL(witness1.total_votes, 100); - BOOST_CHECK_EQUAL(witness2.total_votes, 183); - - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( rolling_period_start ) -{ - // period start rolls automatically after HF - try { - // update default gpos global parameters to make this thing faster - update_gpos_global(518400, 86400, HARDFORK_GPOS_TIME); - generate_blocks(HARDFORK_GPOS_TIME); - update_maintenance_interval(3600); //update maintenance interval to 1hr to evaluate sub-periods - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.maintenance_interval, 3600); - - auto vesting_period_1 = db.get_global_properties().parameters.gpos_period_start(); - - auto now = db.head_block_time(); - // moving outside period: - while( db.head_block_time() <= now + fc::days(6) ) - { - generate_block(); - } - generate_block(); - auto vesting_period_2 = db.get_global_properties().parameters.gpos_period_start(); - - //difference between start of two consecutive vesting periods should be 6 days - BOOST_CHECK_EQUAL(vesting_period_1 + 518400, vesting_period_2); - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( worker_dividends_voting ) -{ - try { - // advance to HF - generate_blocks(HARDFORK_GPOS_TIME); - generate_block(); - - // update default gpos global parameters to 4 days - auto now = db.head_block_time(); - update_gpos_global(345600, 86400, now); - - generate_block(); - set_expiration(db, trx); - const auto& core = asset_id_type()(db); - - // get core asset object - const auto& dividend_holder_asset_object = get_asset(GRAPHENE_SYMBOL); - - // by default core token pays dividends once per month - const auto& dividend_data = dividend_holder_asset_object.dividend_data(db); - BOOST_CHECK_EQUAL(*dividend_data.options.payout_interval, 2592000); // 30 days - - // update the payout interval to 1 day for speed purposes of the test - update_payout_interval(core.symbol, db.head_block_time() + fc::minutes(1), 60 * 60 * 24); // 1 day - - generate_block(); - - // get the dividend distribution account - const account_object& dividend_distribution_account = dividend_data.dividend_distribution_account(db); - - // transfering some coins to distribution account. - transfer( committee_account, dividend_distribution_account.id, core.amount( 100 ) ); - generate_block(); - - ACTORS((nathan)(voter1)(voter2)(voter3)); - - transfer( committee_account, nathan_id, core.amount( 1000 ) ); - transfer( committee_account, voter1_id, core.amount( 1000 ) ); - transfer( committee_account, voter2_id, core.amount( 1000 ) ); - - generate_block(); - - upgrade_to_lifetime_member(nathan_id); - - auto worker = create_worker(nathan_id, 10, fc::days(6)); - - // add some vesting to voter1 - create_vesting(voter1_id, core.amount(100), vesting_balance_type::gpos); - - // add some vesting to voter2 - create_vesting(voter2_id, core.amount(100), vesting_balance_type::gpos); - - generate_block(); - - // vote for worker - vote_for(voter1_id, worker.vote_for, voter1_private_key); - - // first maint pass, coefficient will be 1 - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - worker = worker_id_type()(db); - BOOST_CHECK_EQUAL(worker.total_votes_for, 100); - - // here dividends are paid to voter1 and voter2 - // voter1 get paid full dividend share as coefficent is at 1 here - BOOST_CHECK_EQUAL(get_balance(voter1_id(db), core), 950); - - // voter2 didnt voted so he dont get paid - BOOST_CHECK_EQUAL(get_balance(voter2_id(db), core), 900); - - // send some asset to the reserve pool so the worker can get paid - fill_reserve_pool(account_id_type(), asset(GRAPHENE_MAX_SHARE_SUPPLY/2)); - - BOOST_CHECK_EQUAL(worker_id_type()(db).worker.get().balance(db).balance.amount.value, 0); - BOOST_CHECK_EQUAL(worker.worker.get().balance(db).balance.amount.value, 0); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // worker is getting paid - BOOST_CHECK_EQUAL(worker_id_type()(db).worker.get().balance(db).balance.amount.value, 10); - BOOST_CHECK_EQUAL(worker.worker.get().balance(db).balance.amount.value, 10); - - // second maint pass, coefficient will be 0.75 - worker = worker_id_type()(db); - BOOST_CHECK_EQUAL(worker.total_votes_for, 75); - - // more decay - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - worker = worker_id_type()(db); - BOOST_CHECK_EQUAL(worker.total_votes_for, 50); - - transfer( committee_account, dividend_distribution_account.id, core.amount( 100 ) ); - generate_block(); - - BOOST_CHECK_EQUAL(get_balance(committee_account(db), core), 499999999996850); - - // more decay - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - worker = worker_id_type()(db); - BOOST_CHECK_EQUAL(worker.total_votes_for, 25); - - // here voter1 get paid again but less money by vesting coefficient - BOOST_CHECK_EQUAL(get_balance(voter1_id(db), core), 962); - BOOST_CHECK_EQUAL(get_balance(voter2_id(db), core), 900); - - // remaining dividends not paid by coeffcient are sent to committee account - BOOST_CHECK_EQUAL(get_balance(committee_account(db), core), 499999999996938); - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( account_multiple_vesting ) -{ - try { - // advance to HF - generate_blocks(HARDFORK_GPOS_TIME); - generate_block(); - set_expiration(db, trx); - - // update default gpos global parameters to 4 days - auto now = db.head_block_time(); - update_gpos_global(345600, 86400, now); - - ACTORS((sam)(patty)); - - const auto& core = asset_id_type()(db); - - transfer( committee_account, sam_id, core.amount( 300 ) ); - transfer( committee_account, patty_id, core.amount( 100 ) ); - - // add some vesting to sam - create_vesting(sam_id, core.amount(100), vesting_balance_type::gpos); - - // have another balance with 200 more - create_vesting(sam_id, core.amount(200), vesting_balance_type::gpos); - - // patty also have vesting balance - create_vesting(patty_id, core.amount(100), vesting_balance_type::gpos); - - // get core asset object - const auto& dividend_holder_asset_object = get_asset(GRAPHENE_SYMBOL); - const auto& dividend_data = dividend_holder_asset_object.dividend_data(db); - - // update the payout interval - update_payout_interval(core.symbol, db.head_block_time() + fc::minutes(1), 60 * 60 * 24); // 1 day - - // get the dividend distribution account - const account_object& dividend_distribution_account = dividend_data.dividend_distribution_account(db); - - // transfering some coins to distribution account. - transfer( committee_account, dividend_distribution_account.id, core.amount( 100 ) ); - generate_block(); - - // vote for a votable object - auto witness1 = witness_id_type(1)(db); - vote_for(sam_id, witness1.vote_id, sam_private_key); - vote_for(patty_id, witness1.vote_id, patty_private_key); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // amount in vested balanced will sum up as voting power - witness1 = witness_id_type(1)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 400); - - // sam get paid dividends - BOOST_CHECK_EQUAL(get_balance(sam_id(db), core), 75); - - // patty also - BOOST_CHECK_EQUAL(get_balance(patty_id(db), core), 25); - - // total vote not decaying - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - witness1 = witness_id_type(1)(db); - - BOOST_CHECK_EQUAL(witness1.total_votes, 300); - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( Withdraw_gpos_vesting_balance ) -{ - try { - // advance to HF - generate_blocks(HARDFORK_GPOS_TIME); - generate_block(); - set_expiration(db, trx); - - // update default gpos global parameters to 4 days - auto now = db.head_block_time(); - update_gpos_global(345600, 86400, now); - - ACTORS((alice)(bob)); - - graphene::app::database_api db_api1(db); - const auto& core = asset_id_type()(db); - - - transfer( committee_account, alice_id, core.amount( 500 ) ); - transfer( committee_account, bob_id, core.amount( 99 ) ); - - // add some vesting to Alice, Bob - vesting_balance_object vbo1, vbo2; - vbo1 = create_vesting(alice_id, core.amount(150), vesting_balance_type::gpos); - vbo2 = create_vesting(bob_id, core.amount(99), vesting_balance_type::gpos); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - generate_block(); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_blocks(db.get_global_properties().parameters.gpos_vesting_lockin_period()); - BOOST_CHECK_EQUAL(get_balance(alice_id(db), core), 350); - withdraw_gpos_vesting(vbo1.id, alice_id, core.amount(50), /*vesting_balance_type::gpos, */alice_private_key); - withdraw_gpos_vesting(vbo2.id, bob_id, core.amount(99), /*vesting_balance_type::gpos, */bob_private_key); - generate_block(); - // verify charles balance - BOOST_CHECK_EQUAL(get_balance(alice_id(db), core), 400); - BOOST_CHECK_EQUAL(get_balance(bob_id(db), core), 99); - - // Add more 50 and 73 vesting objects and withdraw 90 from - // total vesting balance of user - vbo1 = create_vesting(alice_id, core.amount(50), vesting_balance_type::gpos); - vbo2 = create_vesting(alice_id, core.amount(73), vesting_balance_type::gpos); - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - generate_block(); - - vector vbos = db_api1.get_vesting_balances("alice"); - asset total_vesting; - for (const vesting_balance_object& vbo : vbos) - { - if (vbo.balance_type == vesting_balance_type::gpos && vbo.balance.asset_id == asset_id_type()) - total_vesting += vbo.balance; - } - // total vesting balance of alice - BOOST_CHECK_EQUAL(total_vesting.amount.value, core.amount(223).amount.value); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_blocks(db.get_global_properties().parameters.gpos_vesting_lockin_period()); - BOOST_CHECK_EQUAL(get_balance(alice_id(db), core), 277); - withdraw_gpos_vesting(vbo1.id, alice_id, core.amount(90), /*vesting_balance_type::gpos,*/ alice_private_key); - generate_block(); - // verify alice balance - BOOST_CHECK_EQUAL(get_balance(alice_id(db), core), 367); - - // verify remaining vesting balance - vbos = db_api1.get_vesting_balances("alice"); - asset remaining_vesting; - for (const vesting_balance_object& vbo : vbos) - { - if (vbo.balance_type == vesting_balance_type::gpos && vbo.balance.asset_id == asset_id_type()) - remaining_vesting += vbo.balance; - } - // remaining vesting balance of alice - BOOST_CHECK_EQUAL(remaining_vesting.amount.value, core.amount(133).amount.value); - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -/* -BOOST_AUTO_TEST_CASE( competing_proposals ) -{ - try { - // advance to HF - generate_blocks(HARDFORK_GPOS_TIME); - generate_block(); - set_expiration(db, trx); - - ACTORS((voter1)(voter2)(worker1)(worker2)); - - const auto& core = asset_id_type()(db); - - transfer( committee_account, worker1_id, core.amount( 1000 ) ); - transfer( committee_account, worker2_id, core.amount( 1000 ) ); - transfer( committee_account, voter1_id, core.amount( 1000 ) ); - transfer( committee_account, voter2_id, core.amount( 1000 ) ); - - create_vesting(voter1_id, core.amount(200), vesting_balance_type::gpos); - create_vesting(voter2_id, core.amount(300), vesting_balance_type::gpos); - - generate_block(); - - auto now = db.head_block_time(); - update_gpos_global(518400, 86400, now); - - update_payout_interval(core.symbol, fc::time_point::now() + fc::minutes(1), 60 * 60 * 24); // 1 day - - upgrade_to_lifetime_member(worker1_id); - upgrade_to_lifetime_member(worker2_id); - - // create 2 competing proposals asking a lot of token - // todo: maybe a refund worker here so we can test with smaller numbers - auto w1 = create_worker(worker1_id, 100000000000, fc::days(10)); - auto w1_id_instance = w1.id.instance(); - auto w2 = create_worker(worker2_id, 100000000000, fc::days(10)); - auto w2_id_instance = w2.id.instance(); - - fill_reserve_pool(account_id_type(), asset(GRAPHENE_MAX_SHARE_SUPPLY/2)); - - // vote for the 2 workers - vote_for(voter1_id, w1.vote_for, voter1_private_key); - vote_for(voter2_id, w2.vote_for, voter2_private_key); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - w1 = worker_id_type(w1_id_instance)(db); - w2 = worker_id_type(w2_id_instance)(db); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - // only w2 is getting paid as it haves more votes and money is only enough for 1 - BOOST_CHECK_EQUAL(w1.worker.get().balance(db).balance.amount.value, 0); - BOOST_CHECK_EQUAL(w2.worker.get().balance(db).balance.amount.value, 100000000000); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - BOOST_CHECK_EQUAL(w1.worker.get().balance(db).balance.amount.value, 0); - BOOST_CHECK_EQUAL(w2.worker.get().balance(db).balance.amount.value, 150000000000); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - w1 = worker_id_type(w1_id_instance)(db); - w2 = worker_id_type(w2_id_instance)(db); - - // as votes decay w1 is still getting paid as it always have more votes than w1 - BOOST_CHECK_EQUAL(w1.total_votes_for, 100); - BOOST_CHECK_EQUAL(w2.total_votes_for, 150); - - BOOST_CHECK_EQUAL(w1.worker.get().balance(db).balance.amount.value, 0); - BOOST_CHECK_EQUAL(w2.worker.get().balance(db).balance.amount.value, 200000000000); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - w1 = worker_id_type(w1_id_instance)(db); - w2 = worker_id_type(w2_id_instance)(db); - - BOOST_CHECK_EQUAL(w1.total_votes_for, 66); - BOOST_CHECK_EQUAL(w2.total_votes_for, 100); - - // worker is sil getting paid as days pass - BOOST_CHECK_EQUAL(w1.worker.get().balance(db).balance.amount.value, 0); - BOOST_CHECK_EQUAL(w2.worker.get().balance(db).balance.amount.value, 250000000000); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - w1 = worker_id_type(w1_id_instance)(db); - w2 = worker_id_type(w2_id_instance)(db); - - BOOST_CHECK_EQUAL(w1.total_votes_for, 33); - BOOST_CHECK_EQUAL(w2.total_votes_for, 50); - - BOOST_CHECK_EQUAL(w1.worker.get().balance(db).balance.amount.value, 0); - BOOST_CHECK_EQUAL(w2.worker.get().balance(db).balance.amount.value, 300000000000); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - w1 = worker_id_type(w1_id_instance)(db); - w2 = worker_id_type(w2_id_instance)(db); - - // worker2 will not get paid anymore as it haves 0 votes - BOOST_CHECK_EQUAL(w1.total_votes_for, 0); - BOOST_CHECK_EQUAL(w2.total_votes_for, 0); - - BOOST_CHECK_EQUAL(w1.worker.get().balance(db).balance.amount.value, 0); - BOOST_CHECK_EQUAL(w2.worker.get().balance(db).balance.amount.value, 300000000000); - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} -*/ -BOOST_AUTO_TEST_CASE( proxy_voting ) -{ - ACTORS((alice)(bob)); - try { - // move to hardfork - generate_blocks( HARDFORK_GPOS_TIME ); - generate_block(); - - // database api - graphene::app::database_api db_api(db); - - const auto& core = asset_id_type()(db); - - // send some asset to alice and bob - transfer( committee_account, alice_id, core.amount( 1000 ) ); - transfer( committee_account, bob_id, core.amount( 1000 ) ); - generate_block(); - - // add some vesting to alice and bob - create_vesting(alice_id, core.amount(100), vesting_balance_type::gpos); - generate_block(); - - // total balance is 100 rest of data at 0 - auto gpos_info = db_api.get_gpos_info(alice_id); - BOOST_CHECK_EQUAL(gpos_info.vesting_factor, 0); - BOOST_CHECK_EQUAL(gpos_info.award.amount.value, 0); - BOOST_CHECK_EQUAL(gpos_info.total_amount.value, 100); - - create_vesting(bob_id, core.amount(100), vesting_balance_type::gpos); - generate_block(); - - gpos_info = db_api.get_gpos_info(bob_id); - BOOST_CHECK_EQUAL(gpos_info.vesting_factor, 0); - BOOST_CHECK_EQUAL(gpos_info.award.amount.value, 0); - BOOST_CHECK_EQUAL(gpos_info.total_amount.value, 200); - - auto now = db.head_block_time(); - update_gpos_global(518400, 86400, now); - - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period(), 518400); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_subperiod(), 86400); - BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch()); - - // alice assign bob as voting account - graphene::chain::account_update_operation op; - op.account = alice_id; - op.new_options = alice_id(db).options; - op.new_options->voting_account = bob_id; - trx.operations.push_back(op); - set_expiration(db, trx); - trx.validate(); - sign(trx, alice_private_key); - PUSH_TX( db, trx, ~0 ); - trx.clear(); - - generate_block(); - - // vote for witness1 - auto witness1 = witness_id_type(1)(db); - vote_for(bob_id, witness1.vote_id, bob_private_key); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // check vesting factor of current subperiod - BOOST_CHECK_EQUAL(db_api.get_gpos_info(alice_id).vesting_factor, 1); - BOOST_CHECK_EQUAL(db_api.get_gpos_info(bob_id).vesting_factor, 1); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - // GPOS 2nd subperiod started. - // vesting factor decay - BOOST_CHECK_EQUAL(db_api.get_gpos_info(alice_id).vesting_factor, 0.83333333333333337); - BOOST_CHECK_EQUAL(db_api.get_gpos_info(bob_id).vesting_factor, 0.83333333333333337); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - // GPOS 3rd subperiod started - // vesting factor decay - BOOST_CHECK_EQUAL(db_api.get_gpos_info(alice_id).vesting_factor, 0.66666666666666663); - BOOST_CHECK_EQUAL(db_api.get_gpos_info(bob_id).vesting_factor, 0.66666666666666663); - - // vote for witness2 - auto witness2 = witness_id_type(2)(db); - vote_for(bob_id, witness2.vote_id, bob_private_key); - - // vesting factor should be 1 for both alice and bob for the current subperiod - BOOST_CHECK_EQUAL(db_api.get_gpos_info(alice_id).vesting_factor, 1); - BOOST_CHECK_EQUAL(db_api.get_gpos_info(bob_id).vesting_factor, 1); - - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - // vesting factor decay - BOOST_CHECK_EQUAL(db_api.get_gpos_info(alice_id).vesting_factor, 0.83333333333333337); - BOOST_CHECK_EQUAL(db_api.get_gpos_info(bob_id).vesting_factor, 0.83333333333333337); - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( no_proposal ) -{ - try { - - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE( database_api ) -{ - ACTORS((alice)(bob)); - try { - // move to hardfork - generate_blocks( HARDFORK_GPOS_TIME ); - generate_block(); - - // database api - graphene::app::database_api db_api(db); - - const auto& core = asset_id_type()(db); - - // send some asset to alice and bob - transfer( committee_account, alice_id, core.amount( 1000 ) ); - transfer( committee_account, bob_id, core.amount( 1000 ) ); - generate_block(); - - // add some vesting to alice and bob - create_vesting(alice_id, core.amount(100), vesting_balance_type::gpos); - generate_block(); - - // total balance is 100 rest of data at 0 - auto gpos_info = db_api.get_gpos_info(alice_id); - BOOST_CHECK_EQUAL(gpos_info.vesting_factor, 0); - BOOST_CHECK_EQUAL(gpos_info.award.amount.value, 0); - BOOST_CHECK_EQUAL(gpos_info.total_amount.value, 100); - - create_vesting(bob_id, core.amount(100), vesting_balance_type::gpos); - generate_block(); - - // total gpos balance is now 200 - gpos_info = db_api.get_gpos_info(alice_id); - BOOST_CHECK_EQUAL(gpos_info.total_amount.value, 200); - - // update default gpos and dividend interval to 10 days - auto now = db.head_block_time(); - update_gpos_global(5184000, 864000, now); // 10 days subperiods - update_payout_interval(core.symbol, now + fc::minutes(1), 60 * 60 * 24 * 10); // 10 days - - generate_block(); - - // no votes for witness 1 - auto witness1 = witness_id_type(1)(db); - BOOST_CHECK_EQUAL(witness1.total_votes, 0); - - // no votes for witness 2 - auto witness2 = witness_id_type(2)(db); - BOOST_CHECK_EQUAL(witness2.total_votes, 0); - - // transfering some coins to distribution account. - const auto& dividend_holder_asset_object = get_asset(GRAPHENE_SYMBOL); - const auto& dividend_data = dividend_holder_asset_object.dividend_data(db); - const account_object& dividend_distribution_account = dividend_data.dividend_distribution_account(db); - transfer( committee_account, dividend_distribution_account.id, core.amount( 100 ) ); - generate_block(); - - // award balance is now 100 - gpos_info = db_api.get_gpos_info(alice_id); - BOOST_CHECK_EQUAL(gpos_info.vesting_factor, 0); - BOOST_CHECK_EQUAL(gpos_info.award.amount.value, 100); - BOOST_CHECK_EQUAL(gpos_info.total_amount.value, 200); - - // vote for witness1 - vote_for(alice_id, witness1.vote_id, alice_private_key); - vote_for(bob_id, witness1.vote_id, bob_private_key); - - // go to maint - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - - // payment for alice and bob is done, distribution account is back in 0 - gpos_info = db_api.get_gpos_info(alice_id); - BOOST_CHECK_EQUAL(gpos_info.vesting_factor, 1); - BOOST_CHECK_EQUAL(gpos_info.award.amount.value, 0); - BOOST_CHECK_EQUAL(gpos_info.total_amount.value, 200); - - advance_x_maint(10); - - // alice vesting coeffcient decay - gpos_info = db_api.get_gpos_info(alice_id); - BOOST_CHECK_EQUAL(gpos_info.vesting_factor, 0.83333333333333337); - BOOST_CHECK_EQUAL(gpos_info.award.amount.value, 0); - BOOST_CHECK_EQUAL(gpos_info.total_amount.value, 200); - - advance_x_maint(10); - - // vesting factor for alice decaying more - gpos_info = db_api.get_gpos_info(alice_id); - BOOST_CHECK_EQUAL(gpos_info.vesting_factor, 0.66666666666666663); - BOOST_CHECK_EQUAL(gpos_info.award.amount.value, 0); - BOOST_CHECK_EQUAL(gpos_info.total_amount.value, 200); - } - catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/tests/history_api_tests.cpp b/tests/tests/history_api_tests.cpp index 943b8265..4cbcda89 100644 --- a/tests/tests/history_api_tests.cpp +++ b/tests/tests/history_api_tests.cpp @@ -55,25 +55,25 @@ BOOST_AUTO_TEST_CASE(get_account_history) { int account_create_op_id = operation::tag::value; //account_id_type() did 3 ops and includes id0 - vector histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 100, operation_history_id_type()); + vector histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 100, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); BOOST_CHECK_EQUAL(histories[2].op.which(), asset_create_op_id); // 1 account_create op larger than id1 - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 100, operation_history_id_type()); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 100, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK(histories[0].id.instance() != 0); BOOST_CHECK_EQUAL(histories[0].op.which(), account_create_op_id); // Limit 2 returns 2 result - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 2, operation_history_id_type()); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 2, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK(histories[1].id.instance() != 0); BOOST_CHECK_EQUAL(histories[1].op.which(), account_create_op_id); // bob has 1 op - histories = hist_api.get_account_history("bob", operation_history_id_type(), 100, operation_history_id_type()); + histories = hist_api.get_account_history(bob_acc.get_id(), operation_history_id_type(), 100, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].op.which(), account_create_op_id); } FC_LOG_AND_RETHROW() @@ -84,7 +84,7 @@ BOOST_AUTO_TEST_CASE(zero_id_object) { graphene::app::history_api hist_api(app); // no history at all in the chain - vector histories = hist_api.get_account_history("committee-account", operation_history_id_type(0), 4, operation_history_id_type(0)); + vector histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(0), 4, operation_history_id_type(0)); BOOST_CHECK_EQUAL(histories.size(), 0u); create_bitasset("USD", account_id_type()); // create op 0 @@ -92,7 +92,7 @@ BOOST_AUTO_TEST_CASE(zero_id_object) { fc::usleep(fc::milliseconds(2000)); // what if the account only has one history entry and it is 0? - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type()); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 0u); } FC_LOG_AND_RETHROW() @@ -107,13 +107,13 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { // account_id_type() and dan share operation id 1(account create) - share can be also in id 0 // no history at all in the chain - vector histories = hist_api.get_account_history("committee-account", operation_history_id_type(0), 4, operation_history_id_type(0)); + vector histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(0), 4, operation_history_id_type(0)); BOOST_CHECK_EQUAL(histories.size(), 0u); create_bitasset("USD", account_id_type()); // create op 0 generate_block(); // what if the account only has one history entry and it is 0? - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type()); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 0u); @@ -128,7 +128,7 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { generate_block(); // f(A, 0, 4, 9) = { 5, 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type(9)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type(9)); BOOST_CHECK_EQUAL(histories.size(), 4u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); @@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); // f(A, 0, 4, 6) = { 5, 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type(6)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type(6)); BOOST_CHECK_EQUAL(histories.size(), 4u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); @@ -144,7 +144,7 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); // f(A, 0, 4, 5) = { 5, 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type(5)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type(5)); BOOST_CHECK_EQUAL(histories.size(), 4u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); @@ -152,33 +152,33 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); // f(A, 0, 4, 4) = { 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type(4)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type(4)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); // f(A, 0, 4, 3) = { 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type(3)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type(3)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); // f(A, 0, 4, 2) = { 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type(2)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type(2)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); // f(A, 0, 4, 1) = { 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type(1)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type(1)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); // f(A, 0, 4, 0) = { 5, 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 4, operation_history_id_type()); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 4, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 4u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); @@ -186,103 +186,103 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); // f(A, 1, 5, 9) = { 5, 3 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 5, operation_history_id_type(9)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 5, operation_history_id_type(9)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); // f(A, 1, 5, 6) = { 5, 3 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 5, operation_history_id_type(6)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 5, operation_history_id_type(6)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); // f(A, 1, 5, 5) = { 5, 3 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 5, operation_history_id_type(5)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 5, operation_history_id_type(5)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); // f(A, 1, 5, 4) = { 3 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 5, operation_history_id_type(4)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 5, operation_history_id_type(4)); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); // f(A, 1, 5, 3) = { 3 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 5, operation_history_id_type(3)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 5, operation_history_id_type(3)); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); // f(A, 1, 5, 2) = { } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 5, operation_history_id_type(2)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 5, operation_history_id_type(2)); BOOST_CHECK_EQUAL(histories.size(), 0u); // f(A, 1, 5, 1) = { } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 5, operation_history_id_type(1)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 5, operation_history_id_type(1)); BOOST_CHECK_EQUAL(histories.size(), 0u); // f(A, 1, 5, 0) = { 5, 3 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 5, operation_history_id_type(0)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 5, operation_history_id_type(0)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); // f(A, 0, 3, 9) = { 5, 3, 1 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 3, operation_history_id_type(9)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 3, operation_history_id_type(9)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); // f(A, 0, 3, 6) = { 5, 3, 1 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 3, operation_history_id_type(6)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 3, operation_history_id_type(6)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); // f(A, 0, 3, 5) = { 5, 3, 1 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 3, operation_history_id_type(5)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 3, operation_history_id_type(5)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); // f(A, 0, 3, 4) = { 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 3, operation_history_id_type(4)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 3, operation_history_id_type(4)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); // f(A, 0, 3, 3) = { 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 3, operation_history_id_type(3)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 3, operation_history_id_type(3)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 0u); // f(A, 0, 3, 2) = { 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 3, operation_history_id_type(2)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 3, operation_history_id_type(2)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); // f(A, 0, 3, 1) = { 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 3, operation_history_id_type(1)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 3, operation_history_id_type(1)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); // f(A, 0, 3, 0) = { 5, 3, 1 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(), 3, operation_history_id_type()); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(), 3, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 5u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); // f(B, 0, 4, 9) = { 6, 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(9)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(), 4, operation_history_id_type(9)); BOOST_CHECK_EQUAL(histories.size(), 4u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); @@ -290,7 +290,7 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { BOOST_CHECK_EQUAL(histories[3].id.instance(), 1u); // f(B, 0, 4, 6) = { 6, 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(6)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(), 4, operation_history_id_type(6)); BOOST_CHECK_EQUAL(histories.size(), 4u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); @@ -298,38 +298,38 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { BOOST_CHECK_EQUAL(histories[3].id.instance(), 1u); // f(B, 0, 4, 5) = { 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(5)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(), 4, operation_history_id_type(5)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 2u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); // f(B, 0, 4, 4) = { 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(4)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(), 4, operation_history_id_type(4)); BOOST_CHECK_EQUAL(histories.size(), 3u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 2u); BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); // f(B, 0, 4, 3) = { 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(3)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(), 4, operation_history_id_type(3)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 2u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); // f(B, 0, 4, 2) = { 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(2)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(), 4, operation_history_id_type(2)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 2u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 1u); // f(B, 0, 4, 1) = { 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type(1)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(), 4, operation_history_id_type(1)); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 1u); // f(B, 0, 4, 0) = { 6, 4, 2, 1 } - histories = hist_api.get_account_history("dan", operation_history_id_type(), 4, operation_history_id_type()); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(), 4, operation_history_id_type()); BOOST_CHECK_EQUAL(histories.size(), 4u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); @@ -337,49 +337,49 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { BOOST_CHECK_EQUAL(histories[3].id.instance(), 1u); // f(B, 2, 4, 9) = { 6, 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(9)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(2), 4, operation_history_id_type(9)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); // f(B, 2, 4, 6) = { 6, 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(6)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(2), 4, operation_history_id_type(6)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); // f(B, 2, 4, 5) = { 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(5)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(2), 4, operation_history_id_type(5)); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); // f(B, 2, 4, 4) = { 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(4)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(2), 4, operation_history_id_type(4)); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); // f(B, 2, 4, 3) = { } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(3)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(2), 4, operation_history_id_type(3)); BOOST_CHECK_EQUAL(histories.size(), 0u); // f(B, 2, 4, 2) = { } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(2)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(2), 4, operation_history_id_type(2)); BOOST_CHECK_EQUAL(histories.size(), 0u); // f(B, 2, 4, 1) = { } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(1)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(2), 4, operation_history_id_type(1)); BOOST_CHECK_EQUAL(histories.size(), 0u); // f(B, 2, 4, 0) = { 6, 4 } - histories = hist_api.get_account_history("dan", operation_history_id_type(2), 4, operation_history_id_type(0)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(2), 4, operation_history_id_type(0)); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); // 0 limits - histories = hist_api.get_account_history("dan", operation_history_id_type(0), 0, operation_history_id_type(0)); + histories = hist_api.get_account_history(dan.get_id(), operation_history_id_type(0), 0, operation_history_id_type(0)); BOOST_CHECK_EQUAL(histories.size(), 0u); - histories = hist_api.get_account_history("committee-account", operation_history_id_type(3), 0, operation_history_id_type(9)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(3), 0, operation_history_id_type(9)); BOOST_CHECK_EQUAL(histories.size(), 0u); // create a new account C = alice { 7 } @@ -388,16 +388,16 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { generate_block(); // f(C, 0, 4, 10) = { 7 } - histories = hist_api.get_account_history("alice", operation_history_id_type(0), 4, operation_history_id_type(10)); + histories = hist_api.get_account_history(alice.get_id(), operation_history_id_type(0), 4, operation_history_id_type(10)); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 7u); // f(C, 8, 4, 10) = { } - histories = hist_api.get_account_history("alice", operation_history_id_type(8), 4, operation_history_id_type(10)); + histories = hist_api.get_account_history(alice.get_id(), operation_history_id_type(8), 4, operation_history_id_type(10)); BOOST_CHECK_EQUAL(histories.size(), 0u); // f(A, 0, 10, 0) = { 7, 5, 3, 1, 0 } - histories = hist_api.get_account_history("committee-account", operation_history_id_type(0), 10, operation_history_id_type(0)); + histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(0), 10, operation_history_id_type(0)); BOOST_CHECK_EQUAL(histories.size(), 5u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 7u); BOOST_CHECK_EQUAL(histories[1].id.instance(), 5u); @@ -407,155 +407,148 @@ BOOST_AUTO_TEST_CASE(get_account_history_additional) { } FC_LOG_AND_RETHROW() } -BOOST_AUTO_TEST_CASE(track_account) { - try { - graphene::app::history_api hist_api(app); +//BOOST_AUTO_TEST_CASE(track_account) { +// try { +// graphene::app::history_api hist_api(app); +// +// // account_id_type() is not tracked +// +// // account_id_type() creates alice(not tracked account) +// const account_object& alice = create_account("alice"); +// auto alice_id = alice.id; +// +// //account_id_type() creates some ops +// create_bitasset("CNY", account_id_type()); +// create_bitasset("USD", account_id_type()); +// +// // account_id_type() creates dan(account tracked) +// const account_object& dan = create_account("dan"); +// auto dan_id = dan.id; +// +// // dan makes 1 op +// create_bitasset("EUR", dan_id); +// +// generate_block( ~database::skip_fork_db ); +// +// // anything against account_id_type() should be {} +// vector histories = +// hist_api.get_account_history(account_id_type(), operation_history_id_type(0), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(1), 1, operation_history_id_type(2)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// +// // anything against alice should be {} +// histories = hist_api.get_account_history(alice_id, operation_history_id_type(0), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// histories = hist_api.get_account_history(alice_id, operation_history_id_type(1), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// histories = hist_api.get_account_history(alice_id, operation_history_id_type(1), 1, operation_history_id_type(2)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// +// // dan should have history +// histories = hist_api.get_account_history(dan_id, operation_history_id_type(0), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 2u); +// BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); +// BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); +// +// // create more ops, starting with an untracked account +// create_bitasset( "BTC", account_id_type() ); +// create_bitasset( "GBP", dan_id ); +// +// generate_block( ~database::skip_fork_db ); +// +// histories = hist_api.get_account_history(dan_id, operation_history_id_type(0), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 3u); +// BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); +// BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); +// BOOST_CHECK_EQUAL(histories[2].id.instance(), 3u); +// +// db.pop_block(); +// +// // Try again, should result in same object IDs +// create_bitasset( "BTC", account_id_type() ); +// create_bitasset( "GBP", dan_id ); +// +// generate_block(); +// +// histories = hist_api.get_account_history(dan_id, operation_history_id_type(0), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 3u); +// BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); +// BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); +// BOOST_CHECK_EQUAL(histories[2].id.instance(), 3u); +// } catch (fc::exception &e) { +// edump((e.to_detail_string())); +// throw; +// } +//} - // account_id_type() is not tracked - - // account_id_type() creates alice(not tracked account) - const account_object& alice = create_account("alice"); - auto alice_id = alice.id; - - //account_id_type() creates some ops - create_bitasset("CNY", account_id_type()); - create_bitasset("USD", account_id_type()); - - // account_id_type() creates dan(account tracked) - const account_object& dan = create_account("dan"); - auto dan_id = dan.id; - - // dan makes 1 op - create_bitasset("EUR", dan_id); - - generate_block( ~database::skip_fork_db ); - - // anything against account_id_type() should be {} - vector histories = - hist_api.get_account_history("committee-account", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - histories = hist_api.get_account_history("committee-account", operation_history_id_type(1), 1, operation_history_id_type(2)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // anything against alice should be {} - histories = hist_api.get_account_history("alice", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - histories = hist_api.get_account_history("alice", operation_history_id_type(1), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - histories = hist_api.get_account_history("alice", operation_history_id_type(1), 1, operation_history_id_type(2)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - // dan should have history - histories = hist_api.get_account_history("dan", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 3u); - - // create more ops, starting with an untracked account - create_bitasset( "BTC", account_id_type() ); - create_bitasset( "GBP", dan_id ); - - generate_block( ~database::skip_fork_db ); - - histories = hist_api.get_account_history("dan", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 3u); - - db.pop_block(); - - // Try again, should result in same object IDs - create_bitasset( "BTC", account_id_type() ); - create_bitasset( "GBP", dan_id ); - - generate_block(); - - histories = hist_api.get_account_history("dan", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 3u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 6u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 3u); - } catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} - -BOOST_AUTO_TEST_CASE(track_account2) { - try { - graphene::app::history_api hist_api(app); - - // account_id_type() is tracked - - // account_id_type() creates alice(tracked account) - const account_object& alice = create_account("alice"); - auto alice_id = alice.id; - - //account_id_type() creates some ops - create_bitasset("CNY", account_id_type()); - create_bitasset("USD", account_id_type()); - - // alice makes 1 op - create_bitasset("EUR", alice_id); - - // account_id_type() creates dan(account not tracked) - const account_object& dan = create_account("dan"); - auto dan_id = dan.id; - - generate_block(); - - // all account_id_type() should have 4 ops {4,2,1,0} - vector histories = hist_api.get_account_history("committee-account", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 4u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 2u); - BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); - BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); - - // all alice account should have 2 ops {3, 0} - histories = hist_api.get_account_history("alice", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 2u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); - BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); - - // alice first op should be {0} - histories = hist_api.get_account_history("alice", operation_history_id_type(0), 1, operation_history_id_type(1)); - BOOST_CHECK_EQUAL(histories.size(), 1u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 0u); - - // alice second op should be {3} - histories = hist_api.get_account_history("alice", operation_history_id_type(1), 1, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 1u); - BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); - - // anything against dan should be {} - histories = hist_api.get_account_history("dan", operation_history_id_type(0), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - histories = hist_api.get_account_history("dan", operation_history_id_type(1), 10, operation_history_id_type(0)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - histories = hist_api.get_account_history("dan", operation_history_id_type(1), 1, operation_history_id_type(2)); - BOOST_CHECK_EQUAL(histories.size(), 0u); - - } catch (fc::exception &e) { - edump((e.to_detail_string())); - throw; - } -} +//BOOST_AUTO_TEST_CASE(track_account2) { +// try { +// graphene::app::history_api hist_api(app); +// +// // account_id_type() is tracked +// +// // account_id_type() creates alice(tracked account) +// const account_object& alice = create_account("alice"); +// auto alice_id = alice.id; +// +// //account_id_type() creates some ops +// create_bitasset("CNY", account_id_type()); +// create_bitasset("USD", account_id_type()); +// +// // alice makes 1 op +// create_bitasset("EUR", alice_id); +// +// // account_id_type() creates dan(account not tracked) +// const account_object& dan = create_account("dan"); +// auto dan_id = dan.id; +// +// generate_block(); +// +// // all account_id_type() should have 4 ops {4,2,1,0} +// vector histories = hist_api.get_account_history(account_id_type(), operation_history_id_type(0), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 4u); +// BOOST_CHECK_EQUAL(histories[0].id.instance(), 4u); +// BOOST_CHECK_EQUAL(histories[1].id.instance(), 2u); +// BOOST_CHECK_EQUAL(histories[2].id.instance(), 1u); +// BOOST_CHECK_EQUAL(histories[3].id.instance(), 0u); +// +// // all alice account should have 2 ops {3, 0} +// histories = hist_api.get_account_history(alice_id, operation_history_id_type(0), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 2u); +// BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); +// BOOST_CHECK_EQUAL(histories[1].id.instance(), 0u); +// +// // alice first op should be {0} +// histories = hist_api.get_account_history(alice_id, operation_history_id_type(0), 1, operation_history_id_type(1)); +// BOOST_CHECK_EQUAL(histories.size(), 1u); +// BOOST_CHECK_EQUAL(histories[0].id.instance(), 0u); +// +// // alice second op should be {3} +// histories = hist_api.get_account_history(alice_id, operation_history_id_type(1), 1, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 1u); +// BOOST_CHECK_EQUAL(histories[0].id.instance(), 3u); +// +// // anything against dan should be {} +// histories = hist_api.get_account_history(dan_id, operation_history_id_type(0), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// histories = hist_api.get_account_history(dan_id, operation_history_id_type(1), 10, operation_history_id_type(0)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// histories = hist_api.get_account_history(dan_id, operation_history_id_type(1), 1, operation_history_id_type(2)); +// BOOST_CHECK_EQUAL(histories.size(), 0u); +// +// } catch (fc::exception &e) { +// edump((e.to_detail_string())); +// throw; +// } +//} BOOST_AUTO_TEST_CASE(get_account_history_operations) { try { graphene::app::history_api hist_api(app); - int asset_create_op_id = operation::tag::value; - int account_create_op_id = operation::tag::value; - - // no asset_create operation on account_id_type() should not throw any exception - vector histories = hist_api.get_account_history_operations("committee-account", asset_create_op_id, operation_history_id_type(), operation_history_id_type(), 100); - BOOST_CHECK_EQUAL(histories.size(), 0u); - //account_id_type() do 3 ops create_bitasset("CNY", account_id_type()); create_account("sam"); @@ -564,28 +557,31 @@ BOOST_AUTO_TEST_CASE(get_account_history_operations) { generate_block(); fc::usleep(fc::milliseconds(2000)); + int asset_create_op_id = operation::tag::value; + int account_create_op_id = operation::tag::value; + //account_id_type() did 1 asset_create op - histories = hist_api.get_account_history_operations("committee-account", asset_create_op_id, operation_history_id_type(), operation_history_id_type(), 100); + vector histories = hist_api.get_account_history_operations(account_id_type(), asset_create_op_id, operation_history_id_type(), operation_history_id_type(), 100); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].id.instance(), 0u); BOOST_CHECK_EQUAL(histories[0].op.which(), asset_create_op_id); //account_id_type() did 2 account_create ops - histories = hist_api.get_account_history_operations("committee-account", account_create_op_id, operation_history_id_type(), operation_history_id_type(), 100); + histories = hist_api.get_account_history_operations(account_id_type(), account_create_op_id, operation_history_id_type(), operation_history_id_type(), 100); BOOST_CHECK_EQUAL(histories.size(), 2u); BOOST_CHECK_EQUAL(histories[0].op.which(), account_create_op_id); // No asset_create op larger than id1 - histories = hist_api.get_account_history_operations("committee-account", asset_create_op_id, operation_history_id_type(), operation_history_id_type(1), 100); + histories = hist_api.get_account_history_operations(account_id_type(), asset_create_op_id, operation_history_id_type(), operation_history_id_type(1), 100); BOOST_CHECK_EQUAL(histories.size(), 0u); // Limit 1 returns 1 result - histories = hist_api.get_account_history_operations("committee-account", account_create_op_id, operation_history_id_type(),operation_history_id_type(), 1); + histories = hist_api.get_account_history_operations(account_id_type(), account_create_op_id, operation_history_id_type(),operation_history_id_type(), 1); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].op.which(), account_create_op_id); // alice has 1 op - histories = hist_api.get_account_history_operations("alice", account_create_op_id, operation_history_id_type(),operation_history_id_type(), 100); + histories = hist_api.get_account_history_operations(get_account("alice").id, account_create_op_id, operation_history_id_type(),operation_history_id_type(), 100); BOOST_CHECK_EQUAL(histories.size(), 1u); BOOST_CHECK_EQUAL(histories[0].op.which(), account_create_op_id); @@ -595,4 +591,4 @@ BOOST_AUTO_TEST_CASE(get_account_history_operations) { } } -BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/tests/tests/voting_tests.cpp b/tests/tests/voting_tests.cpp index 79f80e1f..b88f485a 100644 --- a/tests/tests/voting_tests.cpp +++ b/tests/tests/voting_tests.cpp @@ -48,7 +48,7 @@ BOOST_AUTO_TEST_CASE(last_voting_date) // we are going to vote for this witness auto witness1 = witness_id_type(1)(db); - auto stats_obj = db.get_account_stats_by_owner(alice_id); + auto stats_obj = alice_id(db).statistics(db); BOOST_CHECK_EQUAL(stats_obj.last_vote_time.sec_since_epoch(), 0); // alice votes @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(last_voting_date) auto now = db.head_block_time().sec_since_epoch(); // last_vote_time is updated for alice - stats_obj = db.get_account_stats_by_owner(alice_id); + stats_obj = alice_id(db).statistics(db); BOOST_CHECK_EQUAL(stats_obj.last_vote_time.sec_since_epoch(), now); } FC_LOG_AND_RETHROW() @@ -163,360 +163,4 @@ BOOST_AUTO_TEST_CASE(last_voting_date_proxy) } FC_LOG_AND_RETHROW() } -BOOST_AUTO_TEST_CASE(put_my_witnesses) -{ - try - { - graphene::app::database_api db_api1(db); - - ACTORS( (witness0) - (witness1) - (witness2) - (witness3) - (witness4) - (witness5) - (witness6) - (witness7) - (witness8) - (witness9) - (witness10) - (witness11) - (witness12) - (witness13) ); - - // Upgrade all accounts to LTM - upgrade_to_lifetime_member(witness0_id); - upgrade_to_lifetime_member(witness1_id); - upgrade_to_lifetime_member(witness2_id); - upgrade_to_lifetime_member(witness3_id); - upgrade_to_lifetime_member(witness4_id); - upgrade_to_lifetime_member(witness5_id); - upgrade_to_lifetime_member(witness6_id); - upgrade_to_lifetime_member(witness7_id); - upgrade_to_lifetime_member(witness8_id); - upgrade_to_lifetime_member(witness9_id); - upgrade_to_lifetime_member(witness10_id); - upgrade_to_lifetime_member(witness11_id); - upgrade_to_lifetime_member(witness12_id); - upgrade_to_lifetime_member(witness13_id); - - // Create all the witnesses - const witness_id_type witness0_witness_id = create_witness(witness0_id, witness0_private_key).id; - const witness_id_type witness1_witness_id = create_witness(witness1_id, witness1_private_key).id; - const witness_id_type witness2_witness_id = create_witness(witness2_id, witness2_private_key).id; - const witness_id_type witness3_witness_id = create_witness(witness3_id, witness3_private_key).id; - const witness_id_type witness4_witness_id = create_witness(witness4_id, witness4_private_key).id; - const witness_id_type witness5_witness_id = create_witness(witness5_id, witness5_private_key).id; - const witness_id_type witness6_witness_id = create_witness(witness6_id, witness6_private_key).id; - const witness_id_type witness7_witness_id = create_witness(witness7_id, witness7_private_key).id; - const witness_id_type witness8_witness_id = create_witness(witness8_id, witness8_private_key).id; - const witness_id_type witness9_witness_id = create_witness(witness9_id, witness9_private_key).id; - const witness_id_type witness10_witness_id = create_witness(witness10_id, witness10_private_key).id; - const witness_id_type witness11_witness_id = create_witness(witness11_id, witness11_private_key).id; - const witness_id_type witness12_witness_id = create_witness(witness12_id, witness12_private_key).id; - const witness_id_type witness13_witness_id = create_witness(witness13_id, witness13_private_key).id; - - // Create a vector with private key of all witnesses, will be used to activate 11 witnesses at a time - const vector private_keys = { - witness0_private_key, - witness1_private_key, - witness2_private_key, - witness3_private_key, - witness4_private_key, - witness5_private_key, - witness6_private_key, - witness7_private_key, - witness8_private_key, - witness9_private_key, - witness10_private_key, - witness11_private_key, - witness12_private_key, - witness13_private_key - - }; - - // create a map with account id and witness id of the first 11 witnesses - const flat_map witness_map = { - {witness0_id, witness0_witness_id}, - {witness1_id, witness1_witness_id}, - {witness2_id, witness2_witness_id}, - {witness3_id, witness3_witness_id}, - {witness4_id, witness4_witness_id}, - {witness5_id, witness5_witness_id}, - {witness6_id, witness6_witness_id}, - {witness7_id, witness7_witness_id}, - {witness8_id, witness8_witness_id}, - {witness9_id, witness9_witness_id}, - {witness10_id, witness10_witness_id}, - {witness11_id, witness11_witness_id}, - {witness12_id, witness12_witness_id}, - {witness13_id, witness13_witness_id} - }; - - // Check current default witnesses, default chain is configured with 10 witnesses - auto witnesses = db.get_global_properties().active_witnesses; - BOOST_CHECK_EQUAL(witnesses.size(), 10); - BOOST_CHECK_EQUAL(witnesses.begin()[0].instance.value, 1); - BOOST_CHECK_EQUAL(witnesses.begin()[1].instance.value, 2); - BOOST_CHECK_EQUAL(witnesses.begin()[2].instance.value, 3); - BOOST_CHECK_EQUAL(witnesses.begin()[3].instance.value, 4); - BOOST_CHECK_EQUAL(witnesses.begin()[4].instance.value, 5); - BOOST_CHECK_EQUAL(witnesses.begin()[5].instance.value, 6); - BOOST_CHECK_EQUAL(witnesses.begin()[6].instance.value, 7); - BOOST_CHECK_EQUAL(witnesses.begin()[7].instance.value, 8); - BOOST_CHECK_EQUAL(witnesses.begin()[8].instance.value, 9); - BOOST_CHECK_EQUAL(witnesses.begin()[9].instance.value, 10); - - // Activate all witnesses - // Each witness is voted with incremental stake so last witness created will be the ones with more votes - int c = 0; - for (auto l : witness_map) { - int stake = 100 + c + 10; - transfer(committee_account, l.first, asset(stake)); - { - set_expiration(db, trx); - account_update_operation op; - op.account = l.first; - op.new_options = l.first(db).options; - op.new_options->votes.insert(l.second(db).vote_id); - - trx.operations.push_back(op); - sign(trx, private_keys.at(c)); - PUSH_TX(db, trx); - trx.clear(); - } - ++c; - } - - // Trigger the new witnesses - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - // Check my witnesses are now in control of the system - witnesses = db.get_global_properties().active_witnesses; - BOOST_CHECK_EQUAL(witnesses.size(), 11); - BOOST_CHECK_EQUAL(witnesses.begin()[0].instance.value, 14); - BOOST_CHECK_EQUAL(witnesses.begin()[1].instance.value, 15); - BOOST_CHECK_EQUAL(witnesses.begin()[2].instance.value, 16); - BOOST_CHECK_EQUAL(witnesses.begin()[3].instance.value, 17); - BOOST_CHECK_EQUAL(witnesses.begin()[4].instance.value, 18); - BOOST_CHECK_EQUAL(witnesses.begin()[5].instance.value, 19); - BOOST_CHECK_EQUAL(witnesses.begin()[6].instance.value, 20); - BOOST_CHECK_EQUAL(witnesses.begin()[7].instance.value, 21); - BOOST_CHECK_EQUAL(witnesses.begin()[8].instance.value, 22); - BOOST_CHECK_EQUAL(witnesses.begin()[9].instance.value, 23); - BOOST_CHECK_EQUAL(witnesses.begin()[10].instance.value, 24); - - } FC_LOG_AND_RETHROW() -} - -BOOST_AUTO_TEST_CASE(track_votes_witnesses_enabled) -{ - try - { - graphene::app::database_api db_api1(db); - - INVOKE(put_my_witnesses); - - const account_id_type witness1_id= get_account("witness1").id; - auto witness1_object = db_api1.get_witness_by_account(witness1_id(db).name); - BOOST_CHECK_EQUAL(witness1_object->total_votes, 111); - - } FC_LOG_AND_RETHROW() -} - -BOOST_AUTO_TEST_CASE(track_votes_witnesses_disabled) -{ - try - { - graphene::app::database_api db_api1(db); - - INVOKE(put_my_witnesses); - - const account_id_type witness1_id= get_account("witness1").id; - auto witness1_object = db_api1.get_witness_by_account(witness1_id(db).name); - BOOST_CHECK_EQUAL(witness1_object->total_votes, 0); - - } FC_LOG_AND_RETHROW() -} - -BOOST_AUTO_TEST_CASE(put_my_committee_members) -{ - try - { - graphene::app::database_api db_api1(db); - - ACTORS( (committee0) - (committee1) - (committee2) - (committee3) - (committee4) - (committee5) - (committee6) - (committee7) - (committee8) - (committee9) - (committee10) - (committee11) - (committee12) - (committee13) ); - - // Upgrade all accounts to LTM - upgrade_to_lifetime_member(committee0_id); - upgrade_to_lifetime_member(committee1_id); - upgrade_to_lifetime_member(committee2_id); - upgrade_to_lifetime_member(committee3_id); - upgrade_to_lifetime_member(committee4_id); - upgrade_to_lifetime_member(committee5_id); - upgrade_to_lifetime_member(committee6_id); - upgrade_to_lifetime_member(committee7_id); - upgrade_to_lifetime_member(committee8_id); - upgrade_to_lifetime_member(committee9_id); - upgrade_to_lifetime_member(committee10_id); - upgrade_to_lifetime_member(committee11_id); - upgrade_to_lifetime_member(committee12_id); - upgrade_to_lifetime_member(committee13_id); - - // Create all the committee - const committee_member_id_type committee0_committee_id = create_committee_member(committee0_id(db)).id; - const committee_member_id_type committee1_committee_id = create_committee_member(committee1_id(db)).id; - const committee_member_id_type committee2_committee_id = create_committee_member(committee2_id(db)).id; - const committee_member_id_type committee3_committee_id = create_committee_member(committee3_id(db)).id; - const committee_member_id_type committee4_committee_id = create_committee_member(committee4_id(db)).id; - const committee_member_id_type committee5_committee_id = create_committee_member(committee5_id(db)).id; - const committee_member_id_type committee6_committee_id = create_committee_member(committee6_id(db)).id; - const committee_member_id_type committee7_committee_id = create_committee_member(committee7_id(db)).id; - const committee_member_id_type committee8_committee_id = create_committee_member(committee8_id(db)).id; - const committee_member_id_type committee9_committee_id = create_committee_member(committee9_id(db)).id; - const committee_member_id_type committee10_committee_id = create_committee_member(committee10_id(db)).id; - const committee_member_id_type committee11_committee_id = create_committee_member(committee11_id(db)).id; - const committee_member_id_type committee12_committee_id = create_committee_member(committee12_id(db)).id; - const committee_member_id_type committee13_committee_id = create_committee_member(committee13_id(db)).id; - - // Create a vector with private key of all witnesses, will be used to activate 11 witnesses at a time - const vector private_keys = { - committee0_private_key, - committee1_private_key, - committee2_private_key, - committee3_private_key, - committee4_private_key, - committee5_private_key, - committee6_private_key, - committee7_private_key, - committee8_private_key, - committee9_private_key, - committee10_private_key, - committee11_private_key, - committee12_private_key, - committee13_private_key - }; - - // create a map with account id and committee id of the first 11 witnesses - const flat_map committee_map = { - {committee0_id, committee0_committee_id}, - {committee1_id, committee1_committee_id}, - {committee2_id, committee2_committee_id}, - {committee3_id, committee3_committee_id}, - {committee4_id, committee4_committee_id}, - {committee5_id, committee5_committee_id}, - {committee6_id, committee6_committee_id}, - {committee7_id, committee7_committee_id}, - {committee8_id, committee8_committee_id}, - {committee9_id, committee9_committee_id}, - {committee10_id, committee10_committee_id}, - {committee11_id, committee11_committee_id}, - {committee12_id, committee12_committee_id}, - {committee13_id, committee13_committee_id} - }; - - // Check current default witnesses, default chain is configured with 10 witnesses - auto committee_members = db.get_global_properties().active_committee_members; - - BOOST_CHECK_EQUAL(committee_members.size(), 10); - BOOST_CHECK_EQUAL(committee_members.begin()[0].instance.value, 0); - BOOST_CHECK_EQUAL(committee_members.begin()[1].instance.value, 1); - BOOST_CHECK_EQUAL(committee_members.begin()[2].instance.value, 2); - BOOST_CHECK_EQUAL(committee_members.begin()[3].instance.value, 3); - BOOST_CHECK_EQUAL(committee_members.begin()[4].instance.value, 4); - BOOST_CHECK_EQUAL(committee_members.begin()[5].instance.value, 5); - BOOST_CHECK_EQUAL(committee_members.begin()[6].instance.value, 6); - BOOST_CHECK_EQUAL(committee_members.begin()[7].instance.value, 7); - BOOST_CHECK_EQUAL(committee_members.begin()[8].instance.value, 8); - BOOST_CHECK_EQUAL(committee_members.begin()[9].instance.value, 9); - - // Activate all committee - // Each witness is voted with incremental stake so last witness created will be the ones with more votes - int c = 0; - for (auto committee : committee_map) { - int stake = 100 + c + 10; - transfer(committee_account, committee.first, asset(stake)); - { - set_expiration(db, trx); - account_update_operation op; - op.account = committee.first; - op.new_options = committee.first(db).options; - op.new_options->votes.insert(committee.second(db).vote_id); - - trx.operations.push_back(op); - sign(trx, private_keys.at(c)); - PUSH_TX(db, trx); - trx.clear(); - } - ++c; - } - - // Trigger the new committee - generate_blocks(db.get_dynamic_global_properties().next_maintenance_time); - generate_block(); - - // Check my witnesses are now in control of the system - committee_members = db.get_global_properties().active_committee_members; - BOOST_CHECK_EQUAL(committee_members.size(), 11); - - /* TODO we are not in full control, seems to committee members have votes by default - BOOST_CHECK_EQUAL(committee_members.begin()[0].instance.value, 14); - BOOST_CHECK_EQUAL(committee_members.begin()[1].instance.value, 15); - BOOST_CHECK_EQUAL(committee_members.begin()[2].instance.value, 16); - BOOST_CHECK_EQUAL(committee_members.begin()[3].instance.value, 17); - BOOST_CHECK_EQUAL(committee_members.begin()[4].instance.value, 18); - BOOST_CHECK_EQUAL(committee_members.begin()[5].instance.value, 19); - BOOST_CHECK_EQUAL(committee_members.begin()[6].instance.value, 20); - BOOST_CHECK_EQUAL(committee_members.begin()[7].instance.value, 21); - BOOST_CHECK_EQUAL(committee_members.begin()[8].instance.value, 22); - BOOST_CHECK_EQUAL(committee_members.begin()[9].instance.value, 23); - BOOST_CHECK_EQUAL(committee_members.begin()[10].instance.value, 24); - */ - } FC_LOG_AND_RETHROW() -} - -BOOST_AUTO_TEST_CASE(track_votes_committee_enabled) -{ - try - { - graphene::app::database_api db_api1(db); - - INVOKE(put_my_committee_members); - - const account_id_type committee1_id= get_account("committee1").id; - auto committee1_object = db_api1.get_committee_member_by_account(committee1_id(db).name); - BOOST_CHECK_EQUAL(committee1_object->total_votes, 111); - - } FC_LOG_AND_RETHROW() -} - -BOOST_AUTO_TEST_CASE(track_votes_committee_disabled) -{ - try - { - graphene::app::database_api db_api1(db); - - INVOKE(put_my_committee_members); - - const account_id_type committee1_id= get_account("committee1").id; - auto committee1_object = db_api1.get_committee_member_by_account(committee1_id(db).name); - BOOST_CHECK_EQUAL(committee1_object->total_votes, 0); - - } FC_LOG_AND_RETHROW() -} - -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END()