chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import builtins
|
|
3
4
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any,
|
|
5
|
+
from typing import Any, Generic, Optional, TypeVar
|
|
6
|
+
|
|
7
|
+
from chia_rs import SpendBundle
|
|
5
8
|
|
|
6
9
|
from chia.consensus.coinbase import farmer_parent_id, pool_parent_id
|
|
7
10
|
from chia.types.blockchain_format.coin import Coin
|
|
@@ -24,7 +27,7 @@ minimum_send_attempts = 6
|
|
|
24
27
|
@dataclass
|
|
25
28
|
class ItemAndTransactionRecords(Generic[T]):
|
|
26
29
|
item: T
|
|
27
|
-
transaction_records:
|
|
30
|
+
transaction_records: list[TransactionRecord]
|
|
28
31
|
|
|
29
32
|
|
|
30
33
|
@streamable
|
|
@@ -42,31 +45,31 @@ class TransactionRecordOld(Streamable):
|
|
|
42
45
|
confirmed: bool
|
|
43
46
|
sent: uint32
|
|
44
47
|
spend_bundle: Optional[WalletSpendBundle]
|
|
45
|
-
additions:
|
|
46
|
-
removals:
|
|
48
|
+
additions: list[Coin]
|
|
49
|
+
removals: list[Coin]
|
|
47
50
|
wallet_id: uint32
|
|
48
51
|
|
|
49
52
|
# Represents the list of peers that we sent the transaction to, whether each one
|
|
50
53
|
# included it in the mempool, and what the error message (if any) was
|
|
51
|
-
sent_to:
|
|
54
|
+
sent_to: list[tuple[str, uint8, Optional[str]]]
|
|
52
55
|
trade_id: Optional[bytes32]
|
|
53
56
|
type: uint32 # TransactionType
|
|
54
57
|
|
|
55
58
|
# name is also called bundle_id and tx_id
|
|
56
59
|
name: bytes32
|
|
57
|
-
memos:
|
|
60
|
+
memos: list[tuple[bytes32, list[bytes]]]
|
|
58
61
|
|
|
59
62
|
def is_in_mempool(self) -> bool:
|
|
60
63
|
# If one of the nodes we sent it to responded with success or pending, we return True
|
|
61
64
|
for _, mis, _ in self.sent_to:
|
|
62
|
-
if MempoolInclusionStatus(mis) in
|
|
65
|
+
if MempoolInclusionStatus(mis) in {MempoolInclusionStatus.SUCCESS, MempoolInclusionStatus.PENDING}:
|
|
63
66
|
return True
|
|
64
67
|
return False
|
|
65
68
|
|
|
66
69
|
def height_farmed(self, genesis_challenge: bytes32) -> Optional[uint32]:
|
|
67
70
|
if not self.confirmed:
|
|
68
71
|
return None
|
|
69
|
-
if self.type
|
|
72
|
+
if self.type in {TransactionType.FEE_REWARD, TransactionType.COINBASE_REWARD}:
|
|
70
73
|
for block_index in range(self.confirmed_at_height, self.confirmed_at_height - 100, -1):
|
|
71
74
|
if block_index < 0:
|
|
72
75
|
return None
|
|
@@ -78,19 +81,21 @@ class TransactionRecordOld(Streamable):
|
|
|
78
81
|
return uint32(block_index)
|
|
79
82
|
return None
|
|
80
83
|
|
|
81
|
-
def get_memos(self) ->
|
|
84
|
+
def get_memos(self) -> dict[bytes32, list[bytes]]:
|
|
82
85
|
return {coin_id: ms for coin_id, ms in self.memos}
|
|
83
86
|
|
|
84
87
|
@classmethod
|
|
85
|
-
def from_json_dict_convenience(
|
|
88
|
+
def from_json_dict_convenience(
|
|
89
|
+
cls: builtins.type[_T_TransactionRecord], modified_tx_input: dict
|
|
90
|
+
) -> _T_TransactionRecord:
|
|
86
91
|
modified_tx = modified_tx_input.copy()
|
|
87
92
|
if "to_address" in modified_tx:
|
|
88
93
|
modified_tx["to_puzzle_hash"] = decode_puzzle_hash(modified_tx["to_address"]).hex()
|
|
89
94
|
if "to_address" in modified_tx:
|
|
90
95
|
del modified_tx["to_address"]
|
|
91
96
|
# Converts memos from a flat dict into a nested list
|
|
92
|
-
memos_dict:
|
|
93
|
-
memos_list:
|
|
97
|
+
memos_dict: dict[str, list[str]] = {}
|
|
98
|
+
memos_list: list = []
|
|
94
99
|
if "memos" in modified_tx:
|
|
95
100
|
for coin_id, memo in modified_tx["memos"].items():
|
|
96
101
|
if coin_id not in memos_dict:
|
|
@@ -102,13 +107,13 @@ class TransactionRecordOld(Streamable):
|
|
|
102
107
|
return cls.from_json_dict(modified_tx)
|
|
103
108
|
|
|
104
109
|
@classmethod
|
|
105
|
-
def from_json_dict(cls:
|
|
110
|
+
def from_json_dict(cls: builtins.type[_T_TransactionRecord], json_dict: dict[str, Any]) -> _T_TransactionRecord:
|
|
106
111
|
try:
|
|
107
112
|
return super().from_json_dict(json_dict)
|
|
108
113
|
except Exception:
|
|
109
114
|
return cls.from_json_dict_convenience(json_dict)
|
|
110
115
|
|
|
111
|
-
def to_json_dict_convenience(self, config:
|
|
116
|
+
def to_json_dict_convenience(self, config: dict) -> dict:
|
|
112
117
|
selected = config["selected_network"]
|
|
113
118
|
prefix = config["network_overrides"]["config"][selected]["address_prefix"]
|
|
114
119
|
formatted = self.to_json_dict()
|
|
@@ -128,12 +133,12 @@ class TransactionRecordOld(Streamable):
|
|
|
128
133
|
if any(x[1] == MempoolInclusionStatus.SUCCESS for x in self.sent_to):
|
|
129
134
|
# we managed to push it to mempool at least once
|
|
130
135
|
return True
|
|
131
|
-
if any(x[2] in
|
|
136
|
+
if any(x[2] in {Err.INVALID_FEE_LOW_FEE.name, Err.INVALID_FEE_TOO_CLOSE_TO_ZERO.name} for x in self.sent_to):
|
|
132
137
|
# we tried to push it to mempool and got a fee error so it's a temporary error
|
|
133
138
|
return True
|
|
134
139
|
return False
|
|
135
140
|
|
|
136
|
-
def hint_dict(self) ->
|
|
141
|
+
def hint_dict(self) -> dict[bytes32, bytes32]:
|
|
137
142
|
return {coin_id: bytes32(memos[0]) for coin_id, memos in self.memos if len(memos) > 0 and len(memos[0]) == 32}
|
|
138
143
|
|
|
139
144
|
|
|
@@ -141,3 +146,13 @@ class TransactionRecordOld(Streamable):
|
|
|
141
146
|
@dataclass(frozen=True)
|
|
142
147
|
class TransactionRecord(TransactionRecordOld):
|
|
143
148
|
valid_times: ConditionValidTimes
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@streamable
|
|
152
|
+
@dataclass(frozen=True)
|
|
153
|
+
class LightTransactionRecord(Streamable):
|
|
154
|
+
name: bytes32
|
|
155
|
+
type: uint32
|
|
156
|
+
additions: list[Coin]
|
|
157
|
+
removals: list[Coin]
|
|
158
|
+
spend_bundle: Optional[SpendBundle]
|
chia/wallet/util/address_type.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from enum import Enum
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from chia.util.bech32m import bech32_decode, convertbits
|
|
7
7
|
from chia.util.config import selected_network_address_prefix
|
|
@@ -12,7 +12,7 @@ class AddressType(Enum):
|
|
|
12
12
|
NFT = "nft"
|
|
13
13
|
DID = "did:chia:"
|
|
14
14
|
|
|
15
|
-
def hrp(self, config:
|
|
15
|
+
def hrp(self, config: dict[str, Any]) -> str:
|
|
16
16
|
if self == AddressType.XCH:
|
|
17
17
|
# Special case to map XCH to the current network's address prefix
|
|
18
18
|
return selected_network_address_prefix(config)
|
|
@@ -24,7 +24,7 @@ class AddressType(Enum):
|
|
|
24
24
|
return 32
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def is_valid_address(address: str, allowed_types:
|
|
27
|
+
def is_valid_address(address: str, allowed_types: set[AddressType], config: dict[str, Any]) -> bool:
|
|
28
28
|
try:
|
|
29
29
|
ensure_valid_address(address, allowed_types=allowed_types, config=config)
|
|
30
30
|
return True
|
|
@@ -32,7 +32,7 @@ def is_valid_address(address: str, allowed_types: Set[AddressType], config: Dict
|
|
|
32
32
|
return False
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
def ensure_valid_address(address: str, *, allowed_types:
|
|
35
|
+
def ensure_valid_address(address: str, *, allowed_types: set[AddressType], config: dict[str, Any]) -> str:
|
|
36
36
|
hrp, b32data = bech32_decode(address)
|
|
37
37
|
if not b32data or not hrp:
|
|
38
38
|
raise ValueError(f"Invalid address: {address}")
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
6
|
from chia.util.ints import uint64
|
|
@@ -18,9 +17,6 @@ from chia.wallet.signer_protocol import (
|
|
|
18
17
|
)
|
|
19
18
|
from chia.wallet.util.clvm_streamable import TranslationLayer, TranslationLayerMapping, clvm_streamable
|
|
20
19
|
|
|
21
|
-
# Pylint doesn't understand that these classes are in fact dataclasses
|
|
22
|
-
# pylint: disable=invalid-field-call
|
|
23
|
-
|
|
24
20
|
|
|
25
21
|
@clvm_streamable
|
|
26
22
|
@dataclass(frozen=True)
|
|
@@ -41,7 +37,7 @@ class BSTLSigningTarget(Streamable):
|
|
|
41
37
|
@clvm_streamable
|
|
42
38
|
@dataclass(frozen=True)
|
|
43
39
|
class BSTLSumHint(Streamable):
|
|
44
|
-
fingerprints:
|
|
40
|
+
fingerprints: list[bytes] = field(metadata=dict(key="f"))
|
|
45
41
|
synthetic_offset: bytes = field(metadata=dict(key="o"))
|
|
46
42
|
final_pubkey: bytes = field(metadata=dict(key="p"))
|
|
47
43
|
|
|
@@ -58,7 +54,7 @@ class BSTLSumHint(Streamable):
|
|
|
58
54
|
@dataclass(frozen=True)
|
|
59
55
|
class BSTLPathHint(Streamable):
|
|
60
56
|
root_fingerprint: bytes = field(metadata=dict(key="f"))
|
|
61
|
-
path:
|
|
57
|
+
path: list[uint64] = field(metadata=dict(key="p"))
|
|
62
58
|
|
|
63
59
|
@staticmethod
|
|
64
60
|
def from_wallet_api(_from: PathHint) -> BSTLPathHint:
|
|
@@ -72,9 +68,9 @@ class BSTLPathHint(Streamable):
|
|
|
72
68
|
@clvm_streamable
|
|
73
69
|
@dataclass(frozen=True)
|
|
74
70
|
class BSTLSigningInstructions(Streamable):
|
|
75
|
-
sum_hints:
|
|
76
|
-
path_hints:
|
|
77
|
-
targets:
|
|
71
|
+
sum_hints: list[BSTLSumHint] = field(metadata=dict(key="s"))
|
|
72
|
+
path_hints: list[BSTLPathHint] = field(metadata=dict(key="p"))
|
|
73
|
+
targets: list[BSTLSigningTarget] = field(metadata=dict(key="t"))
|
|
78
74
|
|
|
79
75
|
@staticmethod
|
|
80
76
|
def from_wallet_api(_from: SigningInstructions) -> BSTLSigningInstructions:
|
|
@@ -98,9 +94,9 @@ class BSTLSigningInstructions(Streamable):
|
|
|
98
94
|
@clvm_streamable
|
|
99
95
|
@dataclass(frozen=True)
|
|
100
96
|
class BSTLUnsignedTransaction(Streamable):
|
|
101
|
-
sum_hints:
|
|
102
|
-
path_hints:
|
|
103
|
-
targets:
|
|
97
|
+
sum_hints: list[BSTLSumHint] = field(metadata=dict(key="s"))
|
|
98
|
+
path_hints: list[BSTLPathHint] = field(metadata=dict(key="p"))
|
|
99
|
+
targets: list[BSTLSigningTarget] = field(metadata=dict(key="t"))
|
|
104
100
|
|
|
105
101
|
@staticmethod
|
|
106
102
|
def from_wallet_api(_from: UnsignedTransaction) -> BSTLUnsignedTransaction:
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import functools
|
|
5
5
|
from types import MappingProxyType
|
|
6
|
-
from typing import Any, Callable,
|
|
6
|
+
from typing import Any, Callable, Generic, Optional, TypeVar, Union, get_args, get_type_hints
|
|
7
7
|
|
|
8
8
|
from hsms.clvm_serde import from_program_for_type, to_program_for_type
|
|
9
9
|
from typing_extensions import TypeGuard
|
|
@@ -22,8 +22,8 @@ from chia.util.streamable import (
|
|
|
22
22
|
_T_Streamable = TypeVar("_T_Streamable", bound=Streamable)
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def clvm_streamable(cls:
|
|
26
|
-
wrapped_cls:
|
|
25
|
+
def clvm_streamable(cls: type[Streamable]) -> type[Streamable]:
|
|
26
|
+
wrapped_cls: type[Streamable] = streamable(cls)
|
|
27
27
|
setattr(wrapped_cls, "_clvm_streamable", True)
|
|
28
28
|
|
|
29
29
|
hints = get_type_hints(cls)
|
|
@@ -55,10 +55,10 @@ def byte_serialize_clvm_streamable(
|
|
|
55
55
|
|
|
56
56
|
def json_serialize_with_clvm_streamable(
|
|
57
57
|
streamable: object,
|
|
58
|
-
next_recursion_step: Optional[Callable[...,
|
|
58
|
+
next_recursion_step: Optional[Callable[..., dict[str, Any]]] = None,
|
|
59
59
|
translation_layer: Optional[TranslationLayer] = None,
|
|
60
60
|
**next_recursion_env: Any,
|
|
61
|
-
) -> Union[str,
|
|
61
|
+
) -> Union[str, dict[str, Any]]:
|
|
62
62
|
if next_recursion_step is None:
|
|
63
63
|
next_recursion_step = recurse_jsonify
|
|
64
64
|
if is_clvm_streamable(streamable):
|
|
@@ -71,9 +71,9 @@ def json_serialize_with_clvm_streamable(
|
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
def program_deserialize_clvm_streamable(
|
|
74
|
-
program: Program, clvm_streamable_type:
|
|
74
|
+
program: Program, clvm_streamable_type: type[_T_Streamable], translation_layer: Optional[TranslationLayer] = None
|
|
75
75
|
) -> _T_Streamable:
|
|
76
|
-
type_to_deserialize_from:
|
|
76
|
+
type_to_deserialize_from: type[Streamable] = clvm_streamable_type
|
|
77
77
|
if translation_layer is not None:
|
|
78
78
|
mapping = translation_layer.get_mapping(clvm_streamable_type)
|
|
79
79
|
if mapping is not None:
|
|
@@ -87,7 +87,7 @@ def program_deserialize_clvm_streamable(
|
|
|
87
87
|
|
|
88
88
|
|
|
89
89
|
def byte_deserialize_clvm_streamable(
|
|
90
|
-
blob: bytes, clvm_streamable_type:
|
|
90
|
+
blob: bytes, clvm_streamable_type: type[_T_Streamable], translation_layer: Optional[TranslationLayer] = None
|
|
91
91
|
) -> _T_Streamable:
|
|
92
92
|
return program_deserialize_clvm_streamable(
|
|
93
93
|
Program.from_bytes(blob), clvm_streamable_type, translation_layer=translation_layer
|
|
@@ -100,7 +100,7 @@ def is_compound_type(typ: Any) -> bool:
|
|
|
100
100
|
|
|
101
101
|
# TODO: this is more than _just_ a Streamable, but it is also a Streamable and that's
|
|
102
102
|
# useful for now
|
|
103
|
-
def is_clvm_streamable_type(v:
|
|
103
|
+
def is_clvm_streamable_type(v: type[object]) -> TypeGuard[type[Streamable]]:
|
|
104
104
|
return issubclass(v, Streamable) and hasattr(v, "_clvm_streamable")
|
|
105
105
|
|
|
106
106
|
|
|
@@ -111,8 +111,8 @@ def is_clvm_streamable(v: object) -> TypeGuard[Streamable]:
|
|
|
111
111
|
|
|
112
112
|
|
|
113
113
|
def json_deserialize_with_clvm_streamable(
|
|
114
|
-
json_dict: Union[str,
|
|
115
|
-
streamable_type:
|
|
114
|
+
json_dict: Union[str, dict[str, Any]],
|
|
115
|
+
streamable_type: type[_T_Streamable],
|
|
116
116
|
translation_layer: Optional[TranslationLayer] = None,
|
|
117
117
|
) -> _T_Streamable:
|
|
118
118
|
if isinstance(json_dict, str):
|
|
@@ -165,18 +165,18 @@ _T_TLClvmStreamable = TypeVar("_T_TLClvmStreamable", bound="Streamable")
|
|
|
165
165
|
|
|
166
166
|
@dataclasses.dataclass(frozen=True)
|
|
167
167
|
class TranslationLayerMapping(Generic[_T_ClvmStreamable, _T_TLClvmStreamable]):
|
|
168
|
-
from_type:
|
|
169
|
-
to_type:
|
|
168
|
+
from_type: type[_T_ClvmStreamable]
|
|
169
|
+
to_type: type[_T_TLClvmStreamable]
|
|
170
170
|
serialize_function: Callable[[_T_ClvmStreamable], _T_TLClvmStreamable]
|
|
171
171
|
deserialize_function: Callable[[_T_TLClvmStreamable], _T_ClvmStreamable]
|
|
172
172
|
|
|
173
173
|
|
|
174
174
|
@dataclasses.dataclass(frozen=True)
|
|
175
175
|
class TranslationLayer:
|
|
176
|
-
type_mappings:
|
|
176
|
+
type_mappings: list[TranslationLayerMapping[Any, Any]]
|
|
177
177
|
|
|
178
178
|
def get_mapping(
|
|
179
|
-
self, _type:
|
|
179
|
+
self, _type: type[_T_ClvmStreamable]
|
|
180
180
|
) -> Optional[TranslationLayerMapping[_T_ClvmStreamable, Streamable]]:
|
|
181
181
|
mappings = [m for m in self.type_mappings if m.from_type == _type]
|
|
182
182
|
if len(mappings) == 1:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from chia.consensus.condition_costs import ConditionCost
|
|
7
7
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
@@ -24,16 +24,16 @@ def compute_spend_hints_and_additions(
|
|
|
24
24
|
cs: CoinSpend,
|
|
25
25
|
*,
|
|
26
26
|
max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM,
|
|
27
|
-
) ->
|
|
27
|
+
) -> tuple[dict[bytes32, HintedCoin], int]:
|
|
28
28
|
cost, result_program = cs.puzzle_reveal.run_with_cost(max_cost, cs.solution)
|
|
29
29
|
|
|
30
|
-
hinted_coins:
|
|
30
|
+
hinted_coins: dict[bytes32, HintedCoin] = {}
|
|
31
31
|
for condition in result_program.as_iter():
|
|
32
32
|
if cost > max_cost:
|
|
33
33
|
raise ValidationError(Err.BLOCK_COST_EXCEEDS_MAX, "compute_spend_hints_and_additions() for CoinSpend")
|
|
34
34
|
atoms = condition.as_iter()
|
|
35
35
|
op = next(atoms).atom
|
|
36
|
-
if op in
|
|
36
|
+
if op in {
|
|
37
37
|
ConditionOpcode.AGG_SIG_PARENT,
|
|
38
38
|
ConditionOpcode.AGG_SIG_PUZZLE,
|
|
39
39
|
ConditionOpcode.AGG_SIG_AMOUNT,
|
|
@@ -42,7 +42,7 @@ def compute_spend_hints_and_additions(
|
|
|
42
42
|
ConditionOpcode.AGG_SIG_PARENT_PUZZLE,
|
|
43
43
|
ConditionOpcode.AGG_SIG_UNSAFE,
|
|
44
44
|
ConditionOpcode.AGG_SIG_ME,
|
|
45
|
-
|
|
45
|
+
}:
|
|
46
46
|
cost += ConditionCost.AGG_SIG.value
|
|
47
47
|
continue
|
|
48
48
|
if op != ConditionOpcode.CREATE_COIN.value:
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Dict, List
|
|
4
|
-
|
|
5
3
|
from clvm.casts import int_from_bytes
|
|
6
4
|
|
|
7
5
|
from chia.types.blockchain_format.coin import Coin
|
|
@@ -13,9 +11,9 @@ from chia.util.ints import uint64
|
|
|
13
11
|
from chia.wallet.wallet_spend_bundle import WalletSpendBundle
|
|
14
12
|
|
|
15
13
|
|
|
16
|
-
def compute_memos_for_spend(coin_spend: CoinSpend) ->
|
|
14
|
+
def compute_memos_for_spend(coin_spend: CoinSpend) -> dict[bytes32, list[bytes]]:
|
|
17
15
|
_, result = coin_spend.puzzle_reveal.run_with_cost(INFINITE_COST, coin_spend.solution)
|
|
18
|
-
memos:
|
|
16
|
+
memos: dict[bytes32, list[bytes]] = {}
|
|
19
17
|
for condition in result.as_python():
|
|
20
18
|
if condition[0] == ConditionOpcode.CREATE_COIN and len(condition) >= 4:
|
|
21
19
|
# If only 3 elements (opcode + 2 args), there is no memo, this is ph, amount
|
|
@@ -27,13 +25,13 @@ def compute_memos_for_spend(coin_spend: CoinSpend) -> Dict[bytes32, List[bytes]]
|
|
|
27
25
|
return memos
|
|
28
26
|
|
|
29
27
|
|
|
30
|
-
def compute_memos(bundle: WalletSpendBundle) ->
|
|
28
|
+
def compute_memos(bundle: WalletSpendBundle) -> dict[bytes32, list[bytes]]:
|
|
31
29
|
"""
|
|
32
30
|
Retrieves the memos for additions in this spend_bundle, which are formatted as a list in the 3rd parameter of
|
|
33
31
|
CREATE_COIN. If there are no memos, the addition coin_id is not included. If they are not formatted as a list
|
|
34
32
|
of bytes, they are not included. This is expensive to call, it should not be used in full node code.
|
|
35
33
|
"""
|
|
36
|
-
memos:
|
|
34
|
+
memos: dict[bytes32, list[bytes]] = {}
|
|
37
35
|
for coin_spend in bundle.coin_spends:
|
|
38
36
|
spend_memos = compute_memos_for_spend(coin_spend)
|
|
39
37
|
for coin_name, coin_memos in spend_memos.items():
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from collections.abc import Sequence
|
|
3
4
|
from hashlib import sha256
|
|
4
|
-
from typing import Callable
|
|
5
|
+
from typing import Callable
|
|
5
6
|
|
|
6
7
|
from clvm.casts import int_to_bytes
|
|
7
8
|
|
|
@@ -56,7 +57,7 @@ def shatree_int(val: int) -> bytes32:
|
|
|
56
57
|
# `1` if R is 0
|
|
57
58
|
|
|
58
59
|
|
|
59
|
-
def curried_values_tree_hash(arguments:
|
|
60
|
+
def curried_values_tree_hash(arguments: list[bytes32]) -> bytes32:
|
|
60
61
|
if len(arguments) == 0:
|
|
61
62
|
return ONE_TREEHASH
|
|
62
63
|
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import List
|
|
4
|
-
|
|
5
3
|
from chia_rs import AugSchemeMPL
|
|
6
4
|
from clvm.operators import KEYWORD_FROM_ATOM
|
|
7
5
|
from clvm_tools.binutils import disassemble as bu_disassemble
|
|
@@ -14,7 +12,7 @@ from chia.util.condition_tools import conditions_dict_for_solution, pkm_pairs_fo
|
|
|
14
12
|
from chia.util.hash import std_hash
|
|
15
13
|
from chia.wallet.uncurried_puzzle import UncurriedPuzzle
|
|
16
14
|
|
|
17
|
-
CONDITIONS = {
|
|
15
|
+
CONDITIONS = {opcode.name: opcode.value[0] for opcode in ConditionOpcode}
|
|
18
16
|
KFA = {v: k for k, v in CONDITIONS.items()}
|
|
19
17
|
|
|
20
18
|
|
|
@@ -76,9 +74,9 @@ def debug_spend_bundle(spend_bundle, agg_sig_additional_data=DEFAULT_CONSTANTS.A
|
|
|
76
74
|
pks = []
|
|
77
75
|
msgs = []
|
|
78
76
|
|
|
79
|
-
created_coin_announcements:
|
|
77
|
+
created_coin_announcements: list[list[bytes]] = []
|
|
80
78
|
asserted_coin_announcements = []
|
|
81
|
-
created_puzzle_announcements:
|
|
79
|
+
created_puzzle_announcements: list[list[bytes]] = []
|
|
82
80
|
asserted_puzzle_announcements = []
|
|
83
81
|
|
|
84
82
|
print("=" * 80)
|
|
@@ -110,7 +108,7 @@ def debug_spend_bundle(spend_bundle, agg_sig_additional_data=DEFAULT_CONSTANTS.A
|
|
|
110
108
|
pks.append(pk)
|
|
111
109
|
msgs.append(m)
|
|
112
110
|
print()
|
|
113
|
-
|
|
111
|
+
_cost, r = puzzle_reveal.run_with_cost(INFINITE_COST, solution)
|
|
114
112
|
print(disassemble(r))
|
|
115
113
|
create_coin_conditions = [con for con in r.as_iter() if con.first().as_int() == 51]
|
|
116
114
|
print()
|
|
@@ -141,13 +139,13 @@ def debug_spend_bundle(spend_bundle, agg_sig_additional_data=DEFAULT_CONSTANTS.A
|
|
|
141
139
|
|
|
142
140
|
print(f" {disassemble(as_prog)}")
|
|
143
141
|
created_coin_announcements.extend(
|
|
144
|
-
[coin_name
|
|
142
|
+
[coin_name, *_.vars] for _ in conditions.get(ConditionOpcode.CREATE_COIN_ANNOUNCEMENT, [])
|
|
145
143
|
)
|
|
146
144
|
asserted_coin_announcements.extend(
|
|
147
145
|
[_.vars[0].hex() for _ in conditions.get(ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT, [])]
|
|
148
146
|
)
|
|
149
147
|
created_puzzle_announcements.extend(
|
|
150
|
-
[puzzle_reveal.get_tree_hash()
|
|
148
|
+
[puzzle_reveal.get_tree_hash(), *_.vars]
|
|
151
149
|
for _ in conditions.get(ConditionOpcode.CREATE_PUZZLE_ANNOUNCEMENT, [])
|
|
152
150
|
)
|
|
153
151
|
asserted_puzzle_announcements.extend(
|
chia/wallet/util/merkle_tree.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import math
|
|
4
4
|
from enum import Enum
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
7
|
from clvm.casts import int_to_bytes
|
|
8
8
|
|
|
@@ -28,13 +28,13 @@ class TreeType(Enum):
|
|
|
28
28
|
|
|
29
29
|
class MerkleTree:
|
|
30
30
|
type: TreeType
|
|
31
|
-
nodes:
|
|
31
|
+
nodes: list[bytes32]
|
|
32
32
|
|
|
33
|
-
def __init__(self, nodes:
|
|
33
|
+
def __init__(self, nodes: list[bytes32], waterfall: bool = False) -> None:
|
|
34
34
|
self.type = TreeType.WATERFALL if waterfall else TreeType.TREE
|
|
35
35
|
self.nodes = nodes
|
|
36
36
|
|
|
37
|
-
def split_list(self, puzzle_hashes:
|
|
37
|
+
def split_list(self, puzzle_hashes: list[bytes32]) -> tuple[list[bytes32], list[bytes32]]:
|
|
38
38
|
if self.type == TreeType.TREE:
|
|
39
39
|
mid_index = math.ceil(len(puzzle_hashes) / 2)
|
|
40
40
|
first = puzzle_hashes[0:mid_index]
|
|
@@ -45,7 +45,7 @@ class MerkleTree:
|
|
|
45
45
|
|
|
46
46
|
return first, rest
|
|
47
47
|
|
|
48
|
-
def _root(self, puzzle_hashes:
|
|
48
|
+
def _root(self, puzzle_hashes: list[bytes32]) -> bytes32:
|
|
49
49
|
if len(puzzle_hashes) == 1:
|
|
50
50
|
return hash_an_atom(puzzle_hashes[0])
|
|
51
51
|
else:
|
|
@@ -56,8 +56,8 @@ class MerkleTree:
|
|
|
56
56
|
return self._root(self.nodes)
|
|
57
57
|
|
|
58
58
|
def _proof(
|
|
59
|
-
self, puzzle_hashes:
|
|
60
|
-
) ->
|
|
59
|
+
self, puzzle_hashes: list[bytes32], searching_for: bytes32
|
|
60
|
+
) -> tuple[Optional[int], Optional[list[bytes32]], bytes32, Optional[int]]:
|
|
61
61
|
if len(puzzle_hashes) == 1:
|
|
62
62
|
atom_hash = hash_an_atom(puzzle_hashes[0])
|
|
63
63
|
if puzzle_hashes[0] == searching_for:
|
|
@@ -76,14 +76,14 @@ class MerkleTree:
|
|
|
76
76
|
if first_hash[0] is not None:
|
|
77
77
|
final_list = first_hash[1]
|
|
78
78
|
# TODO: handle hints
|
|
79
|
-
# error: Item "None" of "Optional[
|
|
79
|
+
# error: Item "None" of "Optional[list[bytes32]]" has no attribute "append" [union-attr]
|
|
80
80
|
final_list.append(rest_hash[2]) # type: ignore[union-attr]
|
|
81
81
|
bit_num = first_hash[3]
|
|
82
82
|
final_path = first_hash[0]
|
|
83
83
|
elif rest_hash[0] is not None:
|
|
84
84
|
final_list = rest_hash[1]
|
|
85
85
|
# TODO: handle hints
|
|
86
|
-
# error: Item "None" of "Optional[
|
|
86
|
+
# error: Item "None" of "Optional[list[bytes32]]" has no attribute "append" [union-attr]
|
|
87
87
|
final_list.append(first_hash[2]) # type: ignore[union-attr]
|
|
88
88
|
bit_num = rest_hash[3]
|
|
89
89
|
# TODO: handle hints
|
|
@@ -95,6 +95,6 @@ class MerkleTree:
|
|
|
95
95
|
|
|
96
96
|
return (final_path, final_list, pair_hash, bit_num + 1 if bit_num is not None else None)
|
|
97
97
|
|
|
98
|
-
def generate_proof(self, leaf_reveal: bytes32) ->
|
|
98
|
+
def generate_proof(self, leaf_reveal: bytes32) -> tuple[Optional[int], list[Optional[list[bytes32]]]]:
|
|
99
99
|
proof = self._proof(self.nodes, leaf_reveal)
|
|
100
100
|
return (proof[0], [proof[1]])
|
chia/wallet/util/merkle_utils.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import hashlib
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
7
|
|
|
8
|
-
TupleTree = Any # Union[bytes32,
|
|
9
|
-
Proof_Tree_Type = Any # Union[bytes32,
|
|
8
|
+
TupleTree = Any # Union[bytes32, tuple["TupleTree", "TupleTree"]]
|
|
9
|
+
Proof_Tree_Type = Any # Union[bytes32, tuple[bytes32, "Proof_Tree_Type"]]
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
HASH_TREE_PREFIX = bytes([2])
|
|
@@ -24,7 +24,7 @@ def sha256(*args: bytes) -> bytes32:
|
|
|
24
24
|
return bytes32(hashlib.sha256(b"".join(args)).digest())
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def build_merkle_tree_from_binary_tree(tuples: TupleTree) ->
|
|
27
|
+
def build_merkle_tree_from_binary_tree(tuples: TupleTree) -> tuple[bytes32, dict[bytes32, tuple[int, list[bytes32]]]]:
|
|
28
28
|
if isinstance(tuples, bytes):
|
|
29
29
|
tuples = bytes32(tuples)
|
|
30
30
|
return sha256(HASH_LEAF_PREFIX, tuples), {tuples: (0, [])}
|
|
@@ -45,7 +45,7 @@ def build_merkle_tree_from_binary_tree(tuples: TupleTree) -> Tuple[bytes32, Dict
|
|
|
45
45
|
return new_root, new_proofs
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def list_to_binary_tree(objects:
|
|
48
|
+
def list_to_binary_tree(objects: list[Any]) -> Any:
|
|
49
49
|
size = len(objects)
|
|
50
50
|
if size == 0:
|
|
51
51
|
raise ValueError("Cannot build a tree out of 0 objects")
|
|
@@ -57,7 +57,7 @@ def list_to_binary_tree(objects: List[Any]) -> Any:
|
|
|
57
57
|
return (list_to_binary_tree(first_half), list_to_binary_tree(last_half))
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
def build_merkle_tree(objects:
|
|
60
|
+
def build_merkle_tree(objects: list[bytes32]) -> tuple[bytes32, dict[bytes32, tuple[int, list[bytes32]]]]:
|
|
61
61
|
"""
|
|
62
62
|
return (merkle_root, dict_of_proofs)
|
|
63
63
|
"""
|
|
@@ -65,7 +65,7 @@ def build_merkle_tree(objects: List[bytes32]) -> Tuple[bytes32, Dict[bytes32, Tu
|
|
|
65
65
|
return build_merkle_tree_from_binary_tree(objects_binary_tree)
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
def merkle_proof_from_path_and_tree(node_path: int, proof_tree: Proof_Tree_Type) ->
|
|
68
|
+
def merkle_proof_from_path_and_tree(node_path: int, proof_tree: Proof_Tree_Type) -> tuple[int, list[bytes32]]:
|
|
69
69
|
proof_path = 0
|
|
70
70
|
proof = []
|
|
71
71
|
while not isinstance(proof_tree, bytes32):
|
|
@@ -82,7 +82,7 @@ def merkle_proof_from_path_and_tree(node_path: int, proof_tree: Proof_Tree_Type)
|
|
|
82
82
|
return proof_path, proof
|
|
83
83
|
|
|
84
84
|
|
|
85
|
-
def _simplify_merkle_proof(tree_hash: bytes32, proof:
|
|
85
|
+
def _simplify_merkle_proof(tree_hash: bytes32, proof: tuple[int, list[bytes32]]) -> bytes32:
|
|
86
86
|
# we return the expected merkle root
|
|
87
87
|
path, nodes = proof
|
|
88
88
|
for node in nodes:
|
|
@@ -94,9 +94,9 @@ def _simplify_merkle_proof(tree_hash: bytes32, proof: Tuple[int, List[bytes32]])
|
|
|
94
94
|
return tree_hash
|
|
95
95
|
|
|
96
96
|
|
|
97
|
-
def simplify_merkle_proof(tree_hash: bytes32, proof:
|
|
97
|
+
def simplify_merkle_proof(tree_hash: bytes32, proof: tuple[int, list[bytes32]]) -> bytes32:
|
|
98
98
|
return _simplify_merkle_proof(sha256(HASH_LEAF_PREFIX, tree_hash), proof)
|
|
99
99
|
|
|
100
100
|
|
|
101
|
-
def check_merkle_proof(merkle_root: bytes32, tree_hash: bytes32, proof:
|
|
101
|
+
def check_merkle_proof(merkle_root: bytes32, tree_hash: bytes32, proof: tuple[int, list[bytes32]]) -> bool:
|
|
102
102
|
return merkle_root == simplify_merkle_proof(tree_hash, proof)
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import dataclasses
|
|
5
5
|
from enum import IntEnum
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
from chia.protocols.wallet_protocol import CoinStateUpdate, NewPeakWallet
|
|
9
9
|
from chia.server.ws_connection import WSChiaConnection
|
|
@@ -57,11 +57,11 @@ class NewPeakQueue:
|
|
|
57
57
|
self._inner_queue: asyncio.PriorityQueue = inner_queue
|
|
58
58
|
self._pending_data_process_items: int = 0
|
|
59
59
|
|
|
60
|
-
async def subscribe_to_coin_ids(self, coin_ids:
|
|
60
|
+
async def subscribe_to_coin_ids(self, coin_ids: list[bytes32]):
|
|
61
61
|
self._pending_data_process_items += 1
|
|
62
62
|
await self._inner_queue.put(NewPeakItem(NewPeakQueueTypes.COIN_ID_SUBSCRIPTION, coin_ids))
|
|
63
63
|
|
|
64
|
-
async def subscribe_to_puzzle_hashes(self, puzzle_hashes:
|
|
64
|
+
async def subscribe_to_puzzle_hashes(self, puzzle_hashes: list[bytes32]):
|
|
65
65
|
self._pending_data_process_items += 1
|
|
66
66
|
await self._inner_queue.put(NewPeakItem(NewPeakQueueTypes.PUZZLE_HASH_SUBSCRIPTION, puzzle_hashes))
|
|
67
67
|
|