chia-blockchain 2.5.1rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +10 -0
- chia/__main__.py +5 -0
- chia/_tests/README.md +53 -0
- chia/_tests/__init__.py +0 -0
- chia/_tests/blockchain/__init__.py +0 -0
- chia/_tests/blockchain/blockchain_test_utils.py +195 -0
- chia/_tests/blockchain/config.py +4 -0
- chia/_tests/blockchain/test_augmented_chain.py +145 -0
- chia/_tests/blockchain/test_blockchain.py +4202 -0
- chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
- chia/_tests/blockchain/test_build_chains.py +59 -0
- chia/_tests/blockchain/test_get_block_generator.py +72 -0
- chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
- chia/_tests/build-init-files.py +92 -0
- chia/_tests/build-job-matrix.py +204 -0
- chia/_tests/check_pytest_monitor_output.py +34 -0
- chia/_tests/check_sql_statements.py +72 -0
- chia/_tests/chia-start-sim +42 -0
- chia/_tests/clvm/__init__.py +0 -0
- chia/_tests/clvm/benchmark_costs.py +23 -0
- chia/_tests/clvm/coin_store.py +149 -0
- chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
- chia/_tests/clvm/test_clvm_step.py +37 -0
- chia/_tests/clvm/test_condition_codes.py +13 -0
- chia/_tests/clvm/test_curry_and_treehash.py +55 -0
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_program.py +150 -0
- chia/_tests/clvm/test_puzzle_compression.py +143 -0
- chia/_tests/clvm/test_puzzle_drivers.py +45 -0
- chia/_tests/clvm/test_puzzles.py +242 -0
- chia/_tests/clvm/test_singletons.py +540 -0
- chia/_tests/clvm/test_spend_sim.py +181 -0
- chia/_tests/cmds/__init__.py +0 -0
- chia/_tests/cmds/cmd_test_utils.py +469 -0
- chia/_tests/cmds/config.py +3 -0
- chia/_tests/cmds/conftest.py +23 -0
- chia/_tests/cmds/test_click_types.py +200 -0
- chia/_tests/cmds/test_cmd_framework.py +620 -0
- chia/_tests/cmds/test_cmds_util.py +97 -0
- chia/_tests/cmds/test_daemon.py +92 -0
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +66 -0
- chia/_tests/cmds/test_show.py +116 -0
- chia/_tests/cmds/test_sim.py +207 -0
- chia/_tests/cmds/test_timelock_args.py +75 -0
- chia/_tests/cmds/test_tx_config_args.py +154 -0
- chia/_tests/cmds/testing_classes.py +59 -0
- chia/_tests/cmds/wallet/__init__.py +0 -0
- chia/_tests/cmds/wallet/test_consts.py +47 -0
- chia/_tests/cmds/wallet/test_dao.py +565 -0
- chia/_tests/cmds/wallet/test_did.py +403 -0
- chia/_tests/cmds/wallet/test_nft.py +471 -0
- chia/_tests/cmds/wallet/test_notifications.py +124 -0
- chia/_tests/cmds/wallet/test_offer.toffer +1 -0
- chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
- chia/_tests/cmds/wallet/test_vcs.py +400 -0
- chia/_tests/cmds/wallet/test_wallet.py +1125 -0
- chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
- chia/_tests/conftest.py +1419 -0
- chia/_tests/connection_utils.py +125 -0
- chia/_tests/core/__init__.py +0 -0
- chia/_tests/core/cmds/__init__.py +0 -0
- chia/_tests/core/cmds/test_beta.py +382 -0
- chia/_tests/core/cmds/test_keys.py +1734 -0
- chia/_tests/core/cmds/test_wallet.py +126 -0
- chia/_tests/core/config.py +3 -0
- chia/_tests/core/consensus/__init__.py +0 -0
- chia/_tests/core/consensus/test_block_creation.py +54 -0
- chia/_tests/core/consensus/test_pot_iterations.py +117 -0
- chia/_tests/core/custom_types/__init__.py +0 -0
- chia/_tests/core/custom_types/test_coin.py +107 -0
- chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
- chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
- chia/_tests/core/daemon/__init__.py +0 -0
- chia/_tests/core/daemon/config.py +4 -0
- chia/_tests/core/daemon/test_daemon.py +2128 -0
- chia/_tests/core/daemon/test_daemon_register.py +109 -0
- chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
- chia/_tests/core/data_layer/__init__.py +0 -0
- chia/_tests/core/data_layer/config.py +5 -0
- chia/_tests/core/data_layer/conftest.py +106 -0
- chia/_tests/core/data_layer/test_data_cli.py +56 -0
- chia/_tests/core/data_layer/test_data_layer.py +83 -0
- chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
- chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
- chia/_tests/core/data_layer/test_data_store.py +2424 -0
- chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
- chia/_tests/core/data_layer/test_plugin.py +91 -0
- chia/_tests/core/data_layer/util.py +233 -0
- chia/_tests/core/farmer/__init__.py +0 -0
- chia/_tests/core/farmer/config.py +3 -0
- chia/_tests/core/farmer/test_farmer_api.py +103 -0
- chia/_tests/core/full_node/__init__.py +0 -0
- chia/_tests/core/full_node/config.py +4 -0
- chia/_tests/core/full_node/dos/__init__.py +0 -0
- chia/_tests/core/full_node/dos/config.py +3 -0
- chia/_tests/core/full_node/full_sync/__init__.py +0 -0
- chia/_tests/core/full_node/full_sync/config.py +4 -0
- chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
- chia/_tests/core/full_node/ram_db.py +27 -0
- chia/_tests/core/full_node/stores/__init__.py +0 -0
- chia/_tests/core/full_node/stores/config.py +4 -0
- chia/_tests/core/full_node/stores/test_block_store.py +590 -0
- chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
- chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
- chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
- chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
- chia/_tests/core/full_node/test_address_manager.py +588 -0
- chia/_tests/core/full_node/test_block_height_map.py +556 -0
- chia/_tests/core/full_node/test_conditions.py +556 -0
- chia/_tests/core/full_node/test_full_node.py +2700 -0
- chia/_tests/core/full_node/test_generator_tools.py +82 -0
- chia/_tests/core/full_node/test_hint_management.py +104 -0
- chia/_tests/core/full_node/test_node_load.py +34 -0
- chia/_tests/core/full_node/test_performance.py +179 -0
- chia/_tests/core/full_node/test_subscriptions.py +492 -0
- chia/_tests/core/full_node/test_transactions.py +203 -0
- chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
- chia/_tests/core/large_block.py +2388 -0
- chia/_tests/core/make_block_generator.py +70 -0
- chia/_tests/core/mempool/__init__.py +0 -0
- chia/_tests/core/mempool/config.py +4 -0
- chia/_tests/core/mempool/test_mempool.py +3255 -0
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
- chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
- chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
- chia/_tests/core/mempool/test_mempool_performance.py +64 -0
- chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
- chia/_tests/core/node_height.py +28 -0
- chia/_tests/core/server/__init__.py +0 -0
- chia/_tests/core/server/config.py +3 -0
- chia/_tests/core/server/flood.py +84 -0
- chia/_tests/core/server/serve.py +135 -0
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +66 -0
- chia/_tests/core/server/test_dos.py +319 -0
- chia/_tests/core/server/test_event_loop.py +109 -0
- chia/_tests/core/server/test_loop.py +294 -0
- chia/_tests/core/server/test_node_discovery.py +73 -0
- chia/_tests/core/server/test_rate_limits.py +482 -0
- chia/_tests/core/server/test_server.py +226 -0
- chia/_tests/core/server/test_upnp.py +8 -0
- chia/_tests/core/services/__init__.py +0 -0
- chia/_tests/core/services/config.py +3 -0
- chia/_tests/core/services/test_services.py +188 -0
- chia/_tests/core/ssl/__init__.py +0 -0
- chia/_tests/core/ssl/config.py +3 -0
- chia/_tests/core/ssl/test_ssl.py +202 -0
- chia/_tests/core/test_coins.py +33 -0
- chia/_tests/core/test_cost_calculation.py +313 -0
- chia/_tests/core/test_crawler.py +175 -0
- chia/_tests/core/test_crawler_rpc.py +53 -0
- chia/_tests/core/test_daemon_rpc.py +24 -0
- chia/_tests/core/test_db_conversion.py +130 -0
- chia/_tests/core/test_db_validation.py +162 -0
- chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
- chia/_tests/core/test_filter.py +35 -0
- chia/_tests/core/test_full_node_rpc.py +768 -0
- chia/_tests/core/test_merkle_set.py +343 -0
- chia/_tests/core/test_program.py +47 -0
- chia/_tests/core/test_rpc_util.py +86 -0
- chia/_tests/core/test_seeder.py +420 -0
- chia/_tests/core/test_setproctitle.py +13 -0
- chia/_tests/core/util/__init__.py +0 -0
- chia/_tests/core/util/config.py +4 -0
- chia/_tests/core/util/test_block_cache.py +44 -0
- chia/_tests/core/util/test_cached_bls.py +57 -0
- chia/_tests/core/util/test_config.py +337 -0
- chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
- chia/_tests/core/util/test_files.py +391 -0
- chia/_tests/core/util/test_jsonify.py +146 -0
- chia/_tests/core/util/test_keychain.py +522 -0
- chia/_tests/core/util/test_keyring_wrapper.py +491 -0
- chia/_tests/core/util/test_lockfile.py +380 -0
- chia/_tests/core/util/test_log_exceptions.py +187 -0
- chia/_tests/core/util/test_lru_cache.py +56 -0
- chia/_tests/core/util/test_significant_bits.py +40 -0
- chia/_tests/core/util/test_streamable.py +883 -0
- chia/_tests/db/__init__.py +0 -0
- chia/_tests/db/test_db_wrapper.py +566 -0
- chia/_tests/environments/__init__.py +0 -0
- chia/_tests/environments/common.py +35 -0
- chia/_tests/environments/full_node.py +47 -0
- chia/_tests/environments/wallet.py +429 -0
- chia/_tests/ether.py +19 -0
- chia/_tests/farmer_harvester/__init__.py +0 -0
- chia/_tests/farmer_harvester/config.py +3 -0
- chia/_tests/farmer_harvester/test_farmer.py +1264 -0
- chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
- chia/_tests/fee_estimation/__init__.py +0 -0
- chia/_tests/fee_estimation/config.py +3 -0
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
- chia/_tests/generator/__init__.py +0 -0
- chia/_tests/generator/puzzles/__init__.py +0 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
- chia/_tests/generator/test_compression.py +201 -0
- chia/_tests/generator/test_generator_types.py +44 -0
- chia/_tests/generator/test_rom.py +180 -0
- chia/_tests/plot_sync/__init__.py +0 -0
- chia/_tests/plot_sync/config.py +3 -0
- chia/_tests/plot_sync/test_delta.py +101 -0
- chia/_tests/plot_sync/test_plot_sync.py +618 -0
- chia/_tests/plot_sync/test_receiver.py +451 -0
- chia/_tests/plot_sync/test_sender.py +116 -0
- chia/_tests/plot_sync/test_sync_simulated.py +451 -0
- chia/_tests/plot_sync/util.py +68 -0
- chia/_tests/plotting/__init__.py +0 -0
- chia/_tests/plotting/config.py +3 -0
- chia/_tests/plotting/test_plot_manager.py +781 -0
- chia/_tests/plotting/util.py +12 -0
- chia/_tests/pools/__init__.py +0 -0
- chia/_tests/pools/config.py +5 -0
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +1001 -0
- chia/_tests/pools/test_pool_config.py +42 -0
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
- chia/_tests/pools/test_pool_rpc.py +1123 -0
- chia/_tests/pools/test_pool_wallet.py +205 -0
- chia/_tests/pools/test_wallet_pool_store.py +161 -0
- chia/_tests/process_junit.py +348 -0
- chia/_tests/rpc/__init__.py +0 -0
- chia/_tests/rpc/test_rpc_client.py +138 -0
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/__init__.py +0 -0
- chia/_tests/simulation/config.py +6 -0
- chia/_tests/simulation/test_simulation.py +501 -0
- chia/_tests/simulation/test_simulator.py +232 -0
- chia/_tests/simulation/test_start_simulator.py +107 -0
- chia/_tests/testconfig.py +13 -0
- chia/_tests/timelord/__init__.py +0 -0
- chia/_tests/timelord/config.py +3 -0
- chia/_tests/timelord/test_new_peak.py +437 -0
- chia/_tests/timelord/test_timelord.py +11 -0
- chia/_tests/tools/1315537.json +170 -0
- chia/_tests/tools/1315544.json +160 -0
- chia/_tests/tools/1315630.json +150 -0
- chia/_tests/tools/300000.json +105 -0
- chia/_tests/tools/442734.json +140 -0
- chia/_tests/tools/466212.json +130 -0
- chia/_tests/tools/__init__.py +0 -0
- chia/_tests/tools/config.py +5 -0
- chia/_tests/tools/test-blockchain-db.sqlite +0 -0
- chia/_tests/tools/test_full_sync.py +30 -0
- chia/_tests/tools/test_legacy_keyring.py +82 -0
- chia/_tests/tools/test_run_block.py +128 -0
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/__init__.py +0 -0
- chia/_tests/util/benchmark_cost.py +170 -0
- chia/_tests/util/benchmarks.py +153 -0
- chia/_tests/util/bip39_test_vectors.json +148 -0
- chia/_tests/util/blockchain.py +134 -0
- chia/_tests/util/blockchain_mock.py +132 -0
- chia/_tests/util/build_network_protocol_files.py +302 -0
- chia/_tests/util/clvm_generator.bin +0 -0
- chia/_tests/util/config.py +3 -0
- chia/_tests/util/constants.py +20 -0
- chia/_tests/util/db_connection.py +37 -0
- chia/_tests/util/full_sync.py +253 -0
- chia/_tests/util/gen_ssl_certs.py +114 -0
- chia/_tests/util/generator_tools_testing.py +45 -0
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +36 -0
- chia/_tests/util/misc.py +675 -0
- chia/_tests/util/network_protocol_data.py +1072 -0
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +2701 -0
- chia/_tests/util/rpc.py +26 -0
- chia/_tests/util/run_block.py +163 -0
- chia/_tests/util/setup_nodes.py +481 -0
- chia/_tests/util/spend_sim.py +492 -0
- chia/_tests/util/split_managers.py +102 -0
- chia/_tests/util/temp_file.py +14 -0
- chia/_tests/util/test_action_scope.py +144 -0
- chia/_tests/util/test_async_pool.py +366 -0
- chia/_tests/util/test_build_job_matrix.py +42 -0
- chia/_tests/util/test_build_network_protocol_files.py +7 -0
- chia/_tests/util/test_chia_version.py +50 -0
- chia/_tests/util/test_collection.py +11 -0
- chia/_tests/util/test_condition_tools.py +229 -0
- chia/_tests/util/test_config.py +426 -0
- chia/_tests/util/test_dump_keyring.py +60 -0
- chia/_tests/util/test_errors.py +10 -0
- chia/_tests/util/test_full_block_utils.py +279 -0
- chia/_tests/util/test_installed.py +20 -0
- chia/_tests/util/test_limited_semaphore.py +53 -0
- chia/_tests/util/test_logging_filter.py +42 -0
- chia/_tests/util/test_misc.py +445 -0
- chia/_tests/util/test_network.py +73 -0
- chia/_tests/util/test_network_protocol_files.py +578 -0
- chia/_tests/util/test_network_protocol_json.py +267 -0
- chia/_tests/util/test_network_protocol_test.py +256 -0
- chia/_tests/util/test_paginator.py +71 -0
- chia/_tests/util/test_pprint.py +17 -0
- chia/_tests/util/test_priority_mutex.py +488 -0
- chia/_tests/util/test_recursive_replace.py +116 -0
- chia/_tests/util/test_replace_str_to_bytes.py +137 -0
- chia/_tests/util/test_service_groups.py +15 -0
- chia/_tests/util/test_ssl_check.py +31 -0
- chia/_tests/util/test_testnet_overrides.py +19 -0
- chia/_tests/util/test_tests_misc.py +38 -0
- chia/_tests/util/test_timing.py +37 -0
- chia/_tests/util/test_trusted_peer.py +51 -0
- chia/_tests/util/time_out_assert.py +191 -0
- chia/_tests/wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/config.py +4 -0
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
- chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
- chia/_tests/wallet/clawback/__init__.py +0 -0
- chia/_tests/wallet/clawback/config.py +3 -0
- chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
- chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
- chia/_tests/wallet/config.py +4 -0
- chia/_tests/wallet/conftest.py +278 -0
- chia/_tests/wallet/dao_wallet/__init__.py +0 -0
- chia/_tests/wallet/dao_wallet/config.py +3 -0
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
- chia/_tests/wallet/db_wallet/__init__.py +0 -0
- chia/_tests/wallet/db_wallet/config.py +3 -0
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
- chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
- chia/_tests/wallet/did_wallet/__init__.py +0 -0
- chia/_tests/wallet/did_wallet/config.py +4 -0
- chia/_tests/wallet/did_wallet/test_did.py +2284 -0
- chia/_tests/wallet/nft_wallet/__init__.py +0 -0
- chia/_tests/wallet/nft_wallet/config.py +4 -0
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
- chia/_tests/wallet/rpc/__init__.py +0 -0
- chia/_tests/wallet/rpc/config.py +4 -0
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
- chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
- chia/_tests/wallet/simple_sync/__init__.py +0 -0
- chia/_tests/wallet/simple_sync/config.py +3 -0
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
- chia/_tests/wallet/sync/__init__.py +0 -0
- chia/_tests/wallet/sync/config.py +4 -0
- chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
- chia/_tests/wallet/test_address_type.py +189 -0
- chia/_tests/wallet/test_bech32m.py +45 -0
- chia/_tests/wallet/test_clvm_streamable.py +244 -0
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +588 -0
- chia/_tests/wallet/test_conditions.py +400 -0
- chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
- chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
- chia/_tests/wallet/test_nft_store.py +192 -0
- chia/_tests/wallet/test_notifications.py +196 -0
- chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
- chia/_tests/wallet/test_puzzle_store.py +132 -0
- chia/_tests/wallet/test_sign_coin_spends.py +159 -0
- chia/_tests/wallet/test_signer_protocol.py +947 -0
- chia/_tests/wallet/test_singleton.py +122 -0
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
- chia/_tests/wallet/test_singleton_store.py +152 -0
- chia/_tests/wallet/test_taproot.py +19 -0
- chia/_tests/wallet/test_transaction_store.py +945 -0
- chia/_tests/wallet/test_util.py +185 -0
- chia/_tests/wallet/test_wallet.py +2139 -0
- chia/_tests/wallet/test_wallet_action_scope.py +85 -0
- chia/_tests/wallet/test_wallet_blockchain.py +111 -0
- chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
- chia/_tests/wallet/test_wallet_interested_store.py +43 -0
- chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
- chia/_tests/wallet/test_wallet_node.py +780 -0
- chia/_tests/wallet/test_wallet_retry.py +95 -0
- chia/_tests/wallet/test_wallet_state_manager.py +259 -0
- chia/_tests/wallet/test_wallet_test_framework.py +275 -0
- chia/_tests/wallet/test_wallet_trade_store.py +218 -0
- chia/_tests/wallet/test_wallet_user_store.py +34 -0
- chia/_tests/wallet/test_wallet_utils.py +156 -0
- chia/_tests/wallet/vc_wallet/__init__.py +0 -0
- chia/_tests/wallet/vc_wallet/config.py +3 -0
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
- chia/_tests/wallet/wallet_block_tools.py +327 -0
- chia/_tests/weight_proof/__init__.py +0 -0
- chia/_tests/weight_proof/config.py +3 -0
- chia/_tests/weight_proof/test_weight_proof.py +528 -0
- chia/apis.py +19 -0
- chia/clvm/__init__.py +0 -0
- chia/cmds/__init__.py +0 -0
- chia/cmds/beta.py +184 -0
- chia/cmds/beta_funcs.py +137 -0
- chia/cmds/check_wallet_db.py +420 -0
- chia/cmds/chia.py +151 -0
- chia/cmds/cmd_classes.py +323 -0
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +488 -0
- chia/cmds/coin_funcs.py +275 -0
- chia/cmds/coins.py +182 -0
- chia/cmds/completion.py +49 -0
- chia/cmds/configure.py +332 -0
- chia/cmds/dao.py +1064 -0
- chia/cmds/dao_funcs.py +598 -0
- chia/cmds/data.py +708 -0
- chia/cmds/data_funcs.py +385 -0
- chia/cmds/db.py +87 -0
- chia/cmds/db_backup_func.py +77 -0
- chia/cmds/db_upgrade_func.py +452 -0
- chia/cmds/db_validate_func.py +184 -0
- chia/cmds/dev.py +18 -0
- chia/cmds/farm.py +100 -0
- chia/cmds/farm_funcs.py +200 -0
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +63 -0
- chia/cmds/init_funcs.py +367 -0
- chia/cmds/installers.py +131 -0
- chia/cmds/keys.py +527 -0
- chia/cmds/keys_funcs.py +863 -0
- chia/cmds/netspace.py +50 -0
- chia/cmds/netspace_funcs.py +54 -0
- chia/cmds/options.py +32 -0
- chia/cmds/param_types.py +238 -0
- chia/cmds/passphrase.py +131 -0
- chia/cmds/passphrase_funcs.py +292 -0
- chia/cmds/peer.py +51 -0
- chia/cmds/peer_funcs.py +129 -0
- chia/cmds/plotnft.py +260 -0
- chia/cmds/plotnft_funcs.py +405 -0
- chia/cmds/plots.py +230 -0
- chia/cmds/plotters.py +18 -0
- chia/cmds/rpc.py +208 -0
- chia/cmds/show.py +72 -0
- chia/cmds/show_funcs.py +215 -0
- chia/cmds/signer.py +296 -0
- chia/cmds/sim.py +225 -0
- chia/cmds/sim_funcs.py +509 -0
- chia/cmds/start.py +24 -0
- chia/cmds/start_funcs.py +109 -0
- chia/cmds/stop.py +62 -0
- chia/cmds/units.py +9 -0
- chia/cmds/wallet.py +1901 -0
- chia/cmds/wallet_funcs.py +1874 -0
- chia/consensus/__init__.py +0 -0
- chia/consensus/block_body_validation.py +562 -0
- chia/consensus/block_creation.py +546 -0
- chia/consensus/block_header_validation.py +1059 -0
- chia/consensus/block_record.py +31 -0
- chia/consensus/block_rewards.py +53 -0
- chia/consensus/blockchain.py +1087 -0
- chia/consensus/blockchain_interface.py +56 -0
- chia/consensus/coinbase.py +30 -0
- chia/consensus/condition_costs.py +9 -0
- chia/consensus/constants.py +49 -0
- chia/consensus/cost_calculator.py +15 -0
- chia/consensus/default_constants.py +89 -0
- chia/consensus/deficit.py +55 -0
- chia/consensus/difficulty_adjustment.py +412 -0
- chia/consensus/find_fork_point.py +111 -0
- chia/consensus/full_block_to_block_record.py +167 -0
- chia/consensus/get_block_challenge.py +106 -0
- chia/consensus/get_block_generator.py +27 -0
- chia/consensus/make_sub_epoch_summary.py +210 -0
- chia/consensus/multiprocess_validation.py +268 -0
- chia/consensus/pos_quality.py +19 -0
- chia/consensus/pot_iterations.py +67 -0
- chia/consensus/puzzles/__init__.py +0 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
- chia/consensus/vdf_info_computation.py +156 -0
- chia/daemon/__init__.py +0 -0
- chia/daemon/client.py +252 -0
- chia/daemon/keychain_proxy.py +502 -0
- chia/daemon/keychain_server.py +365 -0
- chia/daemon/server.py +1606 -0
- chia/daemon/windows_signal.py +56 -0
- chia/data_layer/__init__.py +0 -0
- chia/data_layer/data_layer.py +1291 -0
- chia/data_layer/data_layer_api.py +33 -0
- chia/data_layer/data_layer_errors.py +50 -0
- chia/data_layer/data_layer_server.py +170 -0
- chia/data_layer/data_layer_util.py +985 -0
- chia/data_layer/data_layer_wallet.py +1311 -0
- chia/data_layer/data_store.py +2267 -0
- chia/data_layer/dl_wallet_store.py +407 -0
- chia/data_layer/download_data.py +389 -0
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
- chia/data_layer/s3_plugin_config.yml +33 -0
- chia/data_layer/s3_plugin_service.py +468 -0
- chia/data_layer/util/__init__.py +0 -0
- chia/data_layer/util/benchmark.py +107 -0
- chia/data_layer/util/plugin.py +40 -0
- chia/farmer/__init__.py +0 -0
- chia/farmer/farmer.py +923 -0
- chia/farmer/farmer_api.py +820 -0
- chia/full_node/__init__.py +0 -0
- chia/full_node/bitcoin_fee_estimator.py +85 -0
- chia/full_node/block_height_map.py +271 -0
- chia/full_node/block_store.py +576 -0
- chia/full_node/bundle_tools.py +19 -0
- chia/full_node/coin_store.py +647 -0
- chia/full_node/fee_estimate.py +54 -0
- chia/full_node/fee_estimate_store.py +24 -0
- chia/full_node/fee_estimation.py +92 -0
- chia/full_node/fee_estimator.py +90 -0
- chia/full_node/fee_estimator_constants.py +38 -0
- chia/full_node/fee_estimator_interface.py +42 -0
- chia/full_node/fee_history.py +25 -0
- chia/full_node/fee_tracker.py +564 -0
- chia/full_node/full_node.py +3327 -0
- chia/full_node/full_node_api.py +2025 -0
- chia/full_node/full_node_store.py +1033 -0
- chia/full_node/hint_management.py +56 -0
- chia/full_node/hint_store.py +93 -0
- chia/full_node/mempool.py +589 -0
- chia/full_node/mempool_check_conditions.py +146 -0
- chia/full_node/mempool_manager.py +853 -0
- chia/full_node/pending_tx_cache.py +112 -0
- chia/full_node/puzzles/__init__.py +0 -0
- chia/full_node/puzzles/block_program_zero.clsp +14 -0
- chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
- chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
- chia/full_node/signage_point.py +16 -0
- chia/full_node/subscriptions.py +247 -0
- chia/full_node/sync_store.py +146 -0
- chia/full_node/tx_processing_queue.py +78 -0
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +1720 -0
- chia/harvester/__init__.py +0 -0
- chia/harvester/harvester.py +272 -0
- chia/harvester/harvester_api.py +380 -0
- chia/introducer/__init__.py +0 -0
- chia/introducer/introducer.py +122 -0
- chia/introducer/introducer_api.py +70 -0
- chia/legacy/__init__.py +0 -0
- chia/legacy/keyring.py +155 -0
- chia/plot_sync/__init__.py +0 -0
- chia/plot_sync/delta.py +61 -0
- chia/plot_sync/exceptions.py +56 -0
- chia/plot_sync/receiver.py +386 -0
- chia/plot_sync/sender.py +340 -0
- chia/plot_sync/util.py +43 -0
- chia/plotters/__init__.py +0 -0
- chia/plotters/bladebit.py +388 -0
- chia/plotters/chiapos.py +63 -0
- chia/plotters/madmax.py +224 -0
- chia/plotters/plotters.py +577 -0
- chia/plotters/plotters_util.py +133 -0
- chia/plotting/__init__.py +0 -0
- chia/plotting/cache.py +213 -0
- chia/plotting/check_plots.py +283 -0
- chia/plotting/create_plots.py +278 -0
- chia/plotting/manager.py +436 -0
- chia/plotting/util.py +336 -0
- chia/pools/__init__.py +0 -0
- chia/pools/pool_config.py +110 -0
- chia/pools/pool_puzzles.py +459 -0
- chia/pools/pool_wallet.py +933 -0
- chia/pools/pool_wallet_info.py +118 -0
- chia/pools/puzzles/__init__.py +0 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
- chia/protocols/__init__.py +0 -0
- chia/protocols/farmer_protocol.py +102 -0
- chia/protocols/full_node_protocol.py +219 -0
- chia/protocols/harvester_protocol.py +216 -0
- chia/protocols/introducer_protocol.py +25 -0
- chia/protocols/pool_protocol.py +177 -0
- chia/protocols/protocol_message_types.py +139 -0
- chia/protocols/protocol_state_machine.py +87 -0
- chia/protocols/protocol_timing.py +8 -0
- chia/protocols/shared_protocol.py +86 -0
- chia/protocols/timelord_protocol.py +93 -0
- chia/protocols/wallet_protocol.py +401 -0
- chia/py.typed +0 -0
- chia/rpc/__init__.py +0 -0
- chia/rpc/crawler_rpc_api.py +80 -0
- chia/rpc/data_layer_rpc_api.py +644 -0
- chia/rpc/data_layer_rpc_client.py +188 -0
- chia/rpc/data_layer_rpc_util.py +58 -0
- chia/rpc/farmer_rpc_api.py +365 -0
- chia/rpc/farmer_rpc_client.py +86 -0
- chia/rpc/full_node_rpc_api.py +959 -0
- chia/rpc/full_node_rpc_client.py +292 -0
- chia/rpc/harvester_rpc_api.py +141 -0
- chia/rpc/harvester_rpc_client.py +54 -0
- chia/rpc/rpc_client.py +164 -0
- chia/rpc/rpc_server.py +521 -0
- chia/rpc/timelord_rpc_api.py +32 -0
- chia/rpc/util.py +93 -0
- chia/rpc/wallet_request_types.py +904 -0
- chia/rpc/wallet_rpc_api.py +4943 -0
- chia/rpc/wallet_rpc_client.py +1814 -0
- chia/seeder/__init__.py +0 -0
- chia/seeder/crawl_store.py +425 -0
- chia/seeder/crawler.py +410 -0
- chia/seeder/crawler_api.py +135 -0
- chia/seeder/dns_server.py +593 -0
- chia/seeder/peer_record.py +146 -0
- chia/seeder/start_crawler.py +92 -0
- chia/server/__init__.py +0 -0
- chia/server/address_manager.py +658 -0
- chia/server/address_manager_store.py +237 -0
- chia/server/api_protocol.py +116 -0
- chia/server/capabilities.py +24 -0
- chia/server/chia_policy.py +346 -0
- chia/server/introducer_peers.py +76 -0
- chia/server/node_discovery.py +714 -0
- chia/server/outbound_message.py +33 -0
- chia/server/rate_limit_numbers.py +214 -0
- chia/server/rate_limits.py +153 -0
- chia/server/server.py +741 -0
- chia/server/signal_handlers.py +120 -0
- chia/server/ssl_context.py +32 -0
- chia/server/start_data_layer.py +151 -0
- chia/server/start_farmer.py +98 -0
- chia/server/start_full_node.py +112 -0
- chia/server/start_harvester.py +93 -0
- chia/server/start_introducer.py +81 -0
- chia/server/start_service.py +316 -0
- chia/server/start_timelord.py +89 -0
- chia/server/start_wallet.py +113 -0
- chia/server/upnp.py +118 -0
- chia/server/ws_connection.py +766 -0
- chia/simulator/__init__.py +0 -0
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +2054 -0
- chia/simulator/full_node_simulator.py +794 -0
- chia/simulator/keyring.py +128 -0
- chia/simulator/setup_services.py +506 -0
- chia/simulator/simulator_constants.py +13 -0
- chia/simulator/simulator_full_node_rpc_api.py +99 -0
- chia/simulator/simulator_full_node_rpc_client.py +60 -0
- chia/simulator/simulator_protocol.py +29 -0
- chia/simulator/simulator_test_tools.py +164 -0
- chia/simulator/socket.py +24 -0
- chia/simulator/ssl_certs.py +114 -0
- chia/simulator/ssl_certs_1.py +697 -0
- chia/simulator/ssl_certs_10.py +697 -0
- chia/simulator/ssl_certs_2.py +697 -0
- chia/simulator/ssl_certs_3.py +697 -0
- chia/simulator/ssl_certs_4.py +697 -0
- chia/simulator/ssl_certs_5.py +697 -0
- chia/simulator/ssl_certs_6.py +697 -0
- chia/simulator/ssl_certs_7.py +697 -0
- chia/simulator/ssl_certs_8.py +697 -0
- chia/simulator/ssl_certs_9.py +697 -0
- chia/simulator/start_simulator.py +143 -0
- chia/simulator/wallet_tools.py +246 -0
- chia/ssl/__init__.py +0 -0
- chia/ssl/chia_ca.crt +19 -0
- chia/ssl/chia_ca.key +28 -0
- chia/ssl/create_ssl.py +249 -0
- chia/ssl/dst_root_ca.pem +20 -0
- chia/timelord/__init__.py +0 -0
- chia/timelord/iters_from_block.py +50 -0
- chia/timelord/timelord.py +1226 -0
- chia/timelord/timelord_api.py +138 -0
- chia/timelord/timelord_launcher.py +190 -0
- chia/timelord/timelord_state.py +244 -0
- chia/timelord/types.py +22 -0
- chia/types/__init__.py +0 -0
- chia/types/aliases.py +35 -0
- chia/types/block_protocol.py +20 -0
- chia/types/blockchain_format/__init__.py +0 -0
- chia/types/blockchain_format/classgroup.py +5 -0
- chia/types/blockchain_format/coin.py +28 -0
- chia/types/blockchain_format/foliage.py +8 -0
- chia/types/blockchain_format/pool_target.py +5 -0
- chia/types/blockchain_format/program.py +269 -0
- chia/types/blockchain_format/proof_of_space.py +135 -0
- chia/types/blockchain_format/reward_chain_block.py +6 -0
- chia/types/blockchain_format/serialized_program.py +5 -0
- chia/types/blockchain_format/sized_bytes.py +11 -0
- chia/types/blockchain_format/slots.py +9 -0
- chia/types/blockchain_format/sub_epoch_summary.py +5 -0
- chia/types/blockchain_format/tree_hash.py +72 -0
- chia/types/blockchain_format/vdf.py +86 -0
- chia/types/clvm_cost.py +13 -0
- chia/types/coin_record.py +43 -0
- chia/types/coin_spend.py +115 -0
- chia/types/condition_opcodes.py +73 -0
- chia/types/condition_with_args.py +16 -0
- chia/types/eligible_coin_spends.py +365 -0
- chia/types/end_of_slot_bundle.py +5 -0
- chia/types/fee_rate.py +38 -0
- chia/types/full_block.py +5 -0
- chia/types/generator_types.py +13 -0
- chia/types/header_block.py +5 -0
- chia/types/internal_mempool_item.py +18 -0
- chia/types/mempool_inclusion_status.py +9 -0
- chia/types/mempool_item.py +85 -0
- chia/types/mempool_submission_status.py +30 -0
- chia/types/mojos.py +7 -0
- chia/types/peer_info.py +64 -0
- chia/types/signing_mode.py +29 -0
- chia/types/spend_bundle.py +30 -0
- chia/types/spend_bundle_conditions.py +7 -0
- chia/types/transaction_queue_entry.py +55 -0
- chia/types/unfinished_block.py +5 -0
- chia/types/unfinished_header_block.py +37 -0
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +49 -0
- chia/util/__init__.py +0 -0
- chia/util/action_scope.py +168 -0
- chia/util/async_pool.py +226 -0
- chia/util/augmented_chain.py +134 -0
- chia/util/batches.py +42 -0
- chia/util/bech32m.py +126 -0
- chia/util/beta_metrics.py +119 -0
- chia/util/block_cache.py +56 -0
- chia/util/byte_types.py +12 -0
- chia/util/check_fork_next_block.py +33 -0
- chia/util/chia_logging.py +144 -0
- chia/util/chia_version.py +33 -0
- chia/util/collection.py +17 -0
- chia/util/condition_tools.py +201 -0
- chia/util/config.py +367 -0
- chia/util/cpu.py +22 -0
- chia/util/db_synchronous.py +23 -0
- chia/util/db_version.py +32 -0
- chia/util/db_wrapper.py +430 -0
- chia/util/default_root.py +27 -0
- chia/util/dump_keyring.py +93 -0
- chia/util/english.txt +2048 -0
- chia/util/errors.py +353 -0
- chia/util/file_keyring.py +469 -0
- chia/util/files.py +97 -0
- chia/util/full_block_utils.py +345 -0
- chia/util/generator_tools.py +72 -0
- chia/util/hash.py +31 -0
- chia/util/initial-config.yaml +694 -0
- chia/util/inline_executor.py +26 -0
- chia/util/ints.py +19 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +37 -0
- chia/util/keychain.py +676 -0
- chia/util/keyring_wrapper.py +327 -0
- chia/util/limited_semaphore.py +41 -0
- chia/util/lock.py +49 -0
- chia/util/log_exceptions.py +32 -0
- chia/util/logging.py +36 -0
- chia/util/lru_cache.py +31 -0
- chia/util/math.py +20 -0
- chia/util/network.py +182 -0
- chia/util/paginator.py +48 -0
- chia/util/path.py +31 -0
- chia/util/permissions.py +20 -0
- chia/util/prev_transaction_block.py +21 -0
- chia/util/priority_mutex.py +95 -0
- chia/util/profiler.py +197 -0
- chia/util/recursive_replace.py +24 -0
- chia/util/safe_cancel_task.py +16 -0
- chia/util/service_groups.py +47 -0
- chia/util/setproctitle.py +22 -0
- chia/util/significant_bits.py +32 -0
- chia/util/ssl_check.py +213 -0
- chia/util/streamable.py +642 -0
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +382 -0
- chia/util/timing.py +67 -0
- chia/util/vdf_prover.py +30 -0
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +66 -0
- chia/wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/cat_constants.py +75 -0
- chia/wallet/cat_wallet/cat_info.py +47 -0
- chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
- chia/wallet/cat_wallet/cat_utils.py +164 -0
- chia/wallet/cat_wallet/cat_wallet.py +855 -0
- chia/wallet/cat_wallet/dao_cat_info.py +28 -0
- chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
- chia/wallet/cat_wallet/lineage_store.py +74 -0
- chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
- chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
- chia/wallet/coin_selection.py +188 -0
- chia/wallet/conditions.py +1512 -0
- chia/wallet/dao_wallet/__init__.py +0 -0
- chia/wallet/dao_wallet/dao_info.py +61 -0
- chia/wallet/dao_wallet/dao_utils.py +811 -0
- chia/wallet/dao_wallet/dao_wallet.py +2119 -0
- chia/wallet/db_wallet/__init__.py +0 -0
- chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
- chia/wallet/derivation_record.py +30 -0
- chia/wallet/derive_keys.py +146 -0
- chia/wallet/did_wallet/__init__.py +0 -0
- chia/wallet/did_wallet/did_info.py +39 -0
- chia/wallet/did_wallet/did_wallet.py +1494 -0
- chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
- chia/wallet/did_wallet/puzzles/__init__.py +0 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
- chia/wallet/driver_protocol.py +26 -0
- chia/wallet/key_val_store.py +55 -0
- chia/wallet/lineage_proof.py +58 -0
- chia/wallet/nft_wallet/__init__.py +0 -0
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
- chia/wallet/nft_wallet/nft_info.py +120 -0
- chia/wallet/nft_wallet/nft_puzzles.py +305 -0
- chia/wallet/nft_wallet/nft_wallet.py +1687 -0
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
- chia/wallet/nft_wallet/uncurry_nft.py +217 -0
- chia/wallet/notification_manager.py +117 -0
- chia/wallet/notification_store.py +178 -0
- chia/wallet/outer_puzzles.py +84 -0
- chia/wallet/payment.py +33 -0
- chia/wallet/puzzle_drivers.py +118 -0
- chia/wallet/puzzles/__init__.py +0 -0
- chia/wallet/puzzles/augmented_condition.clsp +13 -0
- chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
- chia/wallet/puzzles/clawback/__init__.py +0 -0
- chia/wallet/puzzles/clawback/drivers.py +188 -0
- chia/wallet/puzzles/clawback/metadata.py +38 -0
- chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
- chia/wallet/puzzles/condition_codes.clib +77 -0
- chia/wallet/puzzles/curry-and-treehash.clib +102 -0
- chia/wallet/puzzles/curry.clib +135 -0
- chia/wallet/puzzles/curry_by_index.clib +16 -0
- chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
- chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp +35 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_lockup.clsp +288 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal.clsp +377 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_treasury.clsp +115 -0
- chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
- chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
- chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
- chia/wallet/puzzles/json.clib +25 -0
- chia/wallet/puzzles/load_clvm.py +161 -0
- chia/wallet/puzzles/merkle_utils.clib +18 -0
- chia/wallet/puzzles/notification.clsp +7 -0
- chia/wallet/puzzles/notification.clsp.hex +1 -0
- chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
- chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.clsp +3 -0
- chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.py +26 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
- chia/wallet/puzzles/p2_parent.clsp +19 -0
- chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
- chia/wallet/puzzles/p2_singleton.clsp +30 -0
- chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/puzzle_utils.py +34 -0
- chia/wallet/puzzles/settlement_payments.clsp +49 -0
- chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
- chia/wallet/puzzles/sha256tree.clib +11 -0
- chia/wallet/puzzles/singleton_launcher.clsp +16 -0
- chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
- chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.py +296 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
- chia/wallet/puzzles/singleton_truths.clib +21 -0
- chia/wallet/puzzles/tails.py +348 -0
- chia/wallet/puzzles/utility_macros.clib +48 -0
- chia/wallet/signer_protocol.py +125 -0
- chia/wallet/singleton.py +106 -0
- chia/wallet/singleton_record.py +30 -0
- chia/wallet/trade_manager.py +1102 -0
- chia/wallet/trade_record.py +67 -0
- chia/wallet/trading/__init__.py +0 -0
- chia/wallet/trading/offer.py +702 -0
- chia/wallet/trading/trade_status.py +13 -0
- chia/wallet/trading/trade_store.py +526 -0
- chia/wallet/transaction_record.py +158 -0
- chia/wallet/transaction_sorting.py +14 -0
- chia/wallet/uncurried_puzzle.py +17 -0
- chia/wallet/util/__init__.py +0 -0
- chia/wallet/util/address_type.py +55 -0
- chia/wallet/util/blind_signer_tl.py +164 -0
- chia/wallet/util/clvm_streamable.py +203 -0
- chia/wallet/util/compute_hints.py +66 -0
- chia/wallet/util/compute_memos.py +43 -0
- chia/wallet/util/curry_and_treehash.py +91 -0
- chia/wallet/util/debug_spend_bundle.py +232 -0
- chia/wallet/util/merkle_tree.py +100 -0
- chia/wallet/util/merkle_utils.py +102 -0
- chia/wallet/util/new_peak_queue.py +82 -0
- chia/wallet/util/notifications.py +12 -0
- chia/wallet/util/peer_request_cache.py +174 -0
- chia/wallet/util/pprint.py +39 -0
- chia/wallet/util/puzzle_compression.py +95 -0
- chia/wallet/util/puzzle_decorator.py +100 -0
- chia/wallet/util/puzzle_decorator_type.py +7 -0
- chia/wallet/util/query_filter.py +59 -0
- chia/wallet/util/transaction_type.py +23 -0
- chia/wallet/util/tx_config.py +158 -0
- chia/wallet/util/wallet_sync_utils.py +351 -0
- chia/wallet/util/wallet_types.py +72 -0
- chia/wallet/vc_wallet/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
- chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
- chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
- chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_drivers.py +838 -0
- chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_store.py +263 -0
- chia/wallet/vc_wallet/vc_wallet.py +638 -0
- chia/wallet/wallet.py +698 -0
- chia/wallet/wallet_action_scope.py +96 -0
- chia/wallet/wallet_blockchain.py +244 -0
- chia/wallet/wallet_coin_record.py +72 -0
- chia/wallet/wallet_coin_store.py +351 -0
- chia/wallet/wallet_info.py +35 -0
- chia/wallet/wallet_interested_store.py +188 -0
- chia/wallet/wallet_nft_store.py +279 -0
- chia/wallet/wallet_node.py +1765 -0
- chia/wallet/wallet_node_api.py +207 -0
- chia/wallet/wallet_pool_store.py +119 -0
- chia/wallet/wallet_protocol.py +90 -0
- chia/wallet/wallet_puzzle_store.py +396 -0
- chia/wallet/wallet_retry_store.py +70 -0
- chia/wallet/wallet_singleton_store.py +259 -0
- chia/wallet/wallet_spend_bundle.py +25 -0
- chia/wallet/wallet_state_manager.py +2819 -0
- chia/wallet/wallet_transaction_store.py +496 -0
- chia/wallet/wallet_user_store.py +110 -0
- chia/wallet/wallet_weight_proof_handler.py +126 -0
- chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
- chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
- chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
- chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
- chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
- mozilla-ca/cacert.pem +3611 -0
|
@@ -0,0 +1,959 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
5
|
+
|
|
6
|
+
from chia.consensus.block_record import BlockRecord
|
|
7
|
+
from chia.consensus.blockchain import Blockchain, BlockchainMutexPriority
|
|
8
|
+
from chia.consensus.get_block_generator import get_block_generator
|
|
9
|
+
from chia.consensus.pos_quality import UI_ACTUAL_SPACE_CONSTANT_FACTOR
|
|
10
|
+
from chia.full_node.fee_estimator_interface import FeeEstimatorInterface
|
|
11
|
+
from chia.full_node.full_node import FullNode
|
|
12
|
+
from chia.full_node.mempool_check_conditions import (
|
|
13
|
+
get_puzzle_and_solution_for_coin,
|
|
14
|
+
get_spends_for_block,
|
|
15
|
+
get_spends_for_block_with_conditions,
|
|
16
|
+
)
|
|
17
|
+
from chia.rpc.rpc_server import Endpoint, EndpointResult
|
|
18
|
+
from chia.server.outbound_message import NodeType
|
|
19
|
+
from chia.types.blockchain_format.proof_of_space import calculate_prefix_bits
|
|
20
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
21
|
+
from chia.types.coin_record import CoinRecord
|
|
22
|
+
from chia.types.coin_spend import CoinSpend
|
|
23
|
+
from chia.types.full_block import FullBlock
|
|
24
|
+
from chia.types.generator_types import BlockGenerator
|
|
25
|
+
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
26
|
+
from chia.types.spend_bundle import SpendBundle
|
|
27
|
+
from chia.types.spend_bundle_conditions import SpendBundleConditions
|
|
28
|
+
from chia.types.unfinished_header_block import UnfinishedHeaderBlock
|
|
29
|
+
from chia.util.byte_types import hexstr_to_bytes
|
|
30
|
+
from chia.util.ints import uint32, uint64, uint128
|
|
31
|
+
from chia.util.log_exceptions import log_exceptions
|
|
32
|
+
from chia.util.math import make_monotonically_decreasing
|
|
33
|
+
from chia.util.ws_message import WsRpcMessage, create_payload_dict
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def coin_record_dict_backwards_compat(coin_record: dict[str, Any]) -> dict[str, bool]:
|
|
37
|
+
coin_record["spent"] = coin_record["spent_block_index"] > 0
|
|
38
|
+
return coin_record
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def get_nearest_transaction_block(blockchain: Blockchain, block: BlockRecord) -> BlockRecord:
|
|
42
|
+
if block.is_transaction_block:
|
|
43
|
+
return block
|
|
44
|
+
|
|
45
|
+
prev_hash = blockchain.height_to_hash(block.prev_transaction_block_height)
|
|
46
|
+
# Genesis block is a transaction block, so theoretically `prev_hash` of all blocks
|
|
47
|
+
# other than genesis block cannot be `None`.
|
|
48
|
+
assert prev_hash
|
|
49
|
+
|
|
50
|
+
tb = await blockchain.get_block_record_from_db(prev_hash)
|
|
51
|
+
assert tb
|
|
52
|
+
|
|
53
|
+
return tb
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
async def get_average_block_time(
|
|
57
|
+
blockchain: Blockchain,
|
|
58
|
+
base_block: BlockRecord,
|
|
59
|
+
height_distance: int,
|
|
60
|
+
) -> Optional[uint32]:
|
|
61
|
+
newer_block = await get_nearest_transaction_block(blockchain, base_block)
|
|
62
|
+
if newer_block.height < 1:
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
prev_height = uint32(max(1, newer_block.height - height_distance))
|
|
66
|
+
prev_hash = blockchain.height_to_hash(prev_height)
|
|
67
|
+
assert prev_hash
|
|
68
|
+
prev_block = await blockchain.get_block_record_from_db(prev_hash)
|
|
69
|
+
assert prev_block
|
|
70
|
+
|
|
71
|
+
older_block = await get_nearest_transaction_block(blockchain, prev_block)
|
|
72
|
+
|
|
73
|
+
assert newer_block.timestamp is not None and older_block.timestamp is not None
|
|
74
|
+
|
|
75
|
+
if newer_block.height == older_block.height: # small chain not long enough to have a block in between
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
average_block_time = uint32(
|
|
79
|
+
(newer_block.timestamp - older_block.timestamp) / (newer_block.height - older_block.height)
|
|
80
|
+
)
|
|
81
|
+
return average_block_time
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class FullNodeRpcApi:
|
|
85
|
+
if TYPE_CHECKING:
|
|
86
|
+
from chia.rpc.rpc_server import RpcApiProtocol
|
|
87
|
+
|
|
88
|
+
_protocol_check: ClassVar[RpcApiProtocol] = cast("FullNodeRpcApi", None)
|
|
89
|
+
|
|
90
|
+
def __init__(self, service: FullNode) -> None:
|
|
91
|
+
self.service = service
|
|
92
|
+
self.service_name = "chia_full_node"
|
|
93
|
+
self.cached_blockchain_state: Optional[dict[str, Any]] = None
|
|
94
|
+
|
|
95
|
+
def get_routes(self) -> dict[str, Endpoint]:
|
|
96
|
+
return {
|
|
97
|
+
# Blockchain
|
|
98
|
+
"/get_blockchain_state": self.get_blockchain_state,
|
|
99
|
+
"/get_block": self.get_block,
|
|
100
|
+
"/get_blocks": self.get_blocks,
|
|
101
|
+
"/get_block_count_metrics": self.get_block_count_metrics,
|
|
102
|
+
"/get_block_record_by_height": self.get_block_record_by_height,
|
|
103
|
+
"/get_block_record": self.get_block_record,
|
|
104
|
+
"/get_block_records": self.get_block_records,
|
|
105
|
+
"/get_block_spends": self.get_block_spends,
|
|
106
|
+
"/get_block_spends_with_conditions": self.get_block_spends_with_conditions,
|
|
107
|
+
"/get_unfinished_block_headers": self.get_unfinished_block_headers,
|
|
108
|
+
"/get_network_space": self.get_network_space,
|
|
109
|
+
"/get_additions_and_removals": self.get_additions_and_removals,
|
|
110
|
+
"/get_aggsig_additional_data": self.get_aggsig_additional_data,
|
|
111
|
+
"/get_recent_signage_point_or_eos": self.get_recent_signage_point_or_eos,
|
|
112
|
+
# Coins
|
|
113
|
+
"/get_coin_records_by_puzzle_hash": self.get_coin_records_by_puzzle_hash,
|
|
114
|
+
"/get_coin_records_by_puzzle_hashes": self.get_coin_records_by_puzzle_hashes,
|
|
115
|
+
"/get_coin_record_by_name": self.get_coin_record_by_name,
|
|
116
|
+
"/get_coin_records_by_names": self.get_coin_records_by_names,
|
|
117
|
+
"/get_coin_records_by_parent_ids": self.get_coin_records_by_parent_ids,
|
|
118
|
+
"/get_coin_records_by_hint": self.get_coin_records_by_hint,
|
|
119
|
+
"/push_tx": self.push_tx,
|
|
120
|
+
"/get_puzzle_and_solution": self.get_puzzle_and_solution,
|
|
121
|
+
# Mempool
|
|
122
|
+
"/get_all_mempool_tx_ids": self.get_all_mempool_tx_ids,
|
|
123
|
+
"/get_all_mempool_items": self.get_all_mempool_items,
|
|
124
|
+
"/get_mempool_item_by_tx_id": self.get_mempool_item_by_tx_id,
|
|
125
|
+
"/get_mempool_items_by_coin_name": self.get_mempool_items_by_coin_name,
|
|
126
|
+
# Fee estimation
|
|
127
|
+
"/get_fee_estimate": self.get_fee_estimate,
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> list[WsRpcMessage]:
|
|
131
|
+
if change_data is None:
|
|
132
|
+
change_data = {}
|
|
133
|
+
|
|
134
|
+
payloads = []
|
|
135
|
+
if change in {"new_peak", "sync_mode"}:
|
|
136
|
+
data = await self.get_blockchain_state({})
|
|
137
|
+
assert data is not None
|
|
138
|
+
payloads.append(
|
|
139
|
+
create_payload_dict(
|
|
140
|
+
"get_blockchain_state",
|
|
141
|
+
data,
|
|
142
|
+
self.service_name,
|
|
143
|
+
"wallet_ui",
|
|
144
|
+
)
|
|
145
|
+
)
|
|
146
|
+
payloads.append(
|
|
147
|
+
create_payload_dict(
|
|
148
|
+
"get_blockchain_state",
|
|
149
|
+
data,
|
|
150
|
+
self.service_name,
|
|
151
|
+
"metrics",
|
|
152
|
+
)
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
if change in {"block", "signage_point"}:
|
|
156
|
+
payloads.append(create_payload_dict(change, change_data, self.service_name, "metrics"))
|
|
157
|
+
|
|
158
|
+
if change == "unfinished_block":
|
|
159
|
+
payloads.append(create_payload_dict(change, change_data, self.service_name, "unfinished_block_info"))
|
|
160
|
+
|
|
161
|
+
return payloads
|
|
162
|
+
|
|
163
|
+
async def get_blockchain_state(self, _: dict[str, Any]) -> EndpointResult:
|
|
164
|
+
"""
|
|
165
|
+
Returns a summary of the node's view of the blockchain.
|
|
166
|
+
"""
|
|
167
|
+
node_id = self.service.server.node_id.hex()
|
|
168
|
+
if self.service.initialized is False:
|
|
169
|
+
res = {
|
|
170
|
+
"blockchain_state": {
|
|
171
|
+
"peak": None,
|
|
172
|
+
"genesis_challenge_initialized": self.service.initialized,
|
|
173
|
+
"sync": {
|
|
174
|
+
"sync_mode": False,
|
|
175
|
+
"synced": False,
|
|
176
|
+
"sync_tip_height": 0,
|
|
177
|
+
"sync_progress_height": 0,
|
|
178
|
+
},
|
|
179
|
+
"difficulty": 0,
|
|
180
|
+
"sub_slot_iters": 0,
|
|
181
|
+
"space": 0,
|
|
182
|
+
"average_block_time": None,
|
|
183
|
+
"mempool_size": 0,
|
|
184
|
+
"mempool_cost": 0,
|
|
185
|
+
"mempool_min_fees": {
|
|
186
|
+
"cost_5000000": 0,
|
|
187
|
+
},
|
|
188
|
+
"mempool_max_total_cost": 0,
|
|
189
|
+
"block_max_cost": 0,
|
|
190
|
+
"node_id": node_id,
|
|
191
|
+
},
|
|
192
|
+
}
|
|
193
|
+
return res
|
|
194
|
+
peak: Optional[BlockRecord] = self.service.blockchain.get_peak()
|
|
195
|
+
|
|
196
|
+
if peak is not None and peak.height > 0:
|
|
197
|
+
difficulty = uint64(peak.weight - self.service.blockchain.block_record(peak.prev_hash).weight)
|
|
198
|
+
sub_slot_iters = peak.sub_slot_iters
|
|
199
|
+
else:
|
|
200
|
+
difficulty = self.service.constants.DIFFICULTY_STARTING
|
|
201
|
+
sub_slot_iters = self.service.constants.SUB_SLOT_ITERS_STARTING
|
|
202
|
+
|
|
203
|
+
sync_mode: bool = self.service.sync_store.get_sync_mode() or self.service.sync_store.get_long_sync()
|
|
204
|
+
|
|
205
|
+
sync_tip_height: Optional[uint32] = uint32(0)
|
|
206
|
+
if sync_mode:
|
|
207
|
+
target_peak = self.service.sync_store.target_peak
|
|
208
|
+
if target_peak is not None:
|
|
209
|
+
sync_tip_height = target_peak.height
|
|
210
|
+
if peak is not None:
|
|
211
|
+
sync_progress_height: uint32 = peak.height
|
|
212
|
+
# Don't display we're syncing towards 0, instead show 'Syncing height/height'
|
|
213
|
+
# until sync_store retrieves the correct number.
|
|
214
|
+
if sync_tip_height == uint32(0):
|
|
215
|
+
sync_tip_height = peak.height
|
|
216
|
+
else:
|
|
217
|
+
sync_progress_height = uint32(0)
|
|
218
|
+
else:
|
|
219
|
+
sync_progress_height = uint32(0)
|
|
220
|
+
|
|
221
|
+
average_block_time: Optional[uint32] = None
|
|
222
|
+
if peak is not None and peak.height > 1:
|
|
223
|
+
newer_block_hex = peak.header_hash.hex()
|
|
224
|
+
# Average over the last day
|
|
225
|
+
header_hash = self.service.blockchain.height_to_hash(uint32(max(1, peak.height - 4608)))
|
|
226
|
+
assert header_hash is not None
|
|
227
|
+
older_block_hex = header_hash.hex()
|
|
228
|
+
space = await self.get_network_space(
|
|
229
|
+
{"newer_block_header_hash": newer_block_hex, "older_block_header_hash": older_block_hex}
|
|
230
|
+
)
|
|
231
|
+
average_block_time = await get_average_block_time(self.service.blockchain, peak, 4608)
|
|
232
|
+
else:
|
|
233
|
+
space = {"space": uint128(0)}
|
|
234
|
+
|
|
235
|
+
if self.service.mempool_manager is not None:
|
|
236
|
+
mempool_size = self.service.mempool_manager.mempool.size()
|
|
237
|
+
mempool_cost = self.service.mempool_manager.mempool.total_mempool_cost()
|
|
238
|
+
mempool_fees = self.service.mempool_manager.mempool.total_mempool_fees()
|
|
239
|
+
mempool_min_fee_5m = self.service.mempool_manager.mempool.get_min_fee_rate(5000000)
|
|
240
|
+
mempool_max_total_cost = self.service.mempool_manager.mempool_max_total_cost
|
|
241
|
+
else:
|
|
242
|
+
mempool_size = 0
|
|
243
|
+
mempool_cost = 0
|
|
244
|
+
mempool_fees = 0
|
|
245
|
+
mempool_min_fee_5m = 0
|
|
246
|
+
mempool_max_total_cost = 0
|
|
247
|
+
if self.service.server is not None:
|
|
248
|
+
is_connected = len(self.service.server.get_connections(NodeType.FULL_NODE)) > 0 or "simulator" in str(
|
|
249
|
+
self.service.config.get("selected_network")
|
|
250
|
+
)
|
|
251
|
+
else:
|
|
252
|
+
is_connected = False
|
|
253
|
+
synced = await self.service.synced() and is_connected
|
|
254
|
+
|
|
255
|
+
assert space is not None
|
|
256
|
+
response = {
|
|
257
|
+
"blockchain_state": {
|
|
258
|
+
"peak": peak,
|
|
259
|
+
"genesis_challenge_initialized": self.service.initialized,
|
|
260
|
+
"sync": {
|
|
261
|
+
"sync_mode": sync_mode,
|
|
262
|
+
"synced": synced,
|
|
263
|
+
"sync_tip_height": sync_tip_height,
|
|
264
|
+
"sync_progress_height": sync_progress_height,
|
|
265
|
+
},
|
|
266
|
+
"difficulty": difficulty,
|
|
267
|
+
"sub_slot_iters": sub_slot_iters,
|
|
268
|
+
"space": space["space"],
|
|
269
|
+
"average_block_time": average_block_time,
|
|
270
|
+
"mempool_size": mempool_size,
|
|
271
|
+
"mempool_cost": mempool_cost,
|
|
272
|
+
"mempool_fees": mempool_fees,
|
|
273
|
+
"mempool_min_fees": {
|
|
274
|
+
# We may give estimates for varying costs in the future
|
|
275
|
+
# This Dict sets us up for that in the future
|
|
276
|
+
"cost_5000000": mempool_min_fee_5m,
|
|
277
|
+
},
|
|
278
|
+
"mempool_max_total_cost": mempool_max_total_cost,
|
|
279
|
+
"block_max_cost": self.service.constants.MAX_BLOCK_COST_CLVM,
|
|
280
|
+
"node_id": node_id,
|
|
281
|
+
},
|
|
282
|
+
}
|
|
283
|
+
self.cached_blockchain_state = dict(response["blockchain_state"])
|
|
284
|
+
return response
|
|
285
|
+
|
|
286
|
+
async def get_recent_signage_point_or_eos(self, request: dict[str, Any]) -> EndpointResult:
|
|
287
|
+
if "sp_hash" not in request:
|
|
288
|
+
challenge_hash: bytes32 = bytes32.from_hexstr(request["challenge_hash"])
|
|
289
|
+
# This is the case of getting an end of slot
|
|
290
|
+
eos_tuple = self.service.full_node_store.recent_eos.get(challenge_hash)
|
|
291
|
+
if not eos_tuple:
|
|
292
|
+
raise ValueError(f"Did not find eos {challenge_hash.hex()} in cache")
|
|
293
|
+
eos, time_received = eos_tuple
|
|
294
|
+
|
|
295
|
+
# If it's still in the full node store, it's not reverted
|
|
296
|
+
if self.service.full_node_store.get_sub_slot(eos.challenge_chain.get_hash()):
|
|
297
|
+
return {"eos": eos, "time_received": time_received, "reverted": False}
|
|
298
|
+
|
|
299
|
+
# Otherwise we can backtrack from peak to find it in the blockchain
|
|
300
|
+
curr: Optional[BlockRecord] = self.service.blockchain.get_peak()
|
|
301
|
+
if curr is None:
|
|
302
|
+
raise ValueError("No blocks in the chain")
|
|
303
|
+
|
|
304
|
+
number_of_slots_searched = 0
|
|
305
|
+
while number_of_slots_searched < 10:
|
|
306
|
+
if curr.first_in_sub_slot:
|
|
307
|
+
assert curr.finished_challenge_slot_hashes is not None
|
|
308
|
+
if curr.finished_challenge_slot_hashes[-1] == eos.challenge_chain.get_hash():
|
|
309
|
+
# Found this slot in the blockchain
|
|
310
|
+
return {"eos": eos, "time_received": time_received, "reverted": False}
|
|
311
|
+
number_of_slots_searched += len(curr.finished_challenge_slot_hashes)
|
|
312
|
+
curr = self.service.blockchain.try_block_record(curr.prev_hash)
|
|
313
|
+
if curr is None:
|
|
314
|
+
# Got to the beginning of the blockchain without finding the slot
|
|
315
|
+
return {"eos": eos, "time_received": time_received, "reverted": True}
|
|
316
|
+
|
|
317
|
+
# Backtracked through 10 slots but still did not find it
|
|
318
|
+
return {"eos": eos, "time_received": time_received, "reverted": True}
|
|
319
|
+
|
|
320
|
+
# Now we handle the case of getting a signage point
|
|
321
|
+
sp_hash: bytes32 = bytes32.from_hexstr(request["sp_hash"])
|
|
322
|
+
sp_tuple = self.service.full_node_store.recent_signage_points.get(sp_hash)
|
|
323
|
+
if sp_tuple is None:
|
|
324
|
+
raise ValueError(f"Did not find sp {sp_hash.hex()} in cache")
|
|
325
|
+
|
|
326
|
+
sp, time_received = sp_tuple
|
|
327
|
+
assert sp.rc_vdf is not None, "Not an EOS, the signage point rewards chain VDF must not be None"
|
|
328
|
+
assert sp.cc_vdf is not None, "Not an EOS, the signage point challenge chain VDF must not be None"
|
|
329
|
+
|
|
330
|
+
# If it's still in the full node store, it's not reverted
|
|
331
|
+
if self.service.full_node_store.get_signage_point(sp_hash):
|
|
332
|
+
return {"signage_point": sp, "time_received": time_received, "reverted": False}
|
|
333
|
+
|
|
334
|
+
# Otherwise we can backtrack from peak to find it in the blockchain
|
|
335
|
+
rc_challenge: bytes32 = sp.rc_vdf.challenge
|
|
336
|
+
next_b: Optional[BlockRecord] = None
|
|
337
|
+
curr_b_optional: Optional[BlockRecord] = self.service.blockchain.get_peak()
|
|
338
|
+
assert curr_b_optional is not None
|
|
339
|
+
curr_b: BlockRecord = curr_b_optional
|
|
340
|
+
|
|
341
|
+
for _ in range(200):
|
|
342
|
+
sp_total_iters = sp.cc_vdf.number_of_iterations + curr_b.ip_sub_slot_total_iters(self.service.constants)
|
|
343
|
+
if curr_b.reward_infusion_new_challenge == rc_challenge:
|
|
344
|
+
if next_b is None:
|
|
345
|
+
return {"signage_point": sp, "time_received": time_received, "reverted": False}
|
|
346
|
+
next_b_total_iters = next_b.ip_sub_slot_total_iters(self.service.constants) + next_b.ip_iters(
|
|
347
|
+
self.service.constants
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
return {
|
|
351
|
+
"signage_point": sp,
|
|
352
|
+
"time_received": time_received,
|
|
353
|
+
"reverted": sp_total_iters > next_b_total_iters,
|
|
354
|
+
}
|
|
355
|
+
if curr_b.finished_reward_slot_hashes is not None:
|
|
356
|
+
assert curr_b.finished_challenge_slot_hashes is not None
|
|
357
|
+
for eos_rc in curr_b.finished_challenge_slot_hashes:
|
|
358
|
+
if eos_rc == rc_challenge:
|
|
359
|
+
if next_b is None:
|
|
360
|
+
return {"signage_point": sp, "time_received": time_received, "reverted": False}
|
|
361
|
+
next_b_total_iters = next_b.ip_sub_slot_total_iters(self.service.constants) + next_b.ip_iters(
|
|
362
|
+
self.service.constants
|
|
363
|
+
)
|
|
364
|
+
return {
|
|
365
|
+
"signage_point": sp,
|
|
366
|
+
"time_received": time_received,
|
|
367
|
+
"reverted": sp_total_iters > next_b_total_iters,
|
|
368
|
+
}
|
|
369
|
+
next_b = curr_b
|
|
370
|
+
curr_b_optional = self.service.blockchain.try_block_record(curr_b.prev_hash)
|
|
371
|
+
if curr_b_optional is None:
|
|
372
|
+
break
|
|
373
|
+
curr_b = curr_b_optional
|
|
374
|
+
|
|
375
|
+
return {"signage_point": sp, "time_received": time_received, "reverted": True}
|
|
376
|
+
|
|
377
|
+
async def get_block(self, request: dict[str, Any]) -> EndpointResult:
|
|
378
|
+
if "header_hash" not in request:
|
|
379
|
+
raise ValueError("No header_hash in request")
|
|
380
|
+
header_hash = bytes32.from_hexstr(request["header_hash"])
|
|
381
|
+
|
|
382
|
+
block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
|
|
383
|
+
if block is None:
|
|
384
|
+
raise ValueError(f"Block {header_hash.hex()} not found")
|
|
385
|
+
|
|
386
|
+
return {"block": block}
|
|
387
|
+
|
|
388
|
+
async def get_blocks(self, request: dict[str, Any]) -> EndpointResult:
|
|
389
|
+
if "start" not in request:
|
|
390
|
+
raise ValueError("No start in request")
|
|
391
|
+
if "end" not in request:
|
|
392
|
+
raise ValueError("No end in request")
|
|
393
|
+
exclude_hh = False
|
|
394
|
+
if "exclude_header_hash" in request:
|
|
395
|
+
exclude_hh = request["exclude_header_hash"]
|
|
396
|
+
exclude_reorged = False
|
|
397
|
+
if "exclude_reorged" in request:
|
|
398
|
+
exclude_reorged = request["exclude_reorged"]
|
|
399
|
+
|
|
400
|
+
start = int(request["start"])
|
|
401
|
+
end = int(request["end"])
|
|
402
|
+
block_range = []
|
|
403
|
+
for a in range(start, end):
|
|
404
|
+
block_range.append(uint32(a))
|
|
405
|
+
blocks: list[FullBlock] = await self.service.block_store.get_full_blocks_at(block_range)
|
|
406
|
+
json_blocks = []
|
|
407
|
+
for block in blocks:
|
|
408
|
+
hh: bytes32 = block.header_hash
|
|
409
|
+
if exclude_reorged and self.service.blockchain.height_to_hash(block.height) != hh:
|
|
410
|
+
# Don't include forked (reorged) blocks
|
|
411
|
+
continue
|
|
412
|
+
json = block.to_json_dict()
|
|
413
|
+
if not exclude_hh:
|
|
414
|
+
json["header_hash"] = hh.hex()
|
|
415
|
+
json_blocks.append(json)
|
|
416
|
+
return {"blocks": json_blocks}
|
|
417
|
+
|
|
418
|
+
async def get_block_count_metrics(self, _: dict[str, Any]) -> EndpointResult:
|
|
419
|
+
compact_blocks = 0
|
|
420
|
+
uncompact_blocks = 0
|
|
421
|
+
with log_exceptions(self.service.log, consume=True):
|
|
422
|
+
compact_blocks = await self.service.block_store.count_compactified_blocks()
|
|
423
|
+
uncompact_blocks = await self.service.block_store.count_uncompactified_blocks()
|
|
424
|
+
|
|
425
|
+
hint_count = 0
|
|
426
|
+
if self.service.hint_store is not None:
|
|
427
|
+
with log_exceptions(self.service.log, consume=True):
|
|
428
|
+
hint_count = await self.service.hint_store.count_hints()
|
|
429
|
+
|
|
430
|
+
return {
|
|
431
|
+
"metrics": {
|
|
432
|
+
"compact_blocks": compact_blocks,
|
|
433
|
+
"uncompact_blocks": uncompact_blocks,
|
|
434
|
+
"hint_count": hint_count,
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
async def get_block_records(self, request: dict[str, Any]) -> EndpointResult:
|
|
439
|
+
if "start" not in request:
|
|
440
|
+
raise ValueError("No start in request")
|
|
441
|
+
if "end" not in request:
|
|
442
|
+
raise ValueError("No end in request")
|
|
443
|
+
|
|
444
|
+
start = int(request["start"])
|
|
445
|
+
end = int(request["end"])
|
|
446
|
+
records = []
|
|
447
|
+
peak_height = self.service.blockchain.get_peak_height()
|
|
448
|
+
if peak_height is None:
|
|
449
|
+
raise ValueError("Peak is None")
|
|
450
|
+
|
|
451
|
+
for a in range(start, end):
|
|
452
|
+
if peak_height < uint32(a):
|
|
453
|
+
self.service.log.warning("requested block is higher than known peak ")
|
|
454
|
+
break
|
|
455
|
+
header_hash: Optional[bytes32] = self.service.blockchain.height_to_hash(uint32(a))
|
|
456
|
+
if header_hash is None:
|
|
457
|
+
raise ValueError(f"Height not in blockchain: {a}")
|
|
458
|
+
record: Optional[BlockRecord] = self.service.blockchain.try_block_record(header_hash)
|
|
459
|
+
if record is None:
|
|
460
|
+
# Fetch from DB
|
|
461
|
+
record = await self.service.blockchain.block_store.get_block_record(header_hash)
|
|
462
|
+
if record is None:
|
|
463
|
+
raise ValueError(f"Block {header_hash.hex()} does not exist")
|
|
464
|
+
|
|
465
|
+
records.append(record)
|
|
466
|
+
return {"block_records": records}
|
|
467
|
+
|
|
468
|
+
async def get_block_spends(self, request: dict[str, Any]) -> EndpointResult:
|
|
469
|
+
if "header_hash" not in request:
|
|
470
|
+
raise ValueError("No header_hash in request")
|
|
471
|
+
header_hash = bytes32.from_hexstr(request["header_hash"])
|
|
472
|
+
full_block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
|
|
473
|
+
if full_block is None:
|
|
474
|
+
raise ValueError(f"Block {header_hash.hex()} not found")
|
|
475
|
+
|
|
476
|
+
spends: list[CoinSpend] = []
|
|
477
|
+
block_generator = await get_block_generator(self.service.blockchain.lookup_block_generators, full_block)
|
|
478
|
+
if block_generator is None: # if block is not a transaction block.
|
|
479
|
+
return {"block_spends": spends}
|
|
480
|
+
|
|
481
|
+
spends = get_spends_for_block(block_generator, full_block.height, self.service.constants)
|
|
482
|
+
|
|
483
|
+
return {"block_spends": spends}
|
|
484
|
+
|
|
485
|
+
async def get_block_spends_with_conditions(self, request: dict[str, Any]) -> EndpointResult:
|
|
486
|
+
if "header_hash" not in request:
|
|
487
|
+
raise ValueError("No header_hash in request")
|
|
488
|
+
header_hash = bytes32.from_hexstr(request["header_hash"])
|
|
489
|
+
full_block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
|
|
490
|
+
if full_block is None:
|
|
491
|
+
raise ValueError(f"Block {header_hash.hex()} not found")
|
|
492
|
+
|
|
493
|
+
block_generator = await get_block_generator(self.service.blockchain.lookup_block_generators, full_block)
|
|
494
|
+
if block_generator is None: # if block is not a transaction block.
|
|
495
|
+
return {"block_spends_with_conditions": []}
|
|
496
|
+
|
|
497
|
+
spends_with_conditions = get_spends_for_block_with_conditions(
|
|
498
|
+
block_generator, full_block.height, self.service.constants
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
return {
|
|
502
|
+
"block_spends_with_conditions": [
|
|
503
|
+
{
|
|
504
|
+
"coin_spend": spend_with_conditions.coin_spend,
|
|
505
|
+
"conditions": [
|
|
506
|
+
{"opcode": condition.opcode, "vars": [var.hex() for var in condition.vars]}
|
|
507
|
+
for condition in spend_with_conditions.conditions
|
|
508
|
+
],
|
|
509
|
+
}
|
|
510
|
+
for spend_with_conditions in spends_with_conditions
|
|
511
|
+
]
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
async def get_block_record_by_height(self, request: dict[str, Any]) -> EndpointResult:
|
|
515
|
+
if "height" not in request:
|
|
516
|
+
raise ValueError("No height in request")
|
|
517
|
+
height = request["height"]
|
|
518
|
+
header_height = uint32(int(height))
|
|
519
|
+
peak_height = self.service.blockchain.get_peak_height()
|
|
520
|
+
if peak_height is None or header_height > peak_height:
|
|
521
|
+
raise ValueError(f"Block height {height} not found in chain")
|
|
522
|
+
header_hash: Optional[bytes32] = self.service.blockchain.height_to_hash(header_height)
|
|
523
|
+
if header_hash is None:
|
|
524
|
+
raise ValueError(f"Block hash {height} not found in chain")
|
|
525
|
+
record: Optional[BlockRecord] = self.service.blockchain.try_block_record(header_hash)
|
|
526
|
+
if record is None:
|
|
527
|
+
# Fetch from DB
|
|
528
|
+
record = await self.service.blockchain.block_store.get_block_record(header_hash)
|
|
529
|
+
if record is None:
|
|
530
|
+
raise ValueError(f"Block {header_hash} does not exist")
|
|
531
|
+
return {"block_record": record}
|
|
532
|
+
|
|
533
|
+
async def get_block_record(self, request: dict[str, Any]) -> EndpointResult:
|
|
534
|
+
if "header_hash" not in request:
|
|
535
|
+
raise ValueError("header_hash not in request")
|
|
536
|
+
header_hash_str = request["header_hash"]
|
|
537
|
+
header_hash = bytes32.from_hexstr(header_hash_str)
|
|
538
|
+
record: Optional[BlockRecord] = self.service.blockchain.try_block_record(header_hash)
|
|
539
|
+
if record is None:
|
|
540
|
+
# Fetch from DB
|
|
541
|
+
record = await self.service.blockchain.block_store.get_block_record(header_hash)
|
|
542
|
+
if record is None:
|
|
543
|
+
raise ValueError(f"Block {header_hash.hex()} does not exist")
|
|
544
|
+
|
|
545
|
+
return {"block_record": record}
|
|
546
|
+
|
|
547
|
+
async def get_unfinished_block_headers(self, _request: dict[str, Any]) -> EndpointResult:
|
|
548
|
+
peak: Optional[BlockRecord] = self.service.blockchain.get_peak()
|
|
549
|
+
if peak is None:
|
|
550
|
+
return {"headers": []}
|
|
551
|
+
|
|
552
|
+
response_headers: list[UnfinishedHeaderBlock] = []
|
|
553
|
+
for block in self.service.full_node_store.get_unfinished_blocks(peak.height):
|
|
554
|
+
unfinished_header_block = UnfinishedHeaderBlock(
|
|
555
|
+
block.finished_sub_slots,
|
|
556
|
+
block.reward_chain_block,
|
|
557
|
+
block.challenge_chain_sp_proof,
|
|
558
|
+
block.reward_chain_sp_proof,
|
|
559
|
+
block.foliage,
|
|
560
|
+
block.foliage_transaction_block,
|
|
561
|
+
b"",
|
|
562
|
+
)
|
|
563
|
+
response_headers.append(unfinished_header_block)
|
|
564
|
+
return {"headers": response_headers}
|
|
565
|
+
|
|
566
|
+
async def get_network_space(self, request: dict[str, Any]) -> EndpointResult:
|
|
567
|
+
"""
|
|
568
|
+
Retrieves an estimate of total space validating the chain
|
|
569
|
+
between two block header hashes.
|
|
570
|
+
"""
|
|
571
|
+
if "newer_block_header_hash" not in request or "older_block_header_hash" not in request:
|
|
572
|
+
raise ValueError("Invalid request. newer_block_header_hash and older_block_header_hash required")
|
|
573
|
+
newer_block_hex = request["newer_block_header_hash"]
|
|
574
|
+
older_block_hex = request["older_block_header_hash"]
|
|
575
|
+
|
|
576
|
+
if newer_block_hex == older_block_hex:
|
|
577
|
+
raise ValueError("New and old must not be the same")
|
|
578
|
+
|
|
579
|
+
newer_block_bytes = bytes32.from_hexstr(newer_block_hex)
|
|
580
|
+
older_block_bytes = bytes32.from_hexstr(older_block_hex)
|
|
581
|
+
|
|
582
|
+
newer_block = await self.service.block_store.get_block_record(newer_block_bytes)
|
|
583
|
+
if newer_block is None:
|
|
584
|
+
# It's possible that the peak block has not yet been committed to the DB, so as a fallback, check memory
|
|
585
|
+
try:
|
|
586
|
+
newer_block = self.service.blockchain.block_record(newer_block_bytes)
|
|
587
|
+
except KeyError:
|
|
588
|
+
raise ValueError(f"Newer block {newer_block_hex} not found")
|
|
589
|
+
older_block = await self.service.block_store.get_block_record(older_block_bytes)
|
|
590
|
+
if older_block is None:
|
|
591
|
+
raise ValueError(f"Older block {older_block_hex} not found")
|
|
592
|
+
delta_weight = newer_block.weight - older_block.weight
|
|
593
|
+
|
|
594
|
+
plot_filter_size = calculate_prefix_bits(self.service.constants, newer_block.height)
|
|
595
|
+
delta_iters = newer_block.total_iters - older_block.total_iters
|
|
596
|
+
weight_div_iters = delta_weight / delta_iters
|
|
597
|
+
additional_difficulty_constant = self.service.constants.DIFFICULTY_CONSTANT_FACTOR
|
|
598
|
+
eligible_plots_filter_multiplier = 2**plot_filter_size
|
|
599
|
+
network_space_bytes_estimate = (
|
|
600
|
+
UI_ACTUAL_SPACE_CONSTANT_FACTOR
|
|
601
|
+
* weight_div_iters
|
|
602
|
+
* additional_difficulty_constant
|
|
603
|
+
* eligible_plots_filter_multiplier
|
|
604
|
+
)
|
|
605
|
+
return {"space": uint128(int(network_space_bytes_estimate))}
|
|
606
|
+
|
|
607
|
+
async def get_coin_records_by_puzzle_hash(self, request: dict[str, Any]) -> EndpointResult:
|
|
608
|
+
"""
|
|
609
|
+
Retrieves the coins for a given puzzlehash, by default returns unspent coins.
|
|
610
|
+
"""
|
|
611
|
+
if "puzzle_hash" not in request:
|
|
612
|
+
raise ValueError("Puzzle hash not in request")
|
|
613
|
+
kwargs: dict[str, Any] = {"include_spent_coins": False, "puzzle_hash": hexstr_to_bytes(request["puzzle_hash"])}
|
|
614
|
+
if "start_height" in request:
|
|
615
|
+
kwargs["start_height"] = uint32(request["start_height"])
|
|
616
|
+
if "end_height" in request:
|
|
617
|
+
kwargs["end_height"] = uint32(request["end_height"])
|
|
618
|
+
|
|
619
|
+
if "include_spent_coins" in request:
|
|
620
|
+
kwargs["include_spent_coins"] = request["include_spent_coins"]
|
|
621
|
+
|
|
622
|
+
coin_records = await self.service.blockchain.coin_store.get_coin_records_by_puzzle_hash(**kwargs)
|
|
623
|
+
|
|
624
|
+
return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
|
|
625
|
+
|
|
626
|
+
async def get_coin_records_by_puzzle_hashes(self, request: dict[str, Any]) -> EndpointResult:
|
|
627
|
+
"""
|
|
628
|
+
Retrieves the coins for a given puzzlehash, by default returns unspent coins.
|
|
629
|
+
"""
|
|
630
|
+
if "puzzle_hashes" not in request:
|
|
631
|
+
raise ValueError("Puzzle hashes not in request")
|
|
632
|
+
kwargs: dict[str, Any] = {
|
|
633
|
+
"include_spent_coins": False,
|
|
634
|
+
"puzzle_hashes": [hexstr_to_bytes(ph) for ph in request["puzzle_hashes"]],
|
|
635
|
+
}
|
|
636
|
+
if "start_height" in request:
|
|
637
|
+
kwargs["start_height"] = uint32(request["start_height"])
|
|
638
|
+
if "end_height" in request:
|
|
639
|
+
kwargs["end_height"] = uint32(request["end_height"])
|
|
640
|
+
|
|
641
|
+
if "include_spent_coins" in request:
|
|
642
|
+
kwargs["include_spent_coins"] = request["include_spent_coins"]
|
|
643
|
+
|
|
644
|
+
coin_records = await self.service.blockchain.coin_store.get_coin_records_by_puzzle_hashes(**kwargs)
|
|
645
|
+
|
|
646
|
+
return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
|
|
647
|
+
|
|
648
|
+
async def get_coin_record_by_name(self, request: dict[str, Any]) -> EndpointResult:
|
|
649
|
+
"""
|
|
650
|
+
Retrieves a coin record by its name.
|
|
651
|
+
"""
|
|
652
|
+
if "name" not in request:
|
|
653
|
+
raise ValueError("Name not in request")
|
|
654
|
+
name = bytes32.from_hexstr(request["name"])
|
|
655
|
+
|
|
656
|
+
coin_record: Optional[CoinRecord] = await self.service.blockchain.coin_store.get_coin_record(name)
|
|
657
|
+
if coin_record is None:
|
|
658
|
+
raise ValueError(f"Coin record 0x{name.hex()} not found")
|
|
659
|
+
|
|
660
|
+
return {"coin_record": coin_record_dict_backwards_compat(coin_record.to_json_dict())}
|
|
661
|
+
|
|
662
|
+
async def get_coin_records_by_names(self, request: dict[str, Any]) -> EndpointResult:
|
|
663
|
+
"""
|
|
664
|
+
Retrieves the coins for given coin IDs, by default returns unspent coins.
|
|
665
|
+
"""
|
|
666
|
+
if "names" not in request:
|
|
667
|
+
raise ValueError("Names not in request")
|
|
668
|
+
kwargs: dict[str, Any] = {
|
|
669
|
+
"include_spent_coins": False,
|
|
670
|
+
"names": [hexstr_to_bytes(name) for name in request["names"]],
|
|
671
|
+
}
|
|
672
|
+
if "start_height" in request:
|
|
673
|
+
kwargs["start_height"] = uint32(request["start_height"])
|
|
674
|
+
if "end_height" in request:
|
|
675
|
+
kwargs["end_height"] = uint32(request["end_height"])
|
|
676
|
+
|
|
677
|
+
if "include_spent_coins" in request:
|
|
678
|
+
kwargs["include_spent_coins"] = request["include_spent_coins"]
|
|
679
|
+
|
|
680
|
+
coin_records = await self.service.blockchain.coin_store.get_coin_records_by_names(**kwargs)
|
|
681
|
+
|
|
682
|
+
return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
|
|
683
|
+
|
|
684
|
+
async def get_coin_records_by_parent_ids(self, request: dict[str, Any]) -> EndpointResult:
|
|
685
|
+
"""
|
|
686
|
+
Retrieves the coins for given parent coin IDs, by default returns unspent coins.
|
|
687
|
+
"""
|
|
688
|
+
if "parent_ids" not in request:
|
|
689
|
+
raise ValueError("Parent IDs not in request")
|
|
690
|
+
kwargs: dict[str, Any] = {
|
|
691
|
+
"include_spent_coins": False,
|
|
692
|
+
"parent_ids": [hexstr_to_bytes(ph) for ph in request["parent_ids"]],
|
|
693
|
+
}
|
|
694
|
+
if "start_height" in request:
|
|
695
|
+
kwargs["start_height"] = uint32(request["start_height"])
|
|
696
|
+
if "end_height" in request:
|
|
697
|
+
kwargs["end_height"] = uint32(request["end_height"])
|
|
698
|
+
|
|
699
|
+
if "include_spent_coins" in request:
|
|
700
|
+
kwargs["include_spent_coins"] = request["include_spent_coins"]
|
|
701
|
+
|
|
702
|
+
coin_records = await self.service.blockchain.coin_store.get_coin_records_by_parent_ids(**kwargs)
|
|
703
|
+
|
|
704
|
+
return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
|
|
705
|
+
|
|
706
|
+
async def get_coin_records_by_hint(self, request: dict[str, Any]) -> EndpointResult:
|
|
707
|
+
"""
|
|
708
|
+
Retrieves coins by hint, by default returns unspent coins.
|
|
709
|
+
"""
|
|
710
|
+
if "hint" not in request:
|
|
711
|
+
raise ValueError("Hint not in request")
|
|
712
|
+
|
|
713
|
+
if self.service.hint_store is None:
|
|
714
|
+
return {"coin_records": []}
|
|
715
|
+
|
|
716
|
+
names: list[bytes32] = await self.service.hint_store.get_coin_ids(bytes32.from_hexstr(request["hint"]))
|
|
717
|
+
|
|
718
|
+
kwargs: dict[str, Any] = {
|
|
719
|
+
"include_spent_coins": False,
|
|
720
|
+
"names": names,
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
if "start_height" in request:
|
|
724
|
+
kwargs["start_height"] = uint32(request["start_height"])
|
|
725
|
+
if "end_height" in request:
|
|
726
|
+
kwargs["end_height"] = uint32(request["end_height"])
|
|
727
|
+
|
|
728
|
+
if "include_spent_coins" in request:
|
|
729
|
+
kwargs["include_spent_coins"] = request["include_spent_coins"]
|
|
730
|
+
|
|
731
|
+
coin_records = await self.service.blockchain.coin_store.get_coin_records_by_names(**kwargs)
|
|
732
|
+
|
|
733
|
+
return {"coin_records": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in coin_records]}
|
|
734
|
+
|
|
735
|
+
async def push_tx(self, request: dict[str, Any]) -> EndpointResult:
|
|
736
|
+
if "spend_bundle" not in request:
|
|
737
|
+
raise ValueError("Spend bundle not in request")
|
|
738
|
+
|
|
739
|
+
spend_bundle: SpendBundle = SpendBundle.from_json_dict(request["spend_bundle"])
|
|
740
|
+
spend_name = spend_bundle.name()
|
|
741
|
+
|
|
742
|
+
if self.service.mempool_manager.get_spendbundle(spend_name) is not None:
|
|
743
|
+
status = MempoolInclusionStatus.SUCCESS
|
|
744
|
+
error = None
|
|
745
|
+
else:
|
|
746
|
+
status, error = await self.service.add_transaction(spend_bundle, spend_name)
|
|
747
|
+
if status != MempoolInclusionStatus.SUCCESS:
|
|
748
|
+
if self.service.mempool_manager.get_spendbundle(spend_name) is not None:
|
|
749
|
+
# Already in mempool
|
|
750
|
+
status = MempoolInclusionStatus.SUCCESS
|
|
751
|
+
error = None
|
|
752
|
+
|
|
753
|
+
if status == MempoolInclusionStatus.FAILED:
|
|
754
|
+
assert error is not None
|
|
755
|
+
raise ValueError(f"Failed to include transaction {spend_name}, error {error.name}")
|
|
756
|
+
return {
|
|
757
|
+
"status": status.name,
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
async def get_puzzle_and_solution(self, request: dict[str, Any]) -> EndpointResult:
|
|
761
|
+
coin_name: bytes32 = bytes32.from_hexstr(request["coin_id"])
|
|
762
|
+
height = request["height"]
|
|
763
|
+
coin_record = await self.service.coin_store.get_coin_record(coin_name)
|
|
764
|
+
if coin_record is None or not coin_record.spent or coin_record.spent_block_index != height:
|
|
765
|
+
raise ValueError(f"Invalid height {height}. coin record {coin_record}")
|
|
766
|
+
|
|
767
|
+
header_hash = self.service.blockchain.height_to_hash(height)
|
|
768
|
+
assert header_hash is not None
|
|
769
|
+
block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
|
|
770
|
+
|
|
771
|
+
if block is None or block.transactions_generator is None:
|
|
772
|
+
raise ValueError("Invalid block or block generator")
|
|
773
|
+
|
|
774
|
+
block_generator: Optional[BlockGenerator] = await get_block_generator(
|
|
775
|
+
self.service.blockchain.lookup_block_generators, block
|
|
776
|
+
)
|
|
777
|
+
assert block_generator is not None
|
|
778
|
+
|
|
779
|
+
spend_info = get_puzzle_and_solution_for_coin(
|
|
780
|
+
block_generator, coin_record.coin, block.height, self.service.constants
|
|
781
|
+
)
|
|
782
|
+
return {"coin_solution": CoinSpend(coin_record.coin, spend_info.puzzle, spend_info.solution)}
|
|
783
|
+
|
|
784
|
+
async def get_additions_and_removals(self, request: dict[str, Any]) -> EndpointResult:
|
|
785
|
+
if "header_hash" not in request:
|
|
786
|
+
raise ValueError("No header_hash in request")
|
|
787
|
+
header_hash = bytes32.from_hexstr(request["header_hash"])
|
|
788
|
+
|
|
789
|
+
block: Optional[FullBlock] = await self.service.block_store.get_full_block(header_hash)
|
|
790
|
+
if block is None:
|
|
791
|
+
raise ValueError(f"Block {header_hash.hex()} not found")
|
|
792
|
+
|
|
793
|
+
async with self.service.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.low):
|
|
794
|
+
if self.service.blockchain.height_to_hash(block.height) != header_hash:
|
|
795
|
+
raise ValueError(f"Block at {header_hash.hex()} is no longer in the blockchain (it's in a fork)")
|
|
796
|
+
additions: list[CoinRecord] = await self.service.coin_store.get_coins_added_at_height(block.height)
|
|
797
|
+
removals: list[CoinRecord] = await self.service.coin_store.get_coins_removed_at_height(block.height)
|
|
798
|
+
|
|
799
|
+
return {
|
|
800
|
+
"additions": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in additions],
|
|
801
|
+
"removals": [coin_record_dict_backwards_compat(cr.to_json_dict()) for cr in removals],
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
async def get_aggsig_additional_data(self, _: dict[str, Any]) -> EndpointResult:
|
|
805
|
+
return {"additional_data": self.service.constants.AGG_SIG_ME_ADDITIONAL_DATA.hex()}
|
|
806
|
+
|
|
807
|
+
async def get_all_mempool_tx_ids(self, _: dict[str, Any]) -> EndpointResult:
|
|
808
|
+
ids = list(self.service.mempool_manager.mempool.all_item_ids())
|
|
809
|
+
return {"tx_ids": ids}
|
|
810
|
+
|
|
811
|
+
async def get_all_mempool_items(self, _: dict[str, Any]) -> EndpointResult:
|
|
812
|
+
spends = {}
|
|
813
|
+
for item in self.service.mempool_manager.mempool.all_items():
|
|
814
|
+
spends[item.name.hex()] = item.to_json_dict()
|
|
815
|
+
return {"mempool_items": spends}
|
|
816
|
+
|
|
817
|
+
async def get_mempool_item_by_tx_id(self, request: dict[str, Any]) -> EndpointResult:
|
|
818
|
+
if "tx_id" not in request:
|
|
819
|
+
raise ValueError("No tx_id in request")
|
|
820
|
+
include_pending: bool = request.get("include_pending", False)
|
|
821
|
+
tx_id: bytes32 = bytes32.from_hexstr(request["tx_id"])
|
|
822
|
+
|
|
823
|
+
item = self.service.mempool_manager.get_mempool_item(tx_id, include_pending)
|
|
824
|
+
if item is None:
|
|
825
|
+
raise ValueError(f"Tx id 0x{tx_id.hex()} not in the mempool")
|
|
826
|
+
|
|
827
|
+
return {"mempool_item": item.to_json_dict()}
|
|
828
|
+
|
|
829
|
+
async def get_mempool_items_by_coin_name(self, request: dict[str, Any]) -> EndpointResult:
|
|
830
|
+
if "coin_name" not in request:
|
|
831
|
+
raise ValueError("No coin_name in request")
|
|
832
|
+
|
|
833
|
+
coin_name: bytes32 = bytes32.from_hexstr(request["coin_name"])
|
|
834
|
+
items = self.service.mempool_manager.mempool.get_items_by_coin_id(coin_name)
|
|
835
|
+
|
|
836
|
+
return {"mempool_items": [item.to_json_dict() for item in items]}
|
|
837
|
+
|
|
838
|
+
def _get_spendbundle_type_cost(self, name: str) -> uint64:
|
|
839
|
+
"""
|
|
840
|
+
This is a stopgap until we modify the wallet RPCs to get exact costs for created SpendBundles
|
|
841
|
+
before we send them to the Mempool.
|
|
842
|
+
"""
|
|
843
|
+
|
|
844
|
+
tx_cost_estimates = {
|
|
845
|
+
"send_xch_transaction": 9_401_710,
|
|
846
|
+
"cat_spend": 36_382_111,
|
|
847
|
+
"take_offer": 721_393_265,
|
|
848
|
+
"cancel_offer": 212_443_993,
|
|
849
|
+
"nft_set_nft_did": 115_540_006,
|
|
850
|
+
"nft_transfer_nft": 74_385_541, # burn or transfer
|
|
851
|
+
"create_new_pool_wallet": 18_055_407,
|
|
852
|
+
"pw_absorb_rewards": 82_668_466,
|
|
853
|
+
"create_new_did_wallet": 57_360_396,
|
|
854
|
+
}
|
|
855
|
+
return uint64(tx_cost_estimates[name])
|
|
856
|
+
|
|
857
|
+
async def _validate_fee_estimate_cost(self, request: dict[str, Any]) -> uint64:
|
|
858
|
+
c = 0
|
|
859
|
+
ns = ["spend_bundle", "cost", "spend_type"]
|
|
860
|
+
for n in ns:
|
|
861
|
+
if n in request:
|
|
862
|
+
c += 1
|
|
863
|
+
if c != 1:
|
|
864
|
+
raise ValueError(f"Request must contain exactly one of {ns}")
|
|
865
|
+
|
|
866
|
+
if "spend_bundle" in request:
|
|
867
|
+
spend_bundle = SpendBundle.from_json_dict(request["spend_bundle"])
|
|
868
|
+
conds: SpendBundleConditions = await self.service.mempool_manager.pre_validate_spendbundle(spend_bundle)
|
|
869
|
+
cost = conds.cost
|
|
870
|
+
elif "cost" in request:
|
|
871
|
+
cost = request["cost"]
|
|
872
|
+
else:
|
|
873
|
+
cost = self._get_spendbundle_type_cost(request["spend_type"])
|
|
874
|
+
cost *= request.get("spend_count", 1)
|
|
875
|
+
return uint64(cost)
|
|
876
|
+
|
|
877
|
+
def _validate_target_times(self, request: dict[str, Any]) -> None:
|
|
878
|
+
if "target_times" not in request:
|
|
879
|
+
raise ValueError("Request must contain 'target_times' array")
|
|
880
|
+
if any(t < 0 for t in request["target_times"]):
|
|
881
|
+
raise ValueError("'target_times' array members must be non-negative")
|
|
882
|
+
|
|
883
|
+
async def get_fee_estimate(self, request: dict[str, Any]) -> dict[str, Any]:
|
|
884
|
+
self._validate_target_times(request)
|
|
885
|
+
spend_cost = await self._validate_fee_estimate_cost(request)
|
|
886
|
+
|
|
887
|
+
target_times: list[int] = request["target_times"]
|
|
888
|
+
estimator: FeeEstimatorInterface = self.service.mempool_manager.mempool.fee_estimator
|
|
889
|
+
target_times.sort()
|
|
890
|
+
estimates = [
|
|
891
|
+
estimator.estimate_fee_rate(time_offset_seconds=time).mojos_per_clvm_cost * spend_cost
|
|
892
|
+
for time in target_times
|
|
893
|
+
]
|
|
894
|
+
# The Bitcoin Fee Estimator works by observing the most common fee rates that appear
|
|
895
|
+
# at set times into the future. This can lead to situations that users do not expect,
|
|
896
|
+
# such as estimating a higher fee for a longer transaction time.
|
|
897
|
+
estimates = make_monotonically_decreasing(estimates)
|
|
898
|
+
estimates = [uint64(e) for e in estimates]
|
|
899
|
+
current_fee_rate = estimator.estimate_fee_rate(time_offset_seconds=1)
|
|
900
|
+
mempool_size = self.service.mempool_manager.mempool.total_mempool_cost()
|
|
901
|
+
mempool_fees = self.service.mempool_manager.mempool.total_mempool_fees()
|
|
902
|
+
num_mempool_spends = self.service.mempool_manager.mempool.size()
|
|
903
|
+
mempool_max_size = estimator.mempool_max_size()
|
|
904
|
+
blockchain_state = await self.get_blockchain_state({})
|
|
905
|
+
synced = blockchain_state["blockchain_state"]["sync"]["synced"]
|
|
906
|
+
peak = blockchain_state["blockchain_state"]["peak"]
|
|
907
|
+
|
|
908
|
+
if peak is None:
|
|
909
|
+
peak_height = uint32(0)
|
|
910
|
+
last_peak_timestamp = uint64(0)
|
|
911
|
+
last_block_cost = 0
|
|
912
|
+
fee_rate_last_block = 0.0
|
|
913
|
+
last_tx_block_fees = uint64(0)
|
|
914
|
+
last_tx_block_height = 0
|
|
915
|
+
else:
|
|
916
|
+
peak_height = peak.height
|
|
917
|
+
last_peak_timestamp = peak.timestamp
|
|
918
|
+
peak_with_timestamp = peak_height # Last transaction block height
|
|
919
|
+
last_tx_block = self.service.blockchain.height_to_block_record(peak_with_timestamp)
|
|
920
|
+
while last_tx_block is None or last_peak_timestamp is None:
|
|
921
|
+
peak_with_timestamp -= 1
|
|
922
|
+
last_tx_block = self.service.blockchain.height_to_block_record(peak_with_timestamp)
|
|
923
|
+
last_peak_timestamp = last_tx_block.timestamp
|
|
924
|
+
|
|
925
|
+
assert last_tx_block is not None # mypy
|
|
926
|
+
assert last_peak_timestamp is not None # mypy
|
|
927
|
+
assert last_tx_block.fees is not None # mypy
|
|
928
|
+
|
|
929
|
+
record = await self.service.blockchain.block_store.get_full_block(last_tx_block.header_hash)
|
|
930
|
+
|
|
931
|
+
last_block_cost = 0
|
|
932
|
+
fee_rate_last_block = 0.0
|
|
933
|
+
if record and record.transactions_info and record.transactions_info.cost > 0:
|
|
934
|
+
last_block_cost = record.transactions_info.cost
|
|
935
|
+
fee_rate_last_block = record.transactions_info.fees / record.transactions_info.cost
|
|
936
|
+
last_tx_block_fees = last_tx_block.fees
|
|
937
|
+
last_tx_block_height = last_tx_block.height
|
|
938
|
+
|
|
939
|
+
dt = datetime.now(timezone.utc)
|
|
940
|
+
utc_time = dt.replace(tzinfo=timezone.utc)
|
|
941
|
+
utc_timestamp = utc_time.timestamp()
|
|
942
|
+
|
|
943
|
+
return {
|
|
944
|
+
"estimates": estimates,
|
|
945
|
+
"target_times": target_times,
|
|
946
|
+
"current_fee_rate": current_fee_rate.mojos_per_clvm_cost,
|
|
947
|
+
"mempool_size": mempool_size,
|
|
948
|
+
"mempool_fees": mempool_fees,
|
|
949
|
+
"num_spends": num_mempool_spends,
|
|
950
|
+
"mempool_max_size": mempool_max_size,
|
|
951
|
+
"full_node_synced": synced,
|
|
952
|
+
"peak_height": peak_height,
|
|
953
|
+
"last_peak_timestamp": last_peak_timestamp,
|
|
954
|
+
"node_time_utc": int(utc_timestamp),
|
|
955
|
+
"last_block_cost": last_block_cost,
|
|
956
|
+
"fees_last_block": last_tx_block_fees,
|
|
957
|
+
"fee_rate_last_block": fee_rate_last_block,
|
|
958
|
+
"last_tx_block_height": last_tx_block_height,
|
|
959
|
+
}
|