chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/types/coin_spend.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Union
|
|
5
5
|
|
|
6
6
|
import chia_rs
|
|
7
7
|
|
|
@@ -46,7 +46,7 @@ def compute_additions_with_cost(
|
|
|
46
46
|
cs: CoinSpend,
|
|
47
47
|
*,
|
|
48
48
|
max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM,
|
|
49
|
-
) ->
|
|
49
|
+
) -> tuple[list[Coin], int]:
|
|
50
50
|
"""
|
|
51
51
|
Run the puzzle in the specified CoinSpend and return the cost and list of
|
|
52
52
|
coins created by the puzzle, i.e. additions. If the cost (CLVM- and
|
|
@@ -56,14 +56,14 @@ def compute_additions_with_cost(
|
|
|
56
56
|
measured at the block generator level.
|
|
57
57
|
"""
|
|
58
58
|
parent_id = cs.coin.name()
|
|
59
|
-
ret:
|
|
59
|
+
ret: list[Coin] = []
|
|
60
60
|
cost, r = cs.puzzle_reveal.run_with_cost(max_cost, cs.solution)
|
|
61
61
|
for cond in Program.to(r).as_iter():
|
|
62
62
|
if cost > max_cost:
|
|
63
63
|
raise ValidationError(Err.BLOCK_COST_EXCEEDS_MAX, "compute_additions() for CoinSpend")
|
|
64
64
|
atoms = cond.as_iter()
|
|
65
65
|
op = next(atoms).atom
|
|
66
|
-
if op in
|
|
66
|
+
if op in {
|
|
67
67
|
ConditionOpcode.AGG_SIG_PARENT,
|
|
68
68
|
ConditionOpcode.AGG_SIG_PUZZLE,
|
|
69
69
|
ConditionOpcode.AGG_SIG_AMOUNT,
|
|
@@ -72,7 +72,7 @@ def compute_additions_with_cost(
|
|
|
72
72
|
ConditionOpcode.AGG_SIG_PARENT_PUZZLE,
|
|
73
73
|
ConditionOpcode.AGG_SIG_UNSAFE,
|
|
74
74
|
ConditionOpcode.AGG_SIG_ME,
|
|
75
|
-
|
|
75
|
+
}:
|
|
76
76
|
cost += ConditionCost.AGG_SIG.value
|
|
77
77
|
continue
|
|
78
78
|
if op != ConditionOpcode.CREATE_COIN.value:
|
|
@@ -85,7 +85,7 @@ def compute_additions_with_cost(
|
|
|
85
85
|
return ret, cost
|
|
86
86
|
|
|
87
87
|
|
|
88
|
-
def compute_additions(cs: CoinSpend, *, max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM) ->
|
|
88
|
+
def compute_additions(cs: CoinSpend, *, max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM) -> list[Coin]:
|
|
89
89
|
return compute_additions_with_cost(cs, max_cost=max_cost)[0]
|
|
90
90
|
|
|
91
91
|
|
|
@@ -99,10 +99,10 @@ class SpendInfo(Streamable):
|
|
|
99
99
|
@dataclass(frozen=True)
|
|
100
100
|
class CoinSpendWithConditions:
|
|
101
101
|
coin_spend: CoinSpend
|
|
102
|
-
conditions:
|
|
102
|
+
conditions: list[ConditionWithArgs]
|
|
103
103
|
|
|
104
104
|
@staticmethod
|
|
105
|
-
def from_json_dict(dict:
|
|
105
|
+
def from_json_dict(dict: dict[str, Any]) -> CoinSpendWithConditions:
|
|
106
106
|
return CoinSpendWithConditions(
|
|
107
107
|
CoinSpend.from_json_dict(dict["coin_spend"]),
|
|
108
108
|
[
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
7
6
|
|
|
@@ -14,4 +13,4 @@ class ConditionWithArgs:
|
|
|
14
13
|
"""
|
|
15
14
|
|
|
16
15
|
opcode: ConditionOpcode
|
|
17
|
-
vars:
|
|
16
|
+
vars: list[bytes]
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
|
-
from
|
|
4
|
+
from collections.abc import Awaitable
|
|
5
|
+
from typing import Callable, Optional
|
|
5
6
|
|
|
6
7
|
from chia_rs import fast_forward_singleton, get_conditions_from_spendbundle
|
|
7
8
|
|
|
@@ -21,7 +22,7 @@ from chia.util.ints import uint32, uint64
|
|
|
21
22
|
@dataclasses.dataclass(frozen=True)
|
|
22
23
|
class EligibilityAndAdditions:
|
|
23
24
|
is_eligible_for_dedup: bool
|
|
24
|
-
spend_additions:
|
|
25
|
+
spend_additions: list[Coin]
|
|
25
26
|
is_eligible_for_ff: bool
|
|
26
27
|
|
|
27
28
|
|
|
@@ -50,7 +51,7 @@ class UnspentLineageInfo:
|
|
|
50
51
|
|
|
51
52
|
|
|
52
53
|
def set_next_singleton_version(
|
|
53
|
-
current_singleton: Coin, singleton_additions:
|
|
54
|
+
current_singleton: Coin, singleton_additions: list[Coin], fast_forward_spends: dict[bytes32, UnspentLineageInfo]
|
|
54
55
|
) -> None:
|
|
55
56
|
"""
|
|
56
57
|
Finds the next version of the singleton among its additions and updates the
|
|
@@ -83,8 +84,8 @@ def set_next_singleton_version(
|
|
|
83
84
|
def perform_the_fast_forward(
|
|
84
85
|
unspent_lineage_info: UnspentLineageInfo,
|
|
85
86
|
spend_data: BundleCoinSpend,
|
|
86
|
-
fast_forward_spends:
|
|
87
|
-
) ->
|
|
87
|
+
fast_forward_spends: dict[bytes32, UnspentLineageInfo],
|
|
88
|
+
) -> tuple[CoinSpend, list[Coin]]:
|
|
88
89
|
"""
|
|
89
90
|
Performs a singleton fast forward, including the updating of all previous
|
|
90
91
|
additions to point to the most recent version, and updates the fast forward
|
|
@@ -97,7 +98,7 @@ def perform_the_fast_forward(
|
|
|
97
98
|
|
|
98
99
|
Returns:
|
|
99
100
|
CoinSpend: the new coin spend after performing the fast forward
|
|
100
|
-
|
|
101
|
+
list[Coin]: the updated additions that point to the new coin to spend
|
|
101
102
|
|
|
102
103
|
Raises:
|
|
103
104
|
ValueError if none of the additions are considered to be the singleton's
|
|
@@ -141,12 +142,12 @@ def perform_the_fast_forward(
|
|
|
141
142
|
|
|
142
143
|
@dataclasses.dataclass(frozen=True)
|
|
143
144
|
class EligibleCoinSpends:
|
|
144
|
-
deduplication_spends:
|
|
145
|
-
fast_forward_spends:
|
|
145
|
+
deduplication_spends: dict[bytes32, DedupCoinSpend] = dataclasses.field(default_factory=dict)
|
|
146
|
+
fast_forward_spends: dict[bytes32, UnspentLineageInfo] = dataclasses.field(default_factory=dict)
|
|
146
147
|
|
|
147
148
|
def get_deduplication_info(
|
|
148
|
-
self, *, bundle_coin_spends:
|
|
149
|
-
) ->
|
|
149
|
+
self, *, bundle_coin_spends: dict[bytes32, BundleCoinSpend], max_cost: int
|
|
150
|
+
) -> tuple[list[CoinSpend], uint64, list[Coin]]:
|
|
150
151
|
"""
|
|
151
152
|
Checks all coin spends of a mempool item for deduplication eligibility and
|
|
152
153
|
provides the caller with the necessary information that allows it to perform
|
|
@@ -157,9 +158,9 @@ class EligibleCoinSpends:
|
|
|
157
158
|
max_cost: the maximum limit when running for cost
|
|
158
159
|
|
|
159
160
|
Returns:
|
|
160
|
-
|
|
161
|
+
list[CoinSpend]: list of unique coin spends in this mempool item
|
|
161
162
|
uint64: the cost we're saving by deduplicating eligible coins
|
|
162
|
-
|
|
163
|
+
list[Coin]: list of unique additions in this mempool item
|
|
163
164
|
|
|
164
165
|
Raises:
|
|
165
166
|
ValueError to skip the mempool item we're currently in, if it's
|
|
@@ -167,10 +168,10 @@ class EligibleCoinSpends:
|
|
|
167
168
|
one we're already deduplicating on.
|
|
168
169
|
"""
|
|
169
170
|
cost_saving = 0
|
|
170
|
-
unique_coin_spends:
|
|
171
|
-
unique_additions:
|
|
171
|
+
unique_coin_spends: list[CoinSpend] = []
|
|
172
|
+
unique_additions: list[Coin] = []
|
|
172
173
|
# Map of coin ID to deduplication information
|
|
173
|
-
new_dedup_spends:
|
|
174
|
+
new_dedup_spends: dict[bytes32, DedupCoinSpend] = {}
|
|
174
175
|
# See if this item has coin spends that are eligible for deduplication
|
|
175
176
|
for coin_id, spend_data in bundle_coin_spends.items():
|
|
176
177
|
if not spend_data.eligible_for_dedup:
|
chia/types/generator_types.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
7
6
|
from chia.util.streamable import Streamable, streamable
|
|
@@ -11,4 +10,4 @@ from chia.util.streamable import Streamable, streamable
|
|
|
11
10
|
@dataclass(frozen=True)
|
|
12
11
|
class BlockGenerator(Streamable):
|
|
13
12
|
program: SerializedProgram
|
|
14
|
-
generator_refs:
|
|
13
|
+
generator_refs: list[bytes]
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Dict
|
|
5
4
|
|
|
6
5
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
6
|
from chia.types.mempool_item import BundleCoinSpend
|
|
@@ -16,4 +15,4 @@ class InternalMempoolItem:
|
|
|
16
15
|
conds: SpendBundleConditions
|
|
17
16
|
height_added_to_mempool: uint32
|
|
18
17
|
# Map of coin ID to coin spend data between the bundle and its NPCResult
|
|
19
|
-
bundle_coin_spends:
|
|
18
|
+
bundle_coin_spends: dict[bytes32, BundleCoinSpend]
|
chia/types/mempool_item.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.coin import Coin
|
|
7
7
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -17,7 +17,7 @@ class BundleCoinSpend:
|
|
|
17
17
|
coin_spend: CoinSpend
|
|
18
18
|
eligible_for_dedup: bool
|
|
19
19
|
eligible_for_fast_forward: bool
|
|
20
|
-
additions:
|
|
20
|
+
additions: list[Coin]
|
|
21
21
|
# cost on the specific solution in this item
|
|
22
22
|
cost: Optional[uint64] = None
|
|
23
23
|
|
|
@@ -40,7 +40,7 @@ class MempoolItem:
|
|
|
40
40
|
|
|
41
41
|
# Map of coin ID to coin spend data between the bundle and its
|
|
42
42
|
# SpendBundleConditions
|
|
43
|
-
bundle_coin_spends:
|
|
43
|
+
bundle_coin_spends: dict[bytes32, BundleCoinSpend] = field(default_factory=dict)
|
|
44
44
|
|
|
45
45
|
def __lt__(self, other: MempoolItem) -> bool:
|
|
46
46
|
return self.fee_per_cost < other.fee_per_cost
|
|
@@ -61,8 +61,8 @@ class MempoolItem:
|
|
|
61
61
|
return uint64(0 if self.conds is None else self.conds.cost)
|
|
62
62
|
|
|
63
63
|
@property
|
|
64
|
-
def additions(self) ->
|
|
65
|
-
additions:
|
|
64
|
+
def additions(self) -> list[Coin]:
|
|
65
|
+
additions: list[Coin] = []
|
|
66
66
|
for spend in self.conds.spends:
|
|
67
67
|
for puzzle_hash, amount, _ in spend.create_coin:
|
|
68
68
|
coin = Coin(spend.coin_id, puzzle_hash, uint64(amount))
|
|
@@ -70,10 +70,10 @@ class MempoolItem:
|
|
|
70
70
|
return additions
|
|
71
71
|
|
|
72
72
|
@property
|
|
73
|
-
def removals(self) ->
|
|
73
|
+
def removals(self) -> list[Coin]:
|
|
74
74
|
return self.spend_bundle.removals()
|
|
75
75
|
|
|
76
|
-
def to_json_dict(self) ->
|
|
76
|
+
def to_json_dict(self) -> dict[str, Any]:
|
|
77
77
|
return {
|
|
78
78
|
"spend_bundle": recurse_jsonify(self.spend_bundle),
|
|
79
79
|
"fee": recurse_jsonify(self.fee),
|
|
@@ -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, Union
|
|
5
5
|
|
|
6
6
|
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
7
7
|
from chia.util.ints import uint8
|
|
@@ -21,7 +21,7 @@ class MempoolSubmissionStatus(Streamable):
|
|
|
21
21
|
inclusion_status: uint8 # MempoolInclusionStatus
|
|
22
22
|
error_msg: Optional[str]
|
|
23
23
|
|
|
24
|
-
def to_json_dict_convenience(self) ->
|
|
24
|
+
def to_json_dict_convenience(self) -> dict[str, Union[str, MempoolInclusionStatus, Optional[str]]]:
|
|
25
25
|
formatted = self.to_json_dict()
|
|
26
26
|
formatted["inclusion_status"] = MempoolInclusionStatus(self.inclusion_status).name
|
|
27
27
|
return formatted
|
chia/types/peer_info.py
CHANGED
chia/types/spend_bundle.py
CHANGED
|
@@ -5,10 +5,9 @@ from typing import TypeVar
|
|
|
5
5
|
import chia_rs
|
|
6
6
|
|
|
7
7
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
8
|
+
from chia.types.coin_spend import compute_additions_with_cost
|
|
8
9
|
from chia.util.errors import Err, ValidationError
|
|
9
10
|
|
|
10
|
-
from .coin_spend import compute_additions_with_cost
|
|
11
|
-
|
|
12
11
|
SpendBundle = chia_rs.SpendBundle
|
|
13
12
|
T_SpendBundle = TypeVar("T_SpendBundle", bound="SpendBundle")
|
|
14
13
|
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import dataclasses
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
|
-
from typing import ClassVar, Generic, Optional,
|
|
6
|
+
from typing import ClassVar, Generic, Optional, TypeVar, Union
|
|
7
7
|
|
|
8
8
|
from chia.server.ws_connection import WSChiaConnection
|
|
9
9
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -49,7 +49,7 @@ class TransactionQueueEntry:
|
|
|
49
49
|
spend_name: bytes32
|
|
50
50
|
peer: Optional[WSChiaConnection] = field(compare=False)
|
|
51
51
|
test: bool = field(compare=False)
|
|
52
|
-
done: ValuedEvent[
|
|
52
|
+
done: ValuedEvent[tuple[MempoolInclusionStatus, Optional[Err]]] = field(
|
|
53
53
|
default_factory=ValuedEvent,
|
|
54
54
|
compare=False,
|
|
55
55
|
)
|
|
@@ -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.types.blockchain_format.foliage import Foliage, FoliageTransactionBlock
|
|
7
7
|
from chia.types.blockchain_format.reward_chain_block import RewardChainBlockUnfinished
|
|
@@ -16,7 +16,7 @@ from chia.util.streamable import Streamable, streamable
|
|
|
16
16
|
@dataclass(frozen=True)
|
|
17
17
|
class UnfinishedHeaderBlock(Streamable):
|
|
18
18
|
# Same as a FullBlock but without TransactionInfo and Generator, used by light clients
|
|
19
|
-
finished_sub_slots:
|
|
19
|
+
finished_sub_slots: list[EndOfSubSlotBundle] # If first sb
|
|
20
20
|
reward_chain_block: RewardChainBlockUnfinished # Reward chain trunk data
|
|
21
21
|
challenge_chain_sp_proof: Optional[VDFProof] # If not first sp in sub-slot
|
|
22
22
|
reward_chain_sp_proof: Optional[VDFProof] # If not first sp in sub-slot
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
from chia.consensus.block_record import BlockRecord
|
|
7
|
+
from chia.util.ints import uint64
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclasses.dataclass
|
|
11
|
+
class ValidationState:
|
|
12
|
+
ssi: uint64
|
|
13
|
+
difficulty: uint64
|
|
14
|
+
prev_ses_block: Optional[BlockRecord] = None
|
chia/types/weight_proof.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
import chia_rs
|
|
7
6
|
|
|
@@ -32,19 +31,19 @@ SubSlotData = chia_rs.SubSlotData
|
|
|
32
31
|
@dataclass(frozen=True)
|
|
33
32
|
# this is used only for serialization to database
|
|
34
33
|
class RecentChainData(Streamable):
|
|
35
|
-
recent_chain_data:
|
|
34
|
+
recent_chain_data: list[HeaderBlock]
|
|
36
35
|
|
|
37
36
|
|
|
38
37
|
@streamable
|
|
39
38
|
@dataclass(frozen=True)
|
|
40
39
|
class ProofBlockHeader(Streamable):
|
|
41
|
-
finished_sub_slots:
|
|
40
|
+
finished_sub_slots: list[EndOfSubSlotBundle]
|
|
42
41
|
reward_chain_block: RewardChainBlock
|
|
43
42
|
|
|
44
43
|
|
|
45
44
|
@streamable
|
|
46
45
|
@dataclass(frozen=True)
|
|
47
46
|
class WeightProof(Streamable):
|
|
48
|
-
sub_epochs:
|
|
49
|
-
sub_epoch_segments:
|
|
50
|
-
recent_chain_data:
|
|
47
|
+
sub_epochs: list[SubEpochData]
|
|
48
|
+
sub_epoch_segments: list[SubEpochChallengeSegment] # sampled sub epoch
|
|
49
|
+
recent_chain_data: list[HeaderBlock]
|
chia/util/action_scope.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
+
from collections.abc import AsyncIterator, Awaitable
|
|
4
5
|
from dataclasses import dataclass, field
|
|
5
|
-
from typing import
|
|
6
|
+
from typing import Callable, Generic, Optional, Protocol, TypeVar, final
|
|
6
7
|
|
|
7
8
|
import aiosqlite
|
|
8
9
|
|
|
@@ -21,14 +22,13 @@ class ResourceManager(Protocol):
|
|
|
21
22
|
# yield included to make this a generator as expected by @contextlib.asynccontextmanager
|
|
22
23
|
yield
|
|
23
24
|
|
|
24
|
-
async def get_resource(self, resource_type:
|
|
25
|
+
async def get_resource(self, resource_type: type[_T_SideEffects]) -> _T_SideEffects: ...
|
|
25
26
|
|
|
26
27
|
async def save_resource(self, resource: SideEffects) -> None: ...
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
@dataclass
|
|
30
31
|
class SQLiteResourceManager:
|
|
31
|
-
|
|
32
32
|
_db: DBWrapper2
|
|
33
33
|
_active_writer: Optional[aiosqlite.Connection] = field(init=False, default=None)
|
|
34
34
|
|
|
@@ -62,7 +62,7 @@ class SQLiteResourceManager:
|
|
|
62
62
|
finally:
|
|
63
63
|
self._active_writer = None
|
|
64
64
|
|
|
65
|
-
async def get_resource(self, resource_type:
|
|
65
|
+
async def get_resource(self, resource_type: type[_T_SideEffects]) -> _T_SideEffects:
|
|
66
66
|
row = await execute_fetchone(self.get_active_writer(), "SELECT total FROM side_effects")
|
|
67
67
|
assert row is not None
|
|
68
68
|
side_effects = resource_type.from_bytes(row[0])
|
|
@@ -80,7 +80,7 @@ class SideEffects(Protocol):
|
|
|
80
80
|
def __bytes__(self) -> bytes: ...
|
|
81
81
|
|
|
82
82
|
@classmethod
|
|
83
|
-
def from_bytes(cls:
|
|
83
|
+
def from_bytes(cls: type[_T_SideEffects], blob: bytes) -> _T_SideEffects: ...
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
_T_SideEffects = TypeVar("_T_SideEffects", bound=SideEffects)
|
|
@@ -100,7 +100,7 @@ class ActionScope(Generic[_T_SideEffects, _T_Config]):
|
|
|
100
100
|
"""
|
|
101
101
|
|
|
102
102
|
_resource_manager: ResourceManager
|
|
103
|
-
_side_effects_format:
|
|
103
|
+
_side_effects_format: type[_T_SideEffects]
|
|
104
104
|
_config: _T_Config # An object not intended to be mutated during the lifetime of the scope
|
|
105
105
|
_callback: Optional[Callable[[StateInterface[_T_SideEffects]], Awaitable[None]]] = None
|
|
106
106
|
_final_side_effects: Optional[_T_SideEffects] = field(init=False, default=None)
|
|
@@ -123,11 +123,11 @@ class ActionScope(Generic[_T_SideEffects, _T_Config]):
|
|
|
123
123
|
@contextlib.asynccontextmanager
|
|
124
124
|
async def new_scope(
|
|
125
125
|
cls,
|
|
126
|
-
side_effects_format:
|
|
126
|
+
side_effects_format: type[_T_SideEffects],
|
|
127
127
|
# I want a default here in case a use case doesn't want to take advantage of the config but no default seems to
|
|
128
128
|
# satisfy the type hint _T_Config so we'll just ignore this.
|
|
129
129
|
config: _T_Config = object(), # type: ignore[assignment]
|
|
130
|
-
resource_manager_backend:
|
|
130
|
+
resource_manager_backend: type[ResourceManager] = SQLiteResourceManager,
|
|
131
131
|
) -> AsyncIterator[ActionScope[_T_SideEffects, _T_Config]]:
|
|
132
132
|
async with resource_manager_backend.managed(side_effects_format()) as resource_manager:
|
|
133
133
|
self = cls(_resource_manager=resource_manager, _side_effects_format=side_effects_format, _config=config)
|
chia/util/async_pool.py
CHANGED
|
@@ -6,11 +6,13 @@ import dataclasses
|
|
|
6
6
|
import itertools
|
|
7
7
|
import logging
|
|
8
8
|
import traceback
|
|
9
|
-
from
|
|
9
|
+
from collections.abc import AsyncIterator, Iterator
|
|
10
|
+
from typing import Generic, Optional, Protocol, TypeVar, final
|
|
10
11
|
|
|
11
12
|
import anyio
|
|
12
13
|
|
|
13
14
|
from chia.util.log_exceptions import log_exceptions
|
|
15
|
+
from chia.util.task_referencer import create_referenced_task
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
class InvalidTargetWorkerCountError(Exception):
|
|
@@ -128,7 +130,7 @@ class AsyncPool:
|
|
|
128
130
|
log: logging.Logger
|
|
129
131
|
worker_async_callable: WorkerCallable
|
|
130
132
|
_target_worker_count: int
|
|
131
|
-
_workers:
|
|
133
|
+
_workers: dict[asyncio.Task[object], int] = dataclasses.field(init=False, default_factory=dict)
|
|
132
134
|
_worker_id_counter: Iterator[int] = dataclasses.field(init=False, default_factory=itertools.count)
|
|
133
135
|
_started: asyncio.Event = dataclasses.field(default_factory=asyncio.Event)
|
|
134
136
|
_single_use_used: bool = False
|
|
@@ -152,7 +154,7 @@ class AsyncPool:
|
|
|
152
154
|
if self._target_worker_count < 1:
|
|
153
155
|
raise InvalidTargetWorkerCountError(self._target_worker_count)
|
|
154
156
|
|
|
155
|
-
task =
|
|
157
|
+
task = create_referenced_task(self._run(_check_single_use=False))
|
|
156
158
|
try:
|
|
157
159
|
# TODO: should this terminate if the run task ends?
|
|
158
160
|
await self._started.wait()
|
|
@@ -186,7 +188,7 @@ class AsyncPool:
|
|
|
186
188
|
async def _run_single(self) -> None:
|
|
187
189
|
while len(self._workers) < self._target_worker_count:
|
|
188
190
|
new_worker_id = next(self._worker_id_counter)
|
|
189
|
-
new_worker =
|
|
191
|
+
new_worker = create_referenced_task(self.worker_async_callable(new_worker_id))
|
|
190
192
|
self.log.debug(f"{self.name}: adding worker {new_worker_id}")
|
|
191
193
|
self._workers[new_worker] = new_worker_id
|
|
192
194
|
|
chia/util/augmented_chain.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING, ClassVar,
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar, Optional, cast
|
|
4
4
|
|
|
5
5
|
from chia.consensus.block_record import BlockRecord
|
|
6
6
|
from chia.consensus.blockchain_interface import BlocksProtocol
|
|
@@ -26,8 +26,8 @@ class AugmentedBlockchain:
|
|
|
26
26
|
_protocol_check: ClassVar[BlocksProtocol] = cast("AugmentedBlockchain", None)
|
|
27
27
|
|
|
28
28
|
_underlying: BlocksProtocol
|
|
29
|
-
_extra_blocks:
|
|
30
|
-
_height_to_hash:
|
|
29
|
+
_extra_blocks: dict[bytes32, tuple[FullBlock, BlockRecord]]
|
|
30
|
+
_height_to_hash: dict[uint32, bytes32]
|
|
31
31
|
|
|
32
32
|
def __init__(self, underlying: BlocksProtocol) -> None:
|
|
33
33
|
self._underlying = underlying
|
|
@@ -45,15 +45,19 @@ class AugmentedBlockchain:
|
|
|
45
45
|
self._extra_blocks[block_record.header_hash] = (block, block_record)
|
|
46
46
|
self._height_to_hash[block_record.height] = block_record.header_hash
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
def remove_extra_block(self, hh: bytes32) -> None:
|
|
49
|
+
if hh in self._extra_blocks:
|
|
50
|
+
block_record = self._extra_blocks.pop(hh)[1]
|
|
51
|
+
del self._height_to_hash[block_record.height]
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
# BlocksProtocol
|
|
54
|
+
async def lookup_block_generators(self, header_hash: bytes32, generator_refs: set[uint32]) -> dict[uint32, bytes]:
|
|
55
|
+
generators: dict[uint32, bytes] = {}
|
|
52
56
|
|
|
53
57
|
# traverse the additional blocks (if any) and resolve heights into
|
|
54
58
|
# generators
|
|
55
59
|
to_remove = []
|
|
56
|
-
curr: Optional[
|
|
60
|
+
curr: Optional[tuple[FullBlock, BlockRecord]] = self._extra_blocks.get(header_hash)
|
|
57
61
|
while curr is not None:
|
|
58
62
|
b = curr[0]
|
|
59
63
|
if b.height in generator_refs:
|
|
@@ -119,8 +123,8 @@ class AugmentedBlockchain:
|
|
|
119
123
|
def contains_height(self, height: uint32) -> bool:
|
|
120
124
|
return (height in self._height_to_hash) or self._underlying.contains_height(height)
|
|
121
125
|
|
|
122
|
-
async def prev_block_hash(self, header_hashes:
|
|
123
|
-
ret:
|
|
126
|
+
async def prev_block_hash(self, header_hashes: list[bytes32]) -> list[bytes32]:
|
|
127
|
+
ret: list[bytes32] = []
|
|
124
128
|
for hh in header_hashes:
|
|
125
129
|
b = self._extra_blocks.get(hh)
|
|
126
130
|
if b is not None:
|
chia/util/batches.py
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
5
|
+
from collections.abc import Collection, Iterator
|
|
3
6
|
from dataclasses import dataclass
|
|
4
|
-
from typing import
|
|
7
|
+
from typing import Generic, TypeVar
|
|
5
8
|
|
|
6
9
|
T = TypeVar("T")
|
|
7
10
|
|
|
@@ -9,7 +12,7 @@ T = TypeVar("T")
|
|
|
9
12
|
@dataclass(frozen=True)
|
|
10
13
|
class Batch(Generic[T]):
|
|
11
14
|
remaining: int
|
|
12
|
-
entries:
|
|
15
|
+
entries: list[T]
|
|
13
16
|
|
|
14
17
|
|
|
15
18
|
def to_batches(to_split: Collection[T], batch_size: int) -> Iterator[Batch[T]]:
|
chia/util/bech32m.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
# Copyright (c) 2017 Pieter Wuille
|
|
2
4
|
#
|
|
3
5
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
@@ -20,9 +22,10 @@
|
|
|
20
22
|
|
|
21
23
|
from __future__ import annotations
|
|
22
24
|
|
|
23
|
-
from
|
|
25
|
+
from collections.abc import Iterable
|
|
26
|
+
from typing import Optional
|
|
24
27
|
|
|
25
|
-
from
|
|
28
|
+
from chia_rs.sized_bytes import bytes32
|
|
26
29
|
|
|
27
30
|
# Based on this specification from Pieter Wuille:
|
|
28
31
|
# https://github.com/sipa/bips/blob/bip-bech32m/bip-bech32m.mediawiki
|
|
@@ -32,7 +35,7 @@ from chia.types.blockchain_format.sized_bytes import bytes32
|
|
|
32
35
|
CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
|
|
33
36
|
|
|
34
37
|
|
|
35
|
-
def bech32_polymod(values:
|
|
38
|
+
def bech32_polymod(values: list[int]) -> int:
|
|
36
39
|
"""Internal function that computes the Bech32 checksum."""
|
|
37
40
|
generator = [0x3B6A57B2, 0x26508E6D, 0x1EA119FA, 0x3D4233DD, 0x2A1462B3]
|
|
38
41
|
chk = 1
|
|
@@ -44,7 +47,7 @@ def bech32_polymod(values: List[int]) -> int:
|
|
|
44
47
|
return chk
|
|
45
48
|
|
|
46
49
|
|
|
47
|
-
def bech32_hrp_expand(hrp: str) ->
|
|
50
|
+
def bech32_hrp_expand(hrp: str) -> list[int]:
|
|
48
51
|
"""Expand the HRP into values for checksum computation."""
|
|
49
52
|
return [ord(x) >> 5 for x in hrp] + [0] + [ord(x) & 31 for x in hrp]
|
|
50
53
|
|
|
@@ -52,23 +55,23 @@ def bech32_hrp_expand(hrp: str) -> List[int]:
|
|
|
52
55
|
M = 0x2BC830A3
|
|
53
56
|
|
|
54
57
|
|
|
55
|
-
def bech32_verify_checksum(hrp: str, data:
|
|
58
|
+
def bech32_verify_checksum(hrp: str, data: list[int]) -> bool:
|
|
56
59
|
return bech32_polymod(bech32_hrp_expand(hrp) + data) == M
|
|
57
60
|
|
|
58
61
|
|
|
59
|
-
def bech32_create_checksum(hrp: str, data:
|
|
62
|
+
def bech32_create_checksum(hrp: str, data: list[int]) -> list[int]:
|
|
60
63
|
values = bech32_hrp_expand(hrp) + data
|
|
61
|
-
polymod = bech32_polymod(values
|
|
64
|
+
polymod = bech32_polymod([*values, 0, 0, 0, 0, 0, 0]) ^ M
|
|
62
65
|
return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]
|
|
63
66
|
|
|
64
67
|
|
|
65
|
-
def bech32_encode(hrp: str, data:
|
|
68
|
+
def bech32_encode(hrp: str, data: list[int]) -> str:
|
|
66
69
|
"""Compute a Bech32 string given HRP and data values."""
|
|
67
70
|
combined = data + bech32_create_checksum(hrp, data)
|
|
68
71
|
return hrp + "1" + "".join([CHARSET[d] for d in combined])
|
|
69
72
|
|
|
70
73
|
|
|
71
|
-
def bech32_decode(bech: str, max_length: int = 90) ->
|
|
74
|
+
def bech32_decode(bech: str, max_length: int = 90) -> tuple[Optional[str], Optional[list[int]]]:
|
|
72
75
|
"""Validate a Bech32 string, and determine HRP and data."""
|
|
73
76
|
bech = bech.strip()
|
|
74
77
|
if (any(ord(x) < 33 or ord(x) > 126 for x in bech)) or (bech.lower() != bech and bech.upper() != bech):
|
|
@@ -86,7 +89,7 @@ def bech32_decode(bech: str, max_length: int = 90) -> Tuple[Optional[str], Optio
|
|
|
86
89
|
return hrp, data[:-6]
|
|
87
90
|
|
|
88
91
|
|
|
89
|
-
def convertbits(data: Iterable[int], frombits: int, tobits: int, pad: bool = True) ->
|
|
92
|
+
def convertbits(data: Iterable[int], frombits: int, tobits: int, pad: bool = True) -> list[int]:
|
|
90
93
|
"""General power-of-2 base conversion."""
|
|
91
94
|
acc = 0
|
|
92
95
|
bits = 0
|
|
@@ -115,7 +118,7 @@ def encode_puzzle_hash(puzzle_hash: bytes32, prefix: str) -> str:
|
|
|
115
118
|
|
|
116
119
|
|
|
117
120
|
def decode_puzzle_hash(address: str) -> bytes32:
|
|
118
|
-
|
|
121
|
+
_hrpgot, data = bech32_decode(address)
|
|
119
122
|
if data is None:
|
|
120
123
|
raise ValueError("Invalid Address")
|
|
121
124
|
decoded = convertbits(data, 5, 8, False)
|