chia-blockchain 2.5.7rc3__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 +12 -7
- 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 +16 -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.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc3.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.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/wallet/wallet.py
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
import
|
|
5
|
-
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
4
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
6
5
|
|
|
7
6
|
from chia_rs import AugSchemeMPL, CoinSpend, G1Element, G2Element, PrivateKey
|
|
8
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -13,16 +12,13 @@ from chia.types.blockchain_format.coin import Coin
|
|
|
13
12
|
from chia.types.blockchain_format.program import Program
|
|
14
13
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
15
14
|
from chia.types.coin_spend import make_spend
|
|
16
|
-
from chia.types.signing_mode import CHIP_0002_SIGN_MESSAGE_PREFIX, SigningMode
|
|
17
15
|
from chia.util.hash import std_hash
|
|
18
|
-
from chia.util.streamable import Streamable
|
|
19
16
|
from chia.wallet.coin_selection import select_coins
|
|
20
17
|
from chia.wallet.conditions import (
|
|
21
18
|
AssertCoinAnnouncement,
|
|
22
19
|
Condition,
|
|
23
20
|
CreateCoin,
|
|
24
21
|
CreateCoinAnnouncement,
|
|
25
|
-
parse_timelock_info,
|
|
26
22
|
)
|
|
27
23
|
from chia.wallet.derivation_record import DerivationRecord
|
|
28
24
|
from chia.wallet.derive_keys import (
|
|
@@ -53,9 +49,8 @@ from chia.wallet.signer_protocol import (
|
|
|
53
49
|
TransactionInfo,
|
|
54
50
|
)
|
|
55
51
|
from chia.wallet.transaction_record import TransactionRecord
|
|
56
|
-
from chia.wallet.util.compute_memos import compute_memos
|
|
57
52
|
from chia.wallet.util.puzzle_decorator import PuzzleDecoratorManager
|
|
58
|
-
from chia.wallet.util.transaction_type import CLAWBACK_INCOMING_TRANSACTION_TYPES
|
|
53
|
+
from chia.wallet.util.transaction_type import CLAWBACK_INCOMING_TRANSACTION_TYPES
|
|
59
54
|
from chia.wallet.util.wallet_types import WalletIdentifier, WalletType
|
|
60
55
|
from chia.wallet.wallet_action_scope import WalletActionScope
|
|
61
56
|
from chia.wallet.wallet_coin_record import WalletCoinRecord
|
|
@@ -99,15 +94,15 @@ class Wallet:
|
|
|
99
94
|
# avoid full block TXs
|
|
100
95
|
return int(self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM / 5 / self.cost_of_single_tx)
|
|
101
96
|
|
|
102
|
-
async def
|
|
103
|
-
|
|
104
|
-
|
|
97
|
+
async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
98
|
+
return uint128(
|
|
99
|
+
sum(
|
|
100
|
+
cr.coin.amount
|
|
101
|
+
for cr in await self.wallet_state_manager.get_spendable_coins_for_wallet(
|
|
102
|
+
self.id(), records, in_one_block=True
|
|
103
|
+
)
|
|
104
|
+
)
|
|
105
105
|
)
|
|
106
|
-
spendable.sort(reverse=True, key=lambda record: record.coin.amount)
|
|
107
|
-
return set(spendable[0 : min(len(spendable), self.max_send_quantity)])
|
|
108
|
-
|
|
109
|
-
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
110
|
-
return uint128(sum(cr.coin.amount for cr in await self.get_max_spendable_coins()))
|
|
111
106
|
|
|
112
107
|
@classmethod
|
|
113
108
|
def type(cls) -> WalletType:
|
|
@@ -116,13 +111,16 @@ class Wallet:
|
|
|
116
111
|
def id(self) -> uint32:
|
|
117
112
|
return self.wallet_id
|
|
118
113
|
|
|
119
|
-
|
|
114
|
+
def convert_secret_key_to_synthetic(self, secret_key: PrivateKey) -> PrivateKey:
|
|
115
|
+
return calculate_synthetic_secret_key(secret_key, DEFAULT_HIDDEN_PUZZLE_HASH)
|
|
116
|
+
|
|
117
|
+
async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
|
|
120
118
|
return await self.wallet_state_manager.get_confirmed_balance_for_wallet(self.id(), record_list)
|
|
121
119
|
|
|
122
|
-
async def get_unconfirmed_balance(self, unspent_records:
|
|
120
|
+
async def get_unconfirmed_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
123
121
|
return await self.wallet_state_manager.get_unconfirmed_balance(self.id(), unspent_records)
|
|
124
122
|
|
|
125
|
-
async def get_spendable_balance(self, unspent_records:
|
|
123
|
+
async def get_spendable_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
126
124
|
spendable = await self.wallet_state_manager.get_confirmed_spendable_balance_for_wallet(
|
|
127
125
|
self.id(), unspent_records
|
|
128
126
|
)
|
|
@@ -208,7 +206,9 @@ class Wallet:
|
|
|
208
206
|
Note: Must be called under wallet state manager lock
|
|
209
207
|
"""
|
|
210
208
|
spendable_amount: uint128 = await self.get_spendable_balance()
|
|
211
|
-
spendable_coins: list[WalletCoinRecord] = list(
|
|
209
|
+
spendable_coins: list[WalletCoinRecord] = list(
|
|
210
|
+
await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), in_one_block=True)
|
|
211
|
+
)
|
|
212
212
|
|
|
213
213
|
# Try to use coins from the store, if there isn't enough of "unused"
|
|
214
214
|
# coins use change coins that are not confirmed yet
|
|
@@ -234,14 +234,14 @@ class Wallet:
|
|
|
234
234
|
newpuzzlehashes: list[bytes32],
|
|
235
235
|
action_scope: WalletActionScope,
|
|
236
236
|
fee: uint64 = uint64(0),
|
|
237
|
-
origin_id:
|
|
238
|
-
coins:
|
|
239
|
-
memos:
|
|
237
|
+
origin_id: bytes32 | None = None,
|
|
238
|
+
coins: set[Coin] | None = None,
|
|
239
|
+
memos: list[list[bytes]] | None = None,
|
|
240
240
|
negative_change_allowed: bool = False,
|
|
241
|
-
puzzle_decorator_override:
|
|
241
|
+
puzzle_decorator_override: list[dict[str, Any]] | None = None,
|
|
242
242
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
243
|
-
reserve_fee:
|
|
244
|
-
preferred_change_puzzle_hash:
|
|
243
|
+
reserve_fee: uint64 | None = None,
|
|
244
|
+
preferred_change_puzzle_hash: bytes32 | None = None,
|
|
245
245
|
) -> list[CoinSpend]:
|
|
246
246
|
"""
|
|
247
247
|
Generates a unsigned transaction in form of List(Puzzle, Solutions)
|
|
@@ -274,7 +274,7 @@ class Wallet:
|
|
|
274
274
|
assert change >= 0
|
|
275
275
|
|
|
276
276
|
spends: list[CoinSpend] = []
|
|
277
|
-
primary_announcement:
|
|
277
|
+
primary_announcement: AssertCoinAnnouncement | None = None
|
|
278
278
|
|
|
279
279
|
# Check for duplicates
|
|
280
280
|
all_primaries_list = list(zip(amounts, newpuzzlehashes))
|
|
@@ -363,38 +363,22 @@ class Wallet:
|
|
|
363
363
|
self.log.debug(f"Spends is {spends}")
|
|
364
364
|
return spends
|
|
365
365
|
|
|
366
|
-
async def sign_message(self, message: str, puzzle_hash: bytes32, mode: SigningMode) -> tuple[G1Element, G2Element]:
|
|
367
|
-
# CHIP-0002 message signing as documented at:
|
|
368
|
-
# https://github.com/Chia-Network/chips/blob/80e4611fe52b174bf1a0382b9dff73805b18b8c6/CHIPs/chip-0002.md#signmessage
|
|
369
|
-
private = await self.wallet_state_manager.get_private_key(puzzle_hash)
|
|
370
|
-
synthetic_secret_key = calculate_synthetic_secret_key(private, DEFAULT_HIDDEN_PUZZLE_HASH)
|
|
371
|
-
synthetic_pk = synthetic_secret_key.get_g1()
|
|
372
|
-
if mode == SigningMode.CHIP_0002_HEX_INPUT:
|
|
373
|
-
hex_message: bytes = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, bytes.fromhex(message))).get_tree_hash()
|
|
374
|
-
elif mode == SigningMode.BLS_MESSAGE_AUGMENTATION_UTF8_INPUT:
|
|
375
|
-
hex_message = bytes(message, "utf-8")
|
|
376
|
-
elif mode == SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT:
|
|
377
|
-
hex_message = bytes.fromhex(message)
|
|
378
|
-
else:
|
|
379
|
-
hex_message = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, message)).get_tree_hash()
|
|
380
|
-
return synthetic_pk, AugSchemeMPL.sign(synthetic_secret_key, hex_message)
|
|
381
|
-
|
|
382
366
|
async def generate_signed_transaction(
|
|
383
367
|
self,
|
|
384
368
|
amounts: list[uint64],
|
|
385
369
|
puzzle_hashes: list[bytes32],
|
|
386
370
|
action_scope: WalletActionScope,
|
|
387
371
|
fee: uint64 = uint64(0),
|
|
388
|
-
coins:
|
|
389
|
-
memos:
|
|
372
|
+
coins: set[Coin] | None = None,
|
|
373
|
+
memos: list[list[bytes]] | None = None,
|
|
390
374
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
391
375
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
392
376
|
) -> None:
|
|
393
|
-
origin_id:
|
|
377
|
+
origin_id: bytes32 | None = kwargs.get("origin_id", None)
|
|
394
378
|
negative_change_allowed: bool = kwargs.get("negative_change_allowed", False)
|
|
395
|
-
puzzle_decorator_override:
|
|
396
|
-
reserve_fee:
|
|
397
|
-
preferred_change_puzzle_hash:
|
|
379
|
+
puzzle_decorator_override: list[dict[str, Any]] | None = kwargs.get("puzzle_decorator_override", None)
|
|
380
|
+
reserve_fee: uint64 | None = kwargs.get("reserve_fee", None)
|
|
381
|
+
preferred_change_puzzle_hash: bytes32 | None = kwargs.get("preferred_change_puzzle_hash", None)
|
|
398
382
|
"""
|
|
399
383
|
Use this to generate transaction.
|
|
400
384
|
Note: this must be called under a wallet state manager lock
|
|
@@ -402,7 +386,7 @@ class Wallet:
|
|
|
402
386
|
"""
|
|
403
387
|
non_change_amount = uint64(sum(amounts))
|
|
404
388
|
|
|
405
|
-
self.log.debug("Generating transaction for: %s %s %
|
|
389
|
+
self.log.debug("Generating transaction for: %s %s %r", puzzle_hashes, amounts, coins)
|
|
406
390
|
transaction = await self._generate_unsigned_transaction(
|
|
407
391
|
amounts,
|
|
408
392
|
puzzle_hashes,
|
|
@@ -420,7 +404,6 @@ class Wallet:
|
|
|
420
404
|
assert len(transaction) > 0
|
|
421
405
|
spend_bundle = WalletSpendBundle(transaction, G2Element())
|
|
422
406
|
|
|
423
|
-
now = uint64(time.time())
|
|
424
407
|
add_list: list[Coin] = list(spend_bundle.additions())
|
|
425
408
|
rem_list: list[Coin] = list(spend_bundle.removals())
|
|
426
409
|
|
|
@@ -434,25 +417,16 @@ class Wallet:
|
|
|
434
417
|
to_ph = add_list[0].puzzle_hash if len(add_list) > 0 else bytes32.zeros
|
|
435
418
|
async with action_scope.use() as interface:
|
|
436
419
|
interface.side_effects.transactions.append(
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
to_puzzle_hash=to_ph,
|
|
441
|
-
to_address=self.wallet_state_manager.encode_puzzle_hash(to_ph),
|
|
420
|
+
self.wallet_state_manager.new_outgoing_transaction(
|
|
421
|
+
wallet_id=self.id(),
|
|
422
|
+
puzzle_hash=to_ph,
|
|
442
423
|
amount=uint64(non_change_amount),
|
|
443
|
-
|
|
444
|
-
confirmed=False,
|
|
445
|
-
sent=uint32(0),
|
|
424
|
+
fee=fee,
|
|
446
425
|
spend_bundle=spend_bundle,
|
|
447
426
|
additions=add_list,
|
|
448
427
|
removals=rem_list,
|
|
449
|
-
wallet_id=self.id(),
|
|
450
|
-
sent_to=[],
|
|
451
|
-
trade_id=None,
|
|
452
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
453
428
|
name=spend_bundle.name(),
|
|
454
|
-
|
|
455
|
-
valid_times=parse_timelock_info(extra_conditions),
|
|
429
|
+
extra_conditions=extra_conditions,
|
|
456
430
|
)
|
|
457
431
|
)
|
|
458
432
|
|
|
@@ -460,10 +434,10 @@ class Wallet:
|
|
|
460
434
|
self,
|
|
461
435
|
fee: uint64,
|
|
462
436
|
action_scope: WalletActionScope,
|
|
463
|
-
coins:
|
|
437
|
+
coins: set[Coin] | None = None,
|
|
464
438
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
465
|
-
reserve_fee:
|
|
466
|
-
preferred_change_puzzle_hash:
|
|
439
|
+
reserve_fee: uint64 | None = None,
|
|
440
|
+
preferred_change_puzzle_hash: bytes32 | None = None,
|
|
467
441
|
) -> None:
|
|
468
442
|
if coins is None:
|
|
469
443
|
coins = await self.select_coins(fee, action_scope)
|
|
@@ -480,7 +454,7 @@ class Wallet:
|
|
|
480
454
|
|
|
481
455
|
async def get_coins_to_offer(
|
|
482
456
|
self,
|
|
483
|
-
asset_id:
|
|
457
|
+
asset_id: bytes32 | None,
|
|
484
458
|
amount: uint64,
|
|
485
459
|
action_scope: WalletActionScope,
|
|
486
460
|
) -> set[Coin]:
|
|
@@ -494,9 +468,7 @@ class Wallet:
|
|
|
494
468
|
return await self.select_coins(amount, sandbox)
|
|
495
469
|
|
|
496
470
|
# WSChiaConnection is only imported for type checking
|
|
497
|
-
async def coin_added(
|
|
498
|
-
self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[Streamable]
|
|
499
|
-
) -> None:
|
|
471
|
+
async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: object | None) -> None:
|
|
500
472
|
pass
|
|
501
473
|
|
|
502
474
|
def get_name(self) -> str:
|
|
@@ -504,9 +476,9 @@ class Wallet:
|
|
|
504
476
|
|
|
505
477
|
async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool:
|
|
506
478
|
if hint == coin.puzzle_hash:
|
|
507
|
-
wallet_identifier:
|
|
508
|
-
WalletIdentifier
|
|
509
|
-
|
|
479
|
+
wallet_identifier: (
|
|
480
|
+
WalletIdentifier | None
|
|
481
|
+
) = await self.wallet_state_manager.puzzle_store.get_wallet_identifier_for_puzzle_hash(coin.puzzle_hash)
|
|
510
482
|
if wallet_identifier is not None and wallet_identifier.id == self.id():
|
|
511
483
|
return True
|
|
512
484
|
return False
|
|
@@ -514,9 +486,9 @@ class Wallet:
|
|
|
514
486
|
def hardened_pubkey_for_path(self, path: list[int]) -> G1Element:
|
|
515
487
|
return _derive_path(self.wallet_state_manager.get_master_private_key(), path).get_g1()
|
|
516
488
|
|
|
517
|
-
async def sum_hint_for_pubkey(self, pk: bytes) ->
|
|
489
|
+
async def sum_hint_for_pubkey(self, pk: bytes) -> SumHint | None:
|
|
518
490
|
pk_parsed: G1Element = G1Element.from_bytes(pk)
|
|
519
|
-
dr:
|
|
491
|
+
dr: DerivationRecord | None = await self.wallet_state_manager.puzzle_store.record_for_puzzle_hash(
|
|
520
492
|
puzzle_hash_for_synthetic_public_key(pk_parsed)
|
|
521
493
|
)
|
|
522
494
|
if dr is None:
|
|
@@ -527,9 +499,9 @@ class Wallet:
|
|
|
527
499
|
pk,
|
|
528
500
|
)
|
|
529
501
|
|
|
530
|
-
async def path_hint_for_pubkey(self, pk: bytes) ->
|
|
502
|
+
async def path_hint_for_pubkey(self, pk: bytes) -> PathHint | None:
|
|
531
503
|
pk_parsed: G1Element = G1Element.from_bytes(pk)
|
|
532
|
-
index:
|
|
504
|
+
index: uint32 | None = await self.wallet_state_manager.puzzle_store.index_for_pubkey(pk_parsed)
|
|
533
505
|
if index is None:
|
|
534
506
|
index = await self.wallet_state_manager.puzzle_store.index_for_puzzle_hash(
|
|
535
507
|
puzzle_hash_for_synthetic_public_key(pk_parsed)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
-
from collections.abc import AsyncIterator
|
|
4
|
+
from collections.abc import AsyncIterator, Callable
|
|
5
5
|
from dataclasses import dataclass, field, replace
|
|
6
|
-
from typing import TYPE_CHECKING,
|
|
6
|
+
from typing import TYPE_CHECKING, cast, final
|
|
7
7
|
|
|
8
8
|
from chia_rs.chia_rs import G1Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -33,7 +33,7 @@ class _StreamableWalletSideEffects(Streamable):
|
|
|
33
33
|
extra_spends: list[WalletSpendBundle]
|
|
34
34
|
selected_coins: list[Coin]
|
|
35
35
|
singleton_records: list[SingletonRecord]
|
|
36
|
-
get_unused_derivation_record_result:
|
|
36
|
+
get_unused_derivation_record_result: StreambleGetUnusedDerivationRecordResult | None
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
@dataclass
|
|
@@ -43,7 +43,7 @@ class WalletSideEffects:
|
|
|
43
43
|
extra_spends: list[WalletSpendBundle] = field(default_factory=list)
|
|
44
44
|
selected_coins: list[Coin] = field(default_factory=list)
|
|
45
45
|
singleton_records: list[SingletonRecord] = field(default_factory=list)
|
|
46
|
-
get_unused_derivation_record_result:
|
|
46
|
+
get_unused_derivation_record_result: StreambleGetUnusedDerivationRecordResult | None = None
|
|
47
47
|
|
|
48
48
|
def __bytes__(self) -> bytes:
|
|
49
49
|
return bytes(_StreamableWalletSideEffects(**self.__dict__))
|
|
@@ -58,7 +58,7 @@ class WalletSideEffects:
|
|
|
58
58
|
class WalletActionConfig:
|
|
59
59
|
push: bool
|
|
60
60
|
merge_spends: bool
|
|
61
|
-
sign:
|
|
61
|
+
sign: bool | None
|
|
62
62
|
additional_signing_responses: list[SigningResponse]
|
|
63
63
|
extra_spends: list[WalletSpendBundle]
|
|
64
64
|
tx_config: TXConfig
|
|
@@ -98,12 +98,12 @@ class WalletActionScope(ActionScope[WalletSideEffects, WalletActionConfig]):
|
|
|
98
98
|
return (await self._get_unused_derivation_path(wallet_state_manager)).record.puzzle_hash
|
|
99
99
|
|
|
100
100
|
async def get_puzzle(
|
|
101
|
-
self, wallet_state_manager: WalletStateManager, override_reuse_puzhash_with:
|
|
101
|
+
self, wallet_state_manager: WalletStateManager, override_reuse_puzhash_with: bool | None = None
|
|
102
102
|
) -> Program:
|
|
103
103
|
if (
|
|
104
104
|
self.config.tx_config.reuse_puzhash or override_reuse_puzhash_with is True
|
|
105
105
|
) and override_reuse_puzhash_with is not False:
|
|
106
|
-
record:
|
|
106
|
+
record: DerivationRecord | None = await wallet_state_manager.get_current_derivation_record_for_wallet(
|
|
107
107
|
wallet_state_manager.main_wallet.id()
|
|
108
108
|
)
|
|
109
109
|
if record is None:
|
|
@@ -114,12 +114,12 @@ class WalletActionScope(ActionScope[WalletSideEffects, WalletActionConfig]):
|
|
|
114
114
|
return await self._get_new_puzzle(wallet_state_manager)
|
|
115
115
|
|
|
116
116
|
async def get_puzzle_hash(
|
|
117
|
-
self, wallet_state_manager: WalletStateManager, override_reuse_puzhash_with:
|
|
117
|
+
self, wallet_state_manager: WalletStateManager, override_reuse_puzhash_with: bool | None = None
|
|
118
118
|
) -> bytes32:
|
|
119
119
|
if (
|
|
120
120
|
self.config.tx_config.reuse_puzhash or override_reuse_puzhash_with is True
|
|
121
121
|
) and override_reuse_puzhash_with is not False:
|
|
122
|
-
record:
|
|
122
|
+
record: DerivationRecord | None = await wallet_state_manager.get_current_derivation_record_for_wallet(
|
|
123
123
|
wallet_state_manager.main_wallet.id()
|
|
124
124
|
)
|
|
125
125
|
if record is None:
|
|
@@ -135,10 +135,10 @@ async def new_wallet_action_scope(
|
|
|
135
135
|
tx_config: TXConfig,
|
|
136
136
|
push: bool = False,
|
|
137
137
|
merge_spends: bool = True,
|
|
138
|
-
sign:
|
|
138
|
+
sign: bool | None = None,
|
|
139
139
|
additional_signing_responses: list[SigningResponse] = [],
|
|
140
140
|
extra_spends: list[WalletSpendBundle] = [],
|
|
141
|
-
puzzle_for_pk:
|
|
141
|
+
puzzle_for_pk: Callable[[G1Element], Program] | None = None,
|
|
142
142
|
) -> AsyncIterator[WalletActionScope]:
|
|
143
143
|
if puzzle_for_pk is None:
|
|
144
144
|
puzzle_for_pk = wallet_state_manager.main_wallet.puzzle_for_pk
|
chia/wallet/wallet_blockchain.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import TYPE_CHECKING, ClassVar,
|
|
4
|
+
from typing import TYPE_CHECKING, ClassVar, cast
|
|
5
5
|
|
|
6
6
|
from chia_rs import BlockRecord, ConsensusConstants, HeaderBlock
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -31,10 +31,10 @@ class WalletBlockchain:
|
|
|
31
31
|
_basic_store: KeyValStore
|
|
32
32
|
_weight_proof_handler: WalletWeightProofHandler
|
|
33
33
|
|
|
34
|
-
synced_weight_proof:
|
|
34
|
+
synced_weight_proof: WeightProof | None
|
|
35
35
|
_finished_sync_up_to: uint32
|
|
36
36
|
|
|
37
|
-
_peak:
|
|
37
|
+
_peak: HeaderBlock | None
|
|
38
38
|
_height_to_hash: dict[uint32, bytes32]
|
|
39
39
|
_block_records: dict[bytes32, BlockRecord]
|
|
40
40
|
_latest_timestamp: uint64
|
|
@@ -70,7 +70,7 @@ class WalletBlockchain:
|
|
|
70
70
|
return self
|
|
71
71
|
|
|
72
72
|
async def new_valid_weight_proof(self, weight_proof: WeightProof, records: list[BlockRecord]) -> None:
|
|
73
|
-
peak:
|
|
73
|
+
peak: HeaderBlock | None = await self.get_peak_block()
|
|
74
74
|
|
|
75
75
|
if peak is not None and weight_proof.recent_chain_data[-1].weight <= peak.weight:
|
|
76
76
|
# No update, don't change anything
|
|
@@ -93,7 +93,7 @@ class WalletBlockchain:
|
|
|
93
93
|
await self.set_peak_block(weight_proof.recent_chain_data[-1], latest_timestamp)
|
|
94
94
|
await self.clean_block_records()
|
|
95
95
|
|
|
96
|
-
async def add_block(self, block: HeaderBlock) -> tuple[AddBlockResult,
|
|
96
|
+
async def add_block(self, block: HeaderBlock) -> tuple[AddBlockResult, Err | None]:
|
|
97
97
|
if self.contains_block(block.header_hash):
|
|
98
98
|
return AddBlockResult.ALREADY_HAVE_BLOCK, None
|
|
99
99
|
if not self.contains_block(block.prev_header_hash) and block.height > 0:
|
|
@@ -159,7 +159,7 @@ class WalletBlockchain:
|
|
|
159
159
|
|
|
160
160
|
await self._basic_store.remove_object("PEAK_BLOCK")
|
|
161
161
|
|
|
162
|
-
async def set_peak_block(self, block: HeaderBlock, timestamp:
|
|
162
|
+
async def set_peak_block(self, block: HeaderBlock, timestamp: uint64 | None = None) -> None:
|
|
163
163
|
await self._basic_store.set_object("PEAK_BLOCK", block)
|
|
164
164
|
self._peak = block
|
|
165
165
|
if timestamp is not None:
|
|
@@ -168,7 +168,7 @@ class WalletBlockchain:
|
|
|
168
168
|
self._latest_timestamp = block.foliage_transaction_block.timestamp
|
|
169
169
|
log.info(f"Peak set to: {self._peak.height} timestamp: {self._latest_timestamp}")
|
|
170
170
|
|
|
171
|
-
async def get_peak_block(self) ->
|
|
171
|
+
async def get_peak_block(self) -> HeaderBlock | None:
|
|
172
172
|
if self._peak is not None:
|
|
173
173
|
return self._peak
|
|
174
174
|
header_block = await self._basic_store.get_object("PEAK_BLOCK", HeaderBlock)
|
|
@@ -183,7 +183,7 @@ class WalletBlockchain:
|
|
|
183
183
|
await self.clean_block_records()
|
|
184
184
|
|
|
185
185
|
async def get_finished_sync_up_to(self) -> uint32:
|
|
186
|
-
h:
|
|
186
|
+
h: uint32 | None = await self._basic_store.get_object("FINISHED_SYNC_UP_TO", uint32)
|
|
187
187
|
if h is None:
|
|
188
188
|
return uint32(0)
|
|
189
189
|
return h
|
|
@@ -191,7 +191,7 @@ class WalletBlockchain:
|
|
|
191
191
|
def get_latest_timestamp(self) -> uint64:
|
|
192
192
|
return self._latest_timestamp
|
|
193
193
|
|
|
194
|
-
def contains_block(self, header_hash: bytes32, height:
|
|
194
|
+
def contains_block(self, header_hash: bytes32, height: uint32 | None = None) -> bool:
|
|
195
195
|
"""
|
|
196
196
|
True if we have already added this block to the chain. This may return false for orphan blocks
|
|
197
197
|
that we have added but no longer keep in memory.
|
|
@@ -204,18 +204,18 @@ class WalletBlockchain:
|
|
|
204
204
|
def height_to_hash(self, height: uint32) -> bytes32:
|
|
205
205
|
return self._height_to_hash[height]
|
|
206
206
|
|
|
207
|
-
def try_block_record(self, header_hash: bytes32) ->
|
|
207
|
+
def try_block_record(self, header_hash: bytes32) -> BlockRecord | None:
|
|
208
208
|
return self._block_records.get(header_hash)
|
|
209
209
|
|
|
210
210
|
def height_to_block_record(self, height: uint32) -> BlockRecord:
|
|
211
|
-
header_hash:
|
|
211
|
+
header_hash: bytes32 | None = self.height_to_hash(height)
|
|
212
212
|
assert header_hash is not None
|
|
213
213
|
return self._block_records[header_hash]
|
|
214
214
|
|
|
215
215
|
def block_record(self, header_hash: bytes32) -> BlockRecord:
|
|
216
216
|
return self._block_records[header_hash]
|
|
217
217
|
|
|
218
|
-
async def get_block_record_from_db(self, header_hash: bytes32) ->
|
|
218
|
+
async def get_block_record_from_db(self, header_hash: bytes32) -> BlockRecord | None:
|
|
219
219
|
# the wallet doesn't have the blockchain DB, this implements the
|
|
220
220
|
# blockchain_interface
|
|
221
221
|
return self._block_records.get(header_hash)
|
|
@@ -1,19 +1,23 @@
|
|
|
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
|
|
5
5
|
|
|
6
|
+
from chia_rs import CoinRecord
|
|
6
7
|
from chia_rs.sized_bytes import bytes32
|
|
7
8
|
from chia_rs.sized_ints import uint8, uint32, uint64
|
|
8
9
|
|
|
9
10
|
from chia.types.blockchain_format.coin import Coin
|
|
10
|
-
from chia.types.coin_record import CoinRecord
|
|
11
11
|
from chia.util.streamable import VersionedBlob
|
|
12
12
|
from chia.wallet.puzzles.clawback.metadata import ClawbackMetadata, ClawbackVersion
|
|
13
13
|
from chia.wallet.util.wallet_types import CoinType, StreamableWalletIdentifier, WalletType
|
|
14
14
|
from chia.wallet.vc_wallet.cr_cat_drivers import CRCATMetadata, CRCATVersion
|
|
15
15
|
|
|
16
|
-
MetadataTypes =
|
|
16
|
+
MetadataTypes = ClawbackMetadata | CRCATMetadata
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class WalletCoinRecordMetadataParsingError(Exception):
|
|
20
|
+
pass
|
|
17
21
|
|
|
18
22
|
|
|
19
23
|
@dataclass(frozen=True)
|
|
@@ -34,14 +38,14 @@ class WalletCoinRecord:
|
|
|
34
38
|
# The launcher coin ID will change and will break all hardcode offer tests in CAT/NFT/DL, etc.
|
|
35
39
|
# TODO Change hardcode offer in unit tests
|
|
36
40
|
coin_type: CoinType = field(default=CoinType.NORMAL, hash=False)
|
|
37
|
-
metadata:
|
|
41
|
+
metadata: VersionedBlob | None = field(default=None, hash=False)
|
|
38
42
|
|
|
39
43
|
def wallet_identifier(self) -> StreamableWalletIdentifier:
|
|
40
44
|
return StreamableWalletIdentifier(uint32(self.wallet_id), uint8(self.wallet_type))
|
|
41
45
|
|
|
42
46
|
def parsed_metadata(self) -> MetadataTypes:
|
|
43
47
|
if self.metadata is None:
|
|
44
|
-
raise
|
|
48
|
+
raise WalletCoinRecordMetadataParsingError("Can't parse None metadata")
|
|
45
49
|
if self.coin_type == CoinType.CLAWBACK and self.metadata.version == ClawbackVersion.V1.value:
|
|
46
50
|
return ClawbackMetadata.from_bytes(self.metadata.blob)
|
|
47
51
|
if (
|
|
@@ -49,7 +53,9 @@ class WalletCoinRecord:
|
|
|
49
53
|
and self.metadata.version == CRCATVersion.V1.value
|
|
50
54
|
):
|
|
51
55
|
return CRCATMetadata.from_bytes(self.metadata.blob)
|
|
52
|
-
raise
|
|
56
|
+
raise WalletCoinRecordMetadataParsingError(
|
|
57
|
+
f"Unknown metadata {self.metadata} for coin_id {self.coin.name()} of type {self.coin_type}"
|
|
58
|
+
)
|
|
53
59
|
|
|
54
60
|
def name(self) -> bytes32:
|
|
55
61
|
return self.coin.name()
|
chia/wallet/wallet_coin_store.py
CHANGED
|
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|
|
3
3
|
import sqlite3
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from enum import IntEnum
|
|
6
|
-
from typing import Optional
|
|
7
6
|
|
|
8
7
|
from chia_rs.sized_bytes import bytes32
|
|
9
8
|
from chia_rs.sized_ints import uint8, uint32, uint64
|
|
@@ -31,16 +30,16 @@ class CoinRecordOrder(IntEnum):
|
|
|
31
30
|
class GetCoinRecords(Streamable):
|
|
32
31
|
offset: uint32 = uint32(0)
|
|
33
32
|
limit: uint32 = uint32.MAXIMUM
|
|
34
|
-
wallet_id:
|
|
35
|
-
wallet_type:
|
|
36
|
-
coin_type:
|
|
37
|
-
coin_id_filter:
|
|
38
|
-
puzzle_hash_filter:
|
|
39
|
-
parent_coin_id_filter:
|
|
40
|
-
amount_filter:
|
|
41
|
-
amount_range:
|
|
42
|
-
confirmed_range:
|
|
43
|
-
spent_range:
|
|
33
|
+
wallet_id: uint32 | None = None
|
|
34
|
+
wallet_type: uint8 | None = None # WalletType
|
|
35
|
+
coin_type: uint8 | None = None # CoinType
|
|
36
|
+
coin_id_filter: HashFilter | None = None
|
|
37
|
+
puzzle_hash_filter: HashFilter | None = None
|
|
38
|
+
parent_coin_id_filter: HashFilter | None = None
|
|
39
|
+
amount_filter: AmountFilter | None = None
|
|
40
|
+
amount_range: UInt64Range | None = None
|
|
41
|
+
confirmed_range: UInt32Range | None = None
|
|
42
|
+
spent_range: UInt32Range | None = None
|
|
44
43
|
order: uint8 = uint8(CoinRecordOrder.confirmed_height)
|
|
45
44
|
reverse: bool = False
|
|
46
45
|
include_total_count: bool = False # Include the total number of entries for the query without applying offset/limit
|
|
@@ -50,7 +49,7 @@ class GetCoinRecords(Streamable):
|
|
|
50
49
|
class GetCoinRecordsResult:
|
|
51
50
|
records: list[WalletCoinRecord]
|
|
52
51
|
coin_id_to_record: dict[bytes32, WalletCoinRecord]
|
|
53
|
-
total_count:
|
|
52
|
+
total_count: uint32 | None
|
|
54
53
|
|
|
55
54
|
|
|
56
55
|
class WalletCoinStore:
|
|
@@ -115,7 +114,7 @@ class WalletCoinStore:
|
|
|
115
114
|
return int(0 if row is None else row[0])
|
|
116
115
|
|
|
117
116
|
# Store CoinRecord in DB and ram cache
|
|
118
|
-
async def add_coin_record(self, record: WalletCoinRecord, name:
|
|
117
|
+
async def add_coin_record(self, record: WalletCoinRecord, name: bytes32 | None = None) -> None:
|
|
119
118
|
if name is None:
|
|
120
119
|
name = record.name()
|
|
121
120
|
assert record.spent == (record.spent_block_height != 0)
|
|
@@ -174,7 +173,7 @@ class WalletCoinStore:
|
|
|
174
173
|
None if row[11] is None else VersionedBlob.from_bytes(row[11]),
|
|
175
174
|
)
|
|
176
175
|
|
|
177
|
-
async def get_coin_record(self, coin_name: bytes32) ->
|
|
176
|
+
async def get_coin_record(self, coin_name: bytes32) -> WalletCoinRecord | None:
|
|
178
177
|
"""Returns CoinRecord with specified coin id."""
|
|
179
178
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
180
179
|
rows = list(await conn.execute_fetchall("SELECT * from coin_record WHERE coin_name=?", (coin_name.hex(),)))
|
|
@@ -188,16 +187,16 @@ class WalletCoinStore:
|
|
|
188
187
|
*,
|
|
189
188
|
offset: uint32 = uint32(0),
|
|
190
189
|
limit: uint32 = uint32.MAXIMUM,
|
|
191
|
-
wallet_id:
|
|
192
|
-
wallet_type:
|
|
193
|
-
coin_type:
|
|
194
|
-
coin_id_filter:
|
|
195
|
-
puzzle_hash_filter:
|
|
196
|
-
parent_coin_id_filter:
|
|
197
|
-
amount_filter:
|
|
198
|
-
amount_range:
|
|
199
|
-
confirmed_range:
|
|
200
|
-
spent_range:
|
|
190
|
+
wallet_id: uint32 | None = None,
|
|
191
|
+
wallet_type: WalletType | None = None,
|
|
192
|
+
coin_type: CoinType | None = None,
|
|
193
|
+
coin_id_filter: HashFilter | None = None,
|
|
194
|
+
puzzle_hash_filter: HashFilter | None = None,
|
|
195
|
+
parent_coin_id_filter: HashFilter | None = None,
|
|
196
|
+
amount_filter: AmountFilter | None = None,
|
|
197
|
+
amount_range: UInt64Range | None = None,
|
|
198
|
+
confirmed_range: UInt32Range | None = None,
|
|
199
|
+
spent_range: UInt32Range | None = None,
|
|
201
200
|
order: CoinRecordOrder = CoinRecordOrder.confirmed_height,
|
|
202
201
|
reverse: bool = False,
|
|
203
202
|
include_total_count: bool = False,
|
|
@@ -282,7 +281,7 @@ class WalletCoinStore:
|
|
|
282
281
|
)
|
|
283
282
|
return [self.coin_record_from_row(row) for row in rows]
|
|
284
283
|
|
|
285
|
-
async def get_first_coin_height(self) ->
|
|
284
|
+
async def get_first_coin_height(self) -> uint32 | None:
|
|
286
285
|
"""Returns height of first confirmed coin"""
|
|
287
286
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
288
287
|
rows = list(await conn.execute_fetchall("SELECT MIN(confirmed_height) FROM coin_record"))
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
3
|
from chia_rs import CoinState
|
|
6
4
|
from chia_rs.sized_bytes import bytes32
|
|
7
5
|
from chia_rs.sized_ints import uint32
|
|
@@ -61,7 +59,7 @@ class WalletInterestedStore:
|
|
|
61
59
|
rows_hex = await cursor.fetchall()
|
|
62
60
|
return [(bytes32(bytes.fromhex(row[0])), row[1]) for row in rows_hex]
|
|
63
61
|
|
|
64
|
-
async def get_interested_puzzle_hash_wallet_id(self, puzzle_hash: bytes32) ->
|
|
62
|
+
async def get_interested_puzzle_hash_wallet_id(self, puzzle_hash: bytes32) -> int | None:
|
|
65
63
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
66
64
|
cursor = await conn.execute(
|
|
67
65
|
"SELECT wallet_id FROM interested_puzzle_hashes WHERE puzzle_hash=?", (puzzle_hash.hex(),)
|
|
@@ -89,7 +87,7 @@ class WalletInterestedStore:
|
|
|
89
87
|
self,
|
|
90
88
|
asset_id: bytes32,
|
|
91
89
|
name: str,
|
|
92
|
-
first_seen_height:
|
|
90
|
+
first_seen_height: uint32 | None,
|
|
93
91
|
sender_puzzle_hash: bytes32,
|
|
94
92
|
) -> None:
|
|
95
93
|
"""
|
|
@@ -131,7 +129,7 @@ class WalletInterestedStore:
|
|
|
131
129
|
self,
|
|
132
130
|
asset_id: bytes32,
|
|
133
131
|
coin_state: CoinState,
|
|
134
|
-
fork_height:
|
|
132
|
+
fork_height: uint32 | None,
|
|
135
133
|
) -> None:
|
|
136
134
|
"""
|
|
137
135
|
Add an unacknowledged coin state of a CAT to the database. It will be inserted into the retry store when the
|