chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +59 -30
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +225 -62
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +963 -839
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +8 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +14 -14
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +372 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- 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/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +16 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +42 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +34 -13
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +3 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +22 -8
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +120 -105
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/plotting/prover.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from dataclasses import dataclass
|
|
3
4
|
from enum import IntEnum
|
|
4
5
|
from typing import TYPE_CHECKING, ClassVar, Protocol, cast
|
|
5
6
|
|
|
6
|
-
from chia_rs import
|
|
7
|
+
from chia_rs import PartialProof, PlotParam, Prover, QualityProof
|
|
7
8
|
from chia_rs.sized_bytes import bytes32
|
|
8
9
|
from chia_rs.sized_ints import uint8
|
|
9
10
|
from chiapos import DiskProver
|
|
@@ -19,46 +20,65 @@ class PlotVersion(IntEnum):
|
|
|
19
20
|
V2 = 2
|
|
20
21
|
|
|
21
22
|
|
|
23
|
+
class QualityProtocol(Protocol):
|
|
24
|
+
def get_string(self) -> bytes32: ...
|
|
25
|
+
|
|
26
|
+
|
|
22
27
|
class ProverProtocol(Protocol):
|
|
23
28
|
def get_filename(self) -> str: ...
|
|
24
|
-
def
|
|
29
|
+
def get_param(self) -> PlotParam: ...
|
|
30
|
+
def get_strength(self) -> uint8: ...
|
|
25
31
|
def get_memo(self) -> bytes: ...
|
|
26
32
|
def get_compression_level(self) -> uint8: ...
|
|
27
33
|
def get_version(self) -> PlotVersion: ...
|
|
28
34
|
def __bytes__(self) -> bytes: ...
|
|
29
35
|
def get_id(self) -> bytes32: ...
|
|
30
|
-
def get_qualities_for_challenge(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def get_partial_proofs_for_challenge(self, challenge: bytes32, required_plot_strength: uint8) -> list[bytes]: ...
|
|
34
|
-
|
|
35
|
-
# this is only supported by v1 plots. v2 plots first get the partial proof
|
|
36
|
-
# and turn it into a full proof by calling solve_proof(), or pass it to the solver service
|
|
37
|
-
def get_full_proof(self, challenge: bytes32, index: int, parallel_read: bool = True) -> bytes: ...
|
|
36
|
+
def get_qualities_for_challenge(
|
|
37
|
+
self, challenge: bytes32, proof_fragment_filter: uint8
|
|
38
|
+
) -> list[QualityProtocol]: ...
|
|
38
39
|
|
|
39
40
|
@classmethod
|
|
40
41
|
def from_bytes(cls, data: bytes) -> ProverProtocol: ...
|
|
41
42
|
|
|
42
43
|
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class V2Quality(QualityProtocol):
|
|
46
|
+
_quality_proof: QualityProof
|
|
47
|
+
|
|
48
|
+
def get_string(self) -> bytes32:
|
|
49
|
+
return self._quality_proof.serialize()
|
|
50
|
+
|
|
51
|
+
|
|
43
52
|
class V2Prover:
|
|
44
53
|
"""Placeholder for future V2 plot format support"""
|
|
45
54
|
|
|
55
|
+
_prover: Prover
|
|
56
|
+
|
|
46
57
|
if TYPE_CHECKING:
|
|
47
58
|
_protocol_check: ClassVar[ProverProtocol] = cast("V2Prover", None)
|
|
48
59
|
|
|
49
|
-
|
|
50
|
-
|
|
60
|
+
@classmethod
|
|
61
|
+
def from_filename(cls, path: str) -> V2Prover:
|
|
62
|
+
return V2Prover(Prover(path))
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def from_bytes(cls, data: bytes) -> V2Prover:
|
|
66
|
+
return V2Prover(Prover.from_bytes(data))
|
|
67
|
+
|
|
68
|
+
def __init__(self, prover: Prover):
|
|
69
|
+
self._prover = prover
|
|
51
70
|
|
|
52
71
|
def get_filename(self) -> str:
|
|
53
|
-
return
|
|
72
|
+
return self._prover.get_filename()
|
|
54
73
|
|
|
55
|
-
def
|
|
56
|
-
|
|
57
|
-
|
|
74
|
+
def get_param(self) -> PlotParam:
|
|
75
|
+
return PlotParam.make_v2(self._prover.get_strength())
|
|
76
|
+
|
|
77
|
+
def get_strength(self) -> uint8:
|
|
78
|
+
return uint8(self._prover.get_strength())
|
|
58
79
|
|
|
59
80
|
def get_memo(self) -> bytes:
|
|
60
|
-
|
|
61
|
-
raise NotImplementedError("V2 plot format is not yet implemented")
|
|
81
|
+
return self._prover.get_memo()
|
|
62
82
|
|
|
63
83
|
def get_compression_level(self) -> uint8:
|
|
64
84
|
# v2 plots are never compressed
|
|
@@ -68,27 +88,24 @@ class V2Prover:
|
|
|
68
88
|
return PlotVersion.V2
|
|
69
89
|
|
|
70
90
|
def __bytes__(self) -> bytes:
|
|
71
|
-
|
|
72
|
-
raise NotImplementedError("V2 plot format is not yet implemented")
|
|
91
|
+
return self._prover.to_bytes()
|
|
73
92
|
|
|
74
93
|
def get_id(self) -> bytes32:
|
|
75
|
-
|
|
76
|
-
raise NotImplementedError("V2 plot format is not yet implemented")
|
|
94
|
+
return self._prover.plot_id()
|
|
77
95
|
|
|
78
|
-
def get_qualities_for_challenge(self, challenge: bytes32) -> list[
|
|
79
|
-
|
|
96
|
+
def get_qualities_for_challenge(self, challenge: bytes32, proof_fragment_filter: uint8) -> list[QualityProtocol]:
|
|
97
|
+
return [V2Quality(q) for q in self._prover.get_qualities_for_challenge(challenge, proof_fragment_filter)]
|
|
80
98
|
|
|
81
|
-
def
|
|
82
|
-
|
|
83
|
-
raise NotImplementedError("V2 plot format is not yet implemented")
|
|
99
|
+
def get_partial_proof(self, quality: V2Quality) -> PartialProof:
|
|
100
|
+
return self._prover.get_partial_proof(quality._quality_proof)[0]
|
|
84
101
|
|
|
85
|
-
def get_full_proof(self, challenge: bytes32, index: int, parallel_read: bool = True) -> bytes:
|
|
86
|
-
raise AssertionError("V2 plot format require solver to get full proof")
|
|
87
102
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
103
|
+
@dataclass(frozen=True)
|
|
104
|
+
class V1Quality(QualityProtocol):
|
|
105
|
+
_quality: bytes32
|
|
106
|
+
|
|
107
|
+
def get_string(self) -> bytes32:
|
|
108
|
+
return self._quality
|
|
92
109
|
|
|
93
110
|
|
|
94
111
|
class V1Prover:
|
|
@@ -103,8 +120,11 @@ class V1Prover:
|
|
|
103
120
|
def get_filename(self) -> str:
|
|
104
121
|
return str(self._disk_prover.get_filename())
|
|
105
122
|
|
|
106
|
-
def
|
|
107
|
-
return
|
|
123
|
+
def get_param(self) -> PlotParam:
|
|
124
|
+
return PlotParam.make_v1(uint8(self._disk_prover.get_size()))
|
|
125
|
+
|
|
126
|
+
def get_strength(self) -> uint8:
|
|
127
|
+
raise AssertionError("V1 plot format doesn't use strength")
|
|
108
128
|
|
|
109
129
|
def get_memo(self) -> bytes:
|
|
110
130
|
return bytes(self._disk_prover.get_memo())
|
|
@@ -121,11 +141,8 @@ class V1Prover:
|
|
|
121
141
|
def get_id(self) -> bytes32:
|
|
122
142
|
return bytes32(self._disk_prover.get_id())
|
|
123
143
|
|
|
124
|
-
def get_qualities_for_challenge(self, challenge: bytes32) -> list[
|
|
125
|
-
return [bytes32(quality) for quality in self._disk_prover.get_qualities_for_challenge(challenge)]
|
|
126
|
-
|
|
127
|
-
def get_partial_proofs_for_challenge(self, challenge: bytes32, required_plot_strength: uint8) -> list[bytes]:
|
|
128
|
-
raise AssertionError("V1 plot format doesn't use partial proofs")
|
|
144
|
+
def get_qualities_for_challenge(self, challenge: bytes32, proof_fragment_filter: uint8) -> list[QualityProtocol]:
|
|
145
|
+
return [V1Quality(bytes32(quality)) for quality in self._disk_prover.get_qualities_for_challenge(challenge)]
|
|
129
146
|
|
|
130
147
|
def get_full_proof(self, challenge: bytes32, index: int, parallel_read: bool = True) -> bytes:
|
|
131
148
|
return bytes(self._disk_prover.get_full_proof(challenge, index, parallel_read))
|
|
@@ -137,7 +154,7 @@ class V1Prover:
|
|
|
137
154
|
|
|
138
155
|
def get_prover_from_bytes(filename: str, prover_data: bytes) -> ProverProtocol:
|
|
139
156
|
if filename.endswith(".plot2"):
|
|
140
|
-
return V2Prover.from_bytes(prover_data)
|
|
157
|
+
return V2Prover(Prover.from_bytes(prover_data))
|
|
141
158
|
elif filename.endswith(".plot"):
|
|
142
159
|
return V1Prover(DiskProver.from_bytes(prover_data))
|
|
143
160
|
else:
|
|
@@ -146,7 +163,7 @@ def get_prover_from_bytes(filename: str, prover_data: bytes) -> ProverProtocol:
|
|
|
146
163
|
|
|
147
164
|
def get_prover_from_file(filename: str) -> ProverProtocol:
|
|
148
165
|
if filename.endswith(".plot2"):
|
|
149
|
-
return V2Prover(filename)
|
|
166
|
+
return V2Prover(Prover(filename))
|
|
150
167
|
elif filename.endswith(".plot"):
|
|
151
168
|
return V1Prover(DiskProver(filename))
|
|
152
169
|
else:
|
chia/plotting/util.py
CHANGED
|
@@ -4,7 +4,7 @@ import logging
|
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
5
|
from enum import Enum, IntEnum
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import TYPE_CHECKING, Any
|
|
7
|
+
from typing import TYPE_CHECKING, Any
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from chia.plotting.prover import ProverProtocol
|
|
@@ -42,8 +42,8 @@ class PlotsRefreshParameter(Streamable):
|
|
|
42
42
|
@dataclass
|
|
43
43
|
class PlotInfo:
|
|
44
44
|
prover: ProverProtocol
|
|
45
|
-
pool_public_key:
|
|
46
|
-
pool_contract_puzzle_hash:
|
|
45
|
+
pool_public_key: G1Element | None
|
|
46
|
+
pool_contract_puzzle_hash: bytes32 | None
|
|
47
47
|
plot_public_key: G1Element
|
|
48
48
|
file_size: int
|
|
49
49
|
time_modified: float
|
|
@@ -88,10 +88,10 @@ class Params:
|
|
|
88
88
|
num_threads: int
|
|
89
89
|
buckets: int
|
|
90
90
|
tmp_dir: Path
|
|
91
|
-
tmp2_dir:
|
|
91
|
+
tmp2_dir: Path | None
|
|
92
92
|
final_dir: Path
|
|
93
|
-
plotid:
|
|
94
|
-
memo:
|
|
93
|
+
plotid: str | None
|
|
94
|
+
memo: str | None
|
|
95
95
|
nobitfield: bool
|
|
96
96
|
stripe_size: int = 65536
|
|
97
97
|
|
|
@@ -101,7 +101,7 @@ class HarvestingMode(IntEnum):
|
|
|
101
101
|
GPU = 2
|
|
102
102
|
|
|
103
103
|
|
|
104
|
-
def get_plot_directories(root_path: Path, config:
|
|
104
|
+
def get_plot_directories(root_path: Path, config: dict | None = None) -> list[str]:
|
|
105
105
|
if config is None:
|
|
106
106
|
config = load_config(root_path, "config.yaml")
|
|
107
107
|
return config["harvester"]["plot_directories"] or []
|
|
@@ -192,14 +192,14 @@ def get_harvester_config(root_path: Path) -> dict[str, Any]:
|
|
|
192
192
|
def update_harvester_config(
|
|
193
193
|
root_path: Path,
|
|
194
194
|
*,
|
|
195
|
-
use_gpu_harvesting:
|
|
196
|
-
gpu_index:
|
|
197
|
-
enforce_gpu_index:
|
|
198
|
-
disable_cpu_affinity:
|
|
199
|
-
parallel_decompressor_count:
|
|
200
|
-
decompressor_thread_count:
|
|
201
|
-
recursive_plot_scan:
|
|
202
|
-
refresh_parameter:
|
|
195
|
+
use_gpu_harvesting: bool | None = None,
|
|
196
|
+
gpu_index: int | None = None,
|
|
197
|
+
enforce_gpu_index: bool | None = None,
|
|
198
|
+
disable_cpu_affinity: bool | None = None,
|
|
199
|
+
parallel_decompressor_count: int | None = None,
|
|
200
|
+
decompressor_thread_count: int | None = None,
|
|
201
|
+
recursive_plot_scan: bool | None = None,
|
|
202
|
+
refresh_parameter: PlotsRefreshParameter | None = None,
|
|
203
203
|
):
|
|
204
204
|
with lock_and_load_config(root_path, "config.yaml") as config:
|
|
205
205
|
if use_gpu_harvesting is not None:
|
|
@@ -257,7 +257,7 @@ def get_filenames(directory: Path, recursive: bool, follow_links: bool) -> list[
|
|
|
257
257
|
return all_files
|
|
258
258
|
|
|
259
259
|
|
|
260
|
-
def parse_plot_info(memo: bytes) -> tuple[
|
|
260
|
+
def parse_plot_info(memo: bytes) -> tuple[G1Element | bytes32, G1Element, PrivateKey]:
|
|
261
261
|
# Parses the plot info bytes into keys
|
|
262
262
|
if len(memo) == (48 + 48 + 32):
|
|
263
263
|
# This is a public key memo
|
chia/pools/pool_config.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
+
from collections.abc import Callable
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from pathlib import Path
|
|
6
|
-
from typing import Any
|
|
7
|
+
from typing import Any
|
|
7
8
|
|
|
8
9
|
from chia_rs import G1Element
|
|
9
10
|
from chia_rs.sized_bytes import bytes32
|
chia/pools/pool_puzzles.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from chia_puzzles_py.programs import (
|
|
7
6
|
P2_SINGLETON_OR_DELAYED_PUZHASH,
|
|
@@ -126,8 +125,8 @@ def get_delayed_puz_info_from_launcher_spend(coinsol: CoinSpend) -> tuple[uint64
|
|
|
126
125
|
extra_data = Program.from_bytes(bytes(coinsol.solution)).rest().rest().first()
|
|
127
126
|
# Extra data is (pool_state delayed_puz_info)
|
|
128
127
|
# Delayed puz info is (seconds delayed_puzzle_hash)
|
|
129
|
-
seconds:
|
|
130
|
-
delayed_puzzle_hash:
|
|
128
|
+
seconds: uint64 | None = None
|
|
129
|
+
delayed_puzzle_hash: bytes32 | None = None
|
|
131
130
|
for key_value_pairs in extra_data.as_iter():
|
|
132
131
|
key_value_pair = key_value_pairs.as_pair()
|
|
133
132
|
if key_value_pair is None:
|
|
@@ -221,14 +220,14 @@ def create_travel_spend(
|
|
|
221
220
|
else:
|
|
222
221
|
raise ValueError
|
|
223
222
|
|
|
224
|
-
current_singleton:
|
|
223
|
+
current_singleton: Coin | None = get_most_recent_singleton_coin_from_coin_spend(last_coin_spend)
|
|
225
224
|
assert current_singleton is not None
|
|
226
225
|
|
|
227
226
|
if current_singleton.parent_coin_info == launcher_coin.name():
|
|
228
227
|
parent_info_list = Program.to([launcher_coin.parent_coin_info, launcher_coin.amount])
|
|
229
228
|
else:
|
|
230
229
|
p = Program.from_bytes(bytes(last_coin_spend.puzzle_reveal))
|
|
231
|
-
last_coin_spend_inner_puzzle:
|
|
230
|
+
last_coin_spend_inner_puzzle: Program | None = get_inner_puzzle_from_puzzle(p)
|
|
232
231
|
assert last_coin_spend_inner_puzzle is not None
|
|
233
232
|
parent_info_list = Program.to(
|
|
234
233
|
[
|
|
@@ -272,14 +271,14 @@ def create_absorb_spend(
|
|
|
272
271
|
else:
|
|
273
272
|
raise ValueError
|
|
274
273
|
# full sol = (parent_info, my_amount, inner_solution)
|
|
275
|
-
coin:
|
|
274
|
+
coin: Coin | None = get_most_recent_singleton_coin_from_coin_spend(last_coin_spend)
|
|
276
275
|
assert coin is not None
|
|
277
276
|
|
|
278
277
|
if coin.parent_coin_info == launcher_coin.name():
|
|
279
278
|
parent_info: Program = Program.to([launcher_coin.parent_coin_info, launcher_coin.amount])
|
|
280
279
|
else:
|
|
281
280
|
p = Program.from_bytes(bytes(last_coin_spend.puzzle_reveal))
|
|
282
|
-
last_coin_spend_inner_puzzle:
|
|
281
|
+
last_coin_spend_inner_puzzle: Program | None = get_inner_puzzle_from_puzzle(p)
|
|
283
282
|
assert last_coin_spend_inner_puzzle is not None
|
|
284
283
|
parent_info = Program.to(
|
|
285
284
|
[
|
|
@@ -309,7 +308,7 @@ def create_absorb_spend(
|
|
|
309
308
|
return coin_spends
|
|
310
309
|
|
|
311
310
|
|
|
312
|
-
def get_most_recent_singleton_coin_from_coin_spend(coin_sol: CoinSpend) ->
|
|
311
|
+
def get_most_recent_singleton_coin_from_coin_spend(coin_sol: CoinSpend) -> Coin | None:
|
|
313
312
|
additions: list[Coin] = compute_additions(coin_sol)
|
|
314
313
|
for coin in additions:
|
|
315
314
|
if coin.amount % 2 == 1:
|
|
@@ -369,7 +368,7 @@ def uncurry_pool_waitingroom_inner_puzzle(inner_puzzle: Program) -> tuple[Progra
|
|
|
369
368
|
return target_puzzle_hash, relative_lock_height, owner_pubkey, p2_singleton_hash
|
|
370
369
|
|
|
371
370
|
|
|
372
|
-
def get_inner_puzzle_from_puzzle(full_puzzle: Program) ->
|
|
371
|
+
def get_inner_puzzle_from_puzzle(full_puzzle: Program) -> Program | None:
|
|
373
372
|
p = Program.from_bytes(bytes(full_puzzle))
|
|
374
373
|
r = p.uncurry()
|
|
375
374
|
if r is None:
|
|
@@ -382,8 +381,8 @@ def get_inner_puzzle_from_puzzle(full_puzzle: Program) -> Optional[Program]:
|
|
|
382
381
|
return inner_puzzle
|
|
383
382
|
|
|
384
383
|
|
|
385
|
-
def pool_state_from_extra_data(extra_data: Program) ->
|
|
386
|
-
state_bytes:
|
|
384
|
+
def pool_state_from_extra_data(extra_data: Program) -> PoolState | None:
|
|
385
|
+
state_bytes: bytes | None = None
|
|
387
386
|
try:
|
|
388
387
|
for key, value in extra_data.as_python():
|
|
389
388
|
if key == b"p":
|
|
@@ -397,7 +396,7 @@ def pool_state_from_extra_data(extra_data: Program) -> Optional[PoolState]:
|
|
|
397
396
|
return None
|
|
398
397
|
|
|
399
398
|
|
|
400
|
-
def solution_to_pool_state(full_spend: CoinSpend) ->
|
|
399
|
+
def solution_to_pool_state(full_spend: CoinSpend) -> PoolState | None:
|
|
401
400
|
full_solution_ser: SerializedProgram = full_spend.solution
|
|
402
401
|
full_solution: Program = Program.from_bytes(bytes(full_solution_ser))
|
|
403
402
|
|
chia/pools/pool_wallet.py
CHANGED
|
@@ -2,8 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import logging
|
|
5
|
-
import
|
|
6
|
-
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
5
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
7
6
|
|
|
8
7
|
from chia_rs import CoinSpend, G1Element, G2Element
|
|
9
8
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -41,11 +40,10 @@ from chia.server.ws_connection import WSChiaConnection
|
|
|
41
40
|
from chia.types.blockchain_format.coin import Coin
|
|
42
41
|
from chia.types.blockchain_format.program import Program
|
|
43
42
|
from chia.types.coin_spend import make_spend
|
|
44
|
-
from chia.wallet.conditions import AssertCoinAnnouncement, Condition
|
|
43
|
+
from chia.wallet.conditions import AssertCoinAnnouncement, Condition
|
|
45
44
|
from chia.wallet.puzzles.singleton_top_layer import SINGLETON_LAUNCHER
|
|
46
45
|
from chia.wallet.transaction_record import TransactionRecord
|
|
47
46
|
from chia.wallet.util.compute_additions import compute_additions
|
|
48
|
-
from chia.wallet.util.transaction_type import TransactionType
|
|
49
47
|
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig
|
|
50
48
|
from chia.wallet.util.wallet_types import WalletType
|
|
51
49
|
from chia.wallet.wallet import Wallet
|
|
@@ -79,7 +77,7 @@ class PoolWallet:
|
|
|
79
77
|
wallet_id: int
|
|
80
78
|
next_transaction_fee: uint64 = uint64(0)
|
|
81
79
|
next_tx_config: TXConfig = DEFAULT_TX_CONFIG
|
|
82
|
-
target_state:
|
|
80
|
+
target_state: PoolState | None = None
|
|
83
81
|
|
|
84
82
|
"""
|
|
85
83
|
From the user's perspective, this is not a wallet at all, but a way to control
|
|
@@ -134,7 +132,7 @@ class PoolWallet:
|
|
|
134
132
|
return self.wallet_info.id
|
|
135
133
|
|
|
136
134
|
@classmethod
|
|
137
|
-
def _verify_self_pooled(cls, state: PoolState) ->
|
|
135
|
+
def _verify_self_pooled(cls, state: PoolState) -> str | None:
|
|
138
136
|
err = ""
|
|
139
137
|
if state.pool_url not in {None, ""}:
|
|
140
138
|
err += " Unneeded pool_url for self-pooling"
|
|
@@ -145,7 +143,7 @@ class PoolWallet:
|
|
|
145
143
|
return None if err == "" else err
|
|
146
144
|
|
|
147
145
|
@classmethod
|
|
148
|
-
def _verify_pooling_state(cls, state: PoolState) ->
|
|
146
|
+
def _verify_pooling_state(cls, state: PoolState) -> str | None:
|
|
149
147
|
err = ""
|
|
150
148
|
if state.relative_lock_height < cls.MINIMUM_RELATIVE_LOCK_HEIGHT:
|
|
151
149
|
err += (
|
|
@@ -163,7 +161,7 @@ class PoolWallet:
|
|
|
163
161
|
return err
|
|
164
162
|
|
|
165
163
|
@classmethod
|
|
166
|
-
def _verify_pool_state(cls, state: PoolState) ->
|
|
164
|
+
def _verify_pool_state(cls, state: PoolState) -> str | None:
|
|
167
165
|
if state.target_puzzle_hash is None:
|
|
168
166
|
return "Invalid puzzle_hash"
|
|
169
167
|
|
|
@@ -199,13 +197,13 @@ class PoolWallet:
|
|
|
199
197
|
|
|
200
198
|
launcher_coin: Coin = all_spends[0].coin
|
|
201
199
|
delayed_seconds, delayed_puzhash = get_delayed_puz_info_from_launcher_spend(all_spends[0])
|
|
202
|
-
tip_singleton_coin:
|
|
200
|
+
tip_singleton_coin: Coin | None = get_most_recent_singleton_coin_from_coin_spend(all_spends[-1])
|
|
203
201
|
launcher_id: bytes32 = launcher_coin.name()
|
|
204
202
|
p2_singleton_puzzle_hash = launcher_id_to_p2_puzzle_hash(launcher_id, delayed_seconds, delayed_puzhash)
|
|
205
203
|
assert tip_singleton_coin is not None
|
|
206
204
|
|
|
207
205
|
curr_spend_i = len(all_spends) - 1
|
|
208
|
-
pool_state:
|
|
206
|
+
pool_state: PoolState | None = None
|
|
209
207
|
last_singleton_spend_height = uint32(0)
|
|
210
208
|
while pool_state is None:
|
|
211
209
|
full_spend: CoinSpend = all_spends[curr_spend_i]
|
|
@@ -234,7 +232,7 @@ class PoolWallet:
|
|
|
234
232
|
current_state: PoolWalletInfo = await self.get_current_state()
|
|
235
233
|
pool_config_list: list[PoolWalletConfig] = load_pool_config(self.wallet_state_manager.root_path)
|
|
236
234
|
pool_config_dict: dict[bytes32, PoolWalletConfig] = {c.launcher_id: c for c in pool_config_list}
|
|
237
|
-
existing_config:
|
|
235
|
+
existing_config: PoolWalletConfig | None = pool_config_dict.get(current_state.launcher_id, None)
|
|
238
236
|
payout_instructions: str = existing_config.payout_instructions if existing_config is not None else ""
|
|
239
237
|
|
|
240
238
|
if len(payout_instructions) == 0:
|
|
@@ -263,7 +261,7 @@ class PoolWallet:
|
|
|
263
261
|
tip: tuple[uint32, CoinSpend] = await self.get_tip()
|
|
264
262
|
tip_spend = tip[1]
|
|
265
263
|
|
|
266
|
-
tip_coin:
|
|
264
|
+
tip_coin: Coin | None = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
|
|
267
265
|
assert tip_coin is not None
|
|
268
266
|
spent_coin_name: bytes32 = tip_coin.name()
|
|
269
267
|
|
|
@@ -285,7 +283,7 @@ class PoolWallet:
|
|
|
285
283
|
for _, added_spend in reversed(
|
|
286
284
|
await self.wallet_state_manager.pool_store.get_spends_for_wallet(self.wallet_id)
|
|
287
285
|
):
|
|
288
|
-
latest_state:
|
|
286
|
+
latest_state: PoolState | None = solution_to_pool_state(added_spend)
|
|
289
287
|
if latest_state is not None:
|
|
290
288
|
if self.target_state == latest_state:
|
|
291
289
|
self.target_state = None
|
|
@@ -328,7 +326,7 @@ class PoolWallet:
|
|
|
328
326
|
block_spends: list[CoinSpend],
|
|
329
327
|
block_height: uint32,
|
|
330
328
|
*,
|
|
331
|
-
name:
|
|
329
|
+
name: str | None = None,
|
|
332
330
|
) -> PoolWallet:
|
|
333
331
|
"""
|
|
334
332
|
This creates a new PoolWallet with only one spend: the launcher spend. The DB MUST be committed after calling
|
|
@@ -346,7 +344,7 @@ class PoolWallet:
|
|
|
346
344
|
standard_wallet=wallet,
|
|
347
345
|
)
|
|
348
346
|
|
|
349
|
-
launcher_spend:
|
|
347
|
+
launcher_spend: CoinSpend | None = None
|
|
350
348
|
for spend in block_spends:
|
|
351
349
|
if spend.coin.name() == launcher_coin_id:
|
|
352
350
|
launcher_spend = spend
|
|
@@ -366,7 +364,7 @@ class PoolWallet:
|
|
|
366
364
|
wallet_state_manager: Any,
|
|
367
365
|
wallet: Wallet,
|
|
368
366
|
wallet_info: WalletInfo,
|
|
369
|
-
name:
|
|
367
|
+
name: str | None = None,
|
|
370
368
|
) -> PoolWallet:
|
|
371
369
|
"""
|
|
372
370
|
This creates a PoolWallet from DB. However, all data is already handled by WalletPoolStore, so we don't need
|
|
@@ -388,8 +386,8 @@ class PoolWallet:
|
|
|
388
386
|
initial_target_state: PoolState,
|
|
389
387
|
action_scope: WalletActionScope,
|
|
390
388
|
fee: uint64 = uint64(0),
|
|
391
|
-
p2_singleton_delay_time:
|
|
392
|
-
p2_singleton_delayed_ph:
|
|
389
|
+
p2_singleton_delay_time: uint64 | None = None,
|
|
390
|
+
p2_singleton_delayed_ph: bytes32 | None = None,
|
|
393
391
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
394
392
|
) -> tuple[bytes32, bytes32]:
|
|
395
393
|
"""
|
|
@@ -523,25 +521,15 @@ class PoolWallet:
|
|
|
523
521
|
|
|
524
522
|
async with action_scope.use() as interface:
|
|
525
523
|
interface.side_effects.transactions.append(
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
to_puzzle_hash=new_full_puzzle.get_tree_hash(),
|
|
530
|
-
to_address=self.wallet_state_manager.encode_puzzle_hash(new_full_puzzle.get_tree_hash()),
|
|
524
|
+
self.wallet_state_manager.new_outgoing_transaction(
|
|
525
|
+
wallet_id=self.id(),
|
|
526
|
+
puzzle_hash=new_full_puzzle.get_tree_hash(),
|
|
531
527
|
amount=uint64(1),
|
|
532
|
-
|
|
533
|
-
confirmed=False,
|
|
534
|
-
sent=uint32(0),
|
|
528
|
+
fee=fee,
|
|
535
529
|
spend_bundle=unsigned_spend_bundle,
|
|
536
530
|
additions=unsigned_spend_bundle.additions(),
|
|
537
531
|
removals=unsigned_spend_bundle.removals(),
|
|
538
|
-
wallet_id=self.id(),
|
|
539
|
-
sent_to=[],
|
|
540
|
-
trade_id=None,
|
|
541
|
-
memos={},
|
|
542
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
543
532
|
name=unsigned_spend_bundle.name(),
|
|
544
|
-
valid_times=ConditionValidTimes(),
|
|
545
533
|
)
|
|
546
534
|
)
|
|
547
535
|
|
|
@@ -714,7 +702,7 @@ class PoolWallet:
|
|
|
714
702
|
return total_fee
|
|
715
703
|
|
|
716
704
|
async def claim_pool_rewards(
|
|
717
|
-
self, fee: uint64, max_spends_in_tx:
|
|
705
|
+
self, fee: uint64, max_spends_in_tx: int | None, action_scope: WalletActionScope
|
|
718
706
|
) -> None:
|
|
719
707
|
# Search for p2_puzzle_hash coins, and spend them with the singleton
|
|
720
708
|
if await self.have_unconfirmed_transaction():
|
|
@@ -734,7 +722,7 @@ class PoolWallet:
|
|
|
734
722
|
farming_rewards: list[TransactionRecord] = await self.wallet_state_manager.tx_store.get_farming_rewards()
|
|
735
723
|
coin_to_height_farmed: dict[Coin, uint32] = {}
|
|
736
724
|
for tx_record in farming_rewards:
|
|
737
|
-
height_farmed:
|
|
725
|
+
height_farmed: uint32 | None = tx_record.height_farmed(
|
|
738
726
|
self.wallet_state_manager.constants.GENESIS_CHALLENGE
|
|
739
727
|
)
|
|
740
728
|
assert height_farmed is not None
|
|
@@ -793,29 +781,18 @@ class PoolWallet:
|
|
|
793
781
|
),
|
|
794
782
|
)
|
|
795
783
|
|
|
796
|
-
current_time = uint64(time.time())
|
|
797
784
|
# The claim spend, minus the fee amount from the main wallet
|
|
798
785
|
async with action_scope.use() as interface:
|
|
799
786
|
interface.side_effects.transactions.append(
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
to_puzzle_hash=current_state.current.target_puzzle_hash,
|
|
804
|
-
to_address=self.wallet_state_manager.encode_puzzle_hash(current_state.current.target_puzzle_hash),
|
|
787
|
+
self.wallet_state_manager.new_outgoing_transaction(
|
|
788
|
+
wallet_id=uint32(self.wallet_id),
|
|
789
|
+
puzzle_hash=current_state.current.target_puzzle_hash,
|
|
805
790
|
amount=uint64(total_amount),
|
|
806
|
-
|
|
807
|
-
confirmed=False,
|
|
808
|
-
sent=uint32(0),
|
|
791
|
+
fee=fee,
|
|
809
792
|
spend_bundle=claim_spend,
|
|
810
793
|
additions=[add for add in claim_spend.additions() if add.amount == last_solution.coin.amount],
|
|
811
794
|
removals=claim_spend.removals(),
|
|
812
|
-
wallet_id=uint32(self.wallet_id),
|
|
813
|
-
sent_to=[],
|
|
814
|
-
memos={},
|
|
815
|
-
trade_id=None,
|
|
816
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
817
795
|
name=claim_spend.name(),
|
|
818
|
-
valid_times=ConditionValidTimes(),
|
|
819
796
|
)
|
|
820
797
|
)
|
|
821
798
|
|
|
@@ -842,7 +819,7 @@ class PoolWallet:
|
|
|
842
819
|
unconfirmed: list[
|
|
843
820
|
TransactionRecord
|
|
844
821
|
] = await self.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(self.wallet_id)
|
|
845
|
-
next_tip:
|
|
822
|
+
next_tip: Coin | None = get_most_recent_singleton_coin_from_coin_spend(tip_spend)
|
|
846
823
|
assert next_tip is not None
|
|
847
824
|
|
|
848
825
|
if any([rem.name() == next_tip.name() for tx_rec in unconfirmed for rem in tx_rec.removals]):
|
|
@@ -870,7 +847,7 @@ class PoolWallet:
|
|
|
870
847
|
)
|
|
871
848
|
return len(unconfirmed) > 0
|
|
872
849
|
|
|
873
|
-
async def get_confirmed_balance(self, _:
|
|
850
|
+
async def get_confirmed_balance(self, _: object | None = None) -> uint128:
|
|
874
851
|
amount: uint128 = uint128(0)
|
|
875
852
|
if (await self.get_current_state()).current.state == SELF_POOLING.value:
|
|
876
853
|
unspent_coin_records: list[WalletCoinRecord] = list(
|
|
@@ -881,19 +858,19 @@ class PoolWallet:
|
|
|
881
858
|
amount = uint128(amount + record.coin.amount)
|
|
882
859
|
return amount
|
|
883
860
|
|
|
884
|
-
async def get_unconfirmed_balance(self, record_list:
|
|
861
|
+
async def get_unconfirmed_balance(self, record_list: object | None = None) -> uint128:
|
|
885
862
|
return await self.get_confirmed_balance(record_list)
|
|
886
863
|
|
|
887
|
-
async def get_spendable_balance(self, record_list:
|
|
864
|
+
async def get_spendable_balance(self, record_list: object | None = None) -> uint128:
|
|
888
865
|
return await self.get_confirmed_balance(record_list)
|
|
889
866
|
|
|
890
867
|
async def get_pending_change_balance(self) -> uint64:
|
|
891
868
|
return uint64(0)
|
|
892
869
|
|
|
893
|
-
async def get_max_send_amount(self, records:
|
|
870
|
+
async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
894
871
|
return uint128(0)
|
|
895
872
|
|
|
896
|
-
async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data:
|
|
873
|
+
async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: object | None) -> None:
|
|
897
874
|
pass
|
|
898
875
|
|
|
899
876
|
async def select_coins(self, amount: uint64, action_scope: WalletActionScope) -> set[Coin]:
|
|
@@ -917,8 +894,8 @@ class PoolWallet:
|
|
|
917
894
|
puzzle_hashes: list[bytes32],
|
|
918
895
|
action_scope: WalletActionScope,
|
|
919
896
|
fee: uint64 = uint64(0),
|
|
920
|
-
coins:
|
|
921
|
-
memos:
|
|
897
|
+
coins: set[Coin] | None = None,
|
|
898
|
+
memos: list[list[bytes]] | None = None,
|
|
922
899
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
923
900
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
924
901
|
) -> None:
|