chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/blockchain/blockchain_test_utils.py +2 -3
- chia/_tests/blockchain/test_augmented_chain.py +2 -3
- chia/_tests/blockchain/test_blockchain.py +261 -44
- chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
- chia/_tests/blockchain/test_build_chains.py +197 -1
- chia/_tests/blockchain/test_get_block_generator.py +1 -1
- chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +3 -4
- chia/_tests/clvm/test_message_conditions.py +2 -2
- chia/_tests/clvm/test_puzzle_compression.py +2 -3
- chia/_tests/clvm/test_puzzles.py +1 -2
- chia/_tests/clvm/test_singletons.py +2 -3
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +30 -25
- chia/_tests/cmds/test_dev_gh.py +1 -1
- chia/_tests/cmds/test_farm_cmd.py +1 -1
- chia/_tests/cmds/test_show.py +1 -2
- chia/_tests/cmds/wallet/test_did.py +101 -56
- chia/_tests/cmds/wallet/test_nft.py +109 -84
- chia/_tests/cmds/wallet/test_notifications.py +1 -1
- chia/_tests/cmds/wallet/test_offer.toffer +1 -1
- chia/_tests/cmds/wallet/test_vcs.py +8 -8
- chia/_tests/cmds/wallet/test_wallet.py +100 -46
- chia/_tests/conftest.py +31 -20
- chia/_tests/connection_utils.py +1 -1
- chia/_tests/core/consensus/stores/__init__.py +0 -0
- chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
- chia/_tests/core/consensus/test_block_creation.py +2 -31
- chia/_tests/core/consensus/test_pot_iterations.py +38 -3
- chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
- chia/_tests/core/daemon/test_daemon.py +80 -0
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +14 -10
- chia/_tests/core/data_layer/test_data_store.py +5 -5
- chia/_tests/core/farmer/test_farmer_api.py +2 -2
- chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
- chia/_tests/core/full_node/ram_db.py +3 -1
- chia/_tests/core/full_node/stores/test_block_store.py +28 -16
- chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
- chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_address_manager.py +200 -27
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +7 -6
- chia/_tests/core/full_node/test_full_node.py +456 -40
- chia/_tests/core/full_node/test_generator_tools.py +32 -2
- chia/_tests/core/full_node/test_hint_management.py +1 -1
- chia/_tests/core/full_node/test_node_load.py +20 -21
- chia/_tests/core/full_node/test_performance.py +3 -4
- chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
- chia/_tests/core/full_node/test_subscriptions.py +1 -2
- chia/_tests/core/full_node/test_transactions.py +9 -5
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
- chia/_tests/core/large_block.py +1 -2
- chia/_tests/core/make_block_generator.py +3 -4
- chia/_tests/core/mempool/test_mempool.py +36 -86
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
- chia/_tests/core/mempool/test_mempool_manager.py +421 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
- chia/_tests/core/server/flood.py +1 -1
- chia/_tests/core/server/test_dos.py +1 -1
- chia/_tests/core/server/test_node_discovery.py +41 -27
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +1 -1
- chia/_tests/core/services/test_services.py +5 -5
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_cost_calculation.py +6 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_crawler_rpc.py +1 -1
- chia/_tests/core/test_db_conversion.py +3 -1
- chia/_tests/core/test_db_validation.py +5 -3
- chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
- chia/_tests/core/test_filter.py +4 -1
- chia/_tests/core/test_full_node_rpc.py +99 -82
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/util/test_block_cache.py +1 -1
- chia/_tests/core/util/test_keychain.py +2 -2
- chia/_tests/core/util/test_lockfile.py +1 -1
- chia/_tests/core/util/test_log_exceptions.py +5 -5
- chia/_tests/core/util/test_streamable.py +81 -22
- chia/_tests/db/test_db_wrapper.py +1 -3
- chia/_tests/environments/wallet.py +5 -5
- chia/_tests/farmer_harvester/test_farmer.py +9 -7
- chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/generator/test_compression.py +1 -2
- chia/_tests/generator/test_rom.py +8 -4
- chia/_tests/plot_sync/test_plot_sync.py +3 -3
- chia/_tests/plot_sync/test_receiver.py +3 -3
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +3 -3
- chia/_tests/plot_sync/util.py +2 -2
- chia/_tests/pools/test_pool_cmdline.py +48 -21
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
- chia/_tests/pools/test_pool_rpc.py +237 -105
- chia/_tests/pools/test_pool_wallet.py +11 -2
- chia/_tests/pools/test_wallet_pool_store.py +5 -4
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/simulation/test_simulation.py +13 -8
- chia/_tests/simulation/test_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +191 -47
- chia/_tests/timelord/test_timelord.py +1 -1
- chia/_tests/tools/test_full_sync.py +0 -2
- chia/_tests/tools/test_run_block.py +3 -1
- chia/_tests/util/benchmark_cost.py +3 -3
- chia/_tests/util/benchmarks.py +2 -2
- chia/_tests/util/blockchain.py +11 -5
- chia/_tests/util/blockchain_mock.py +1 -4
- chia/_tests/util/coin_store.py +29 -0
- chia/_tests/util/constants.py +2 -18
- chia/_tests/util/full_sync.py +3 -3
- chia/_tests/util/generator_tools_testing.py +2 -3
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +33 -31
- chia/_tests/util/network_protocol_data.py +19 -17
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +3 -1
- chia/_tests/util/run_block.py +2 -2
- chia/_tests/util/setup_nodes.py +7 -7
- chia/_tests/util/spend_sim.py +47 -55
- chia/_tests/util/test_condition_tools.py +5 -4
- chia/_tests/util/test_config.py +2 -2
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +12 -14
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_paginator.py +4 -4
- chia/_tests/util/test_priority_mutex.py +2 -2
- chia/_tests/util/test_replace_str_to_bytes.py +15 -5
- chia/_tests/util/test_ssl_check.py +1 -1
- chia/_tests/util/test_testnet_overrides.py +13 -3
- chia/_tests/util/time_out_assert.py +4 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
- chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
- chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
- chia/_tests/wallet/conftest.py +11 -12
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
- chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
- chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
- chia/_tests/wallet/nft_wallet/config.py +1 -1
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
- chia/_tests/wallet/rpc/test_wallet_rpc.py +305 -184
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
- chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
- chia/_tests/wallet/test_clvm_casts.py +88 -0
- chia/_tests/wallet/test_coin_management.py +1 -1
- chia/_tests/wallet/test_coin_selection.py +1 -1
- chia/_tests/wallet/test_conditions.py +1 -1
- chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
- chia/_tests/wallet/test_notifications.py +5 -3
- chia/_tests/wallet/test_sign_coin_spends.py +6 -6
- chia/_tests/wallet/test_signer_protocol.py +13 -12
- chia/_tests/wallet/test_singleton.py +1 -1
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +108 -29
- chia/_tests/wallet/test_wallet_action_scope.py +9 -2
- chia/_tests/wallet/test_wallet_blockchain.py +2 -3
- chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
- chia/_tests/wallet/test_wallet_node.py +2 -4
- chia/_tests/wallet/test_wallet_retry.py +4 -2
- chia/_tests/wallet/test_wallet_state_manager.py +191 -5
- chia/_tests/wallet/test_wallet_test_framework.py +1 -1
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
- chia/_tests/wallet/wallet_block_tools.py +6 -6
- chia/_tests/weight_proof/test_weight_proof.py +10 -48
- chia/apis.py +1 -1
- chia/cmds/beta.py +1 -1
- chia/cmds/chia.py +9 -9
- chia/cmds/cmd_classes.py +12 -11
- chia/cmds/cmd_helpers.py +1 -1
- chia/cmds/cmds_util.py +12 -9
- chia/cmds/coin_funcs.py +2 -2
- chia/cmds/configure.py +2 -2
- chia/cmds/data.py +0 -2
- chia/cmds/data_funcs.py +1 -1
- chia/cmds/db_validate_func.py +1 -2
- chia/cmds/dev/__init__.py +0 -0
- chia/cmds/dev/data.py +273 -0
- chia/cmds/{gh.py → dev/gh.py} +5 -5
- chia/cmds/dev/main.py +22 -0
- chia/cmds/dev/mempool.py +78 -0
- chia/cmds/dev/mempool_funcs.py +63 -0
- chia/cmds/farm_funcs.py +5 -4
- chia/cmds/init_funcs.py +11 -11
- chia/cmds/keys.py +2 -2
- chia/cmds/keys_funcs.py +4 -4
- chia/cmds/netspace_funcs.py +1 -1
- chia/cmds/peer_funcs.py +2 -2
- chia/cmds/plotnft_funcs.py +72 -26
- chia/cmds/rpc.py +1 -1
- chia/cmds/show_funcs.py +5 -5
- chia/cmds/signer.py +8 -7
- chia/cmds/sim_funcs.py +8 -9
- chia/cmds/wallet.py +2 -2
- chia/cmds/wallet_funcs.py +165 -131
- chia/{util → consensus}/augmented_chain.py +1 -2
- chia/consensus/block_body_validation.py +54 -40
- chia/consensus/block_creation.py +42 -76
- chia/consensus/block_header_validation.py +32 -26
- chia/consensus/block_record.py +0 -3
- chia/consensus/blockchain.py +23 -32
- chia/consensus/blockchain_interface.py +1 -5
- chia/consensus/check_time_locks.py +57 -0
- chia/consensus/coin_store_protocol.py +151 -0
- chia/consensus/coinbase.py +0 -6
- chia/consensus/condition_costs.py +4 -0
- chia/{util → consensus}/condition_tools.py +4 -5
- chia/consensus/cost_calculator.py +1 -1
- chia/consensus/default_constants.py +32 -9
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +1 -2
- chia/consensus/find_fork_point.py +1 -3
- chia/consensus/full_block_to_block_record.py +1 -6
- chia/{util → consensus}/generator_tools.py +1 -3
- chia/consensus/get_block_challenge.py +30 -7
- chia/consensus/make_sub_epoch_summary.py +1 -5
- chia/consensus/multiprocess_validation.py +21 -20
- chia/consensus/pot_iterations.py +74 -13
- chia/{util → consensus}/prev_transaction_block.py +1 -1
- chia/consensus/vdf_info_computation.py +1 -3
- chia/daemon/keychain_proxy.py +5 -5
- chia/daemon/server.py +22 -5
- chia/data_layer/data_layer.py +92 -51
- chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
- chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
- chia/data_layer/data_layer_util.py +4 -6
- chia/data_layer/data_layer_wallet.py +42 -69
- chia/data_layer/dl_wallet_store.py +12 -6
- chia/data_layer/download_data.py +3 -3
- chia/data_layer/s3_plugin_service.py +0 -1
- chia/farmer/farmer.py +3 -4
- chia/farmer/farmer_api.py +11 -7
- chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
- chia/full_node/block_height_map.py +7 -6
- chia/full_node/block_store.py +5 -7
- chia/full_node/bundle_tools.py +1 -2
- chia/full_node/coin_store.py +143 -124
- chia/{types → full_node}/eligible_coin_spends.py +39 -70
- chia/full_node/fee_estimator.py +1 -1
- chia/full_node/fee_estimator_interface.py +0 -8
- chia/full_node/fee_tracker.py +25 -25
- chia/full_node/full_node.py +70 -53
- chia/full_node/full_node_api.py +57 -40
- chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
- chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
- chia/full_node/full_node_store.py +23 -8
- chia/full_node/mempool.py +206 -53
- chia/full_node/mempool_check_conditions.py +20 -63
- chia/full_node/mempool_manager.py +26 -40
- chia/full_node/subscriptions.py +1 -3
- chia/full_node/tx_processing_queue.py +50 -3
- chia/full_node/weight_proof.py +46 -37
- chia/harvester/harvester.py +1 -1
- chia/harvester/harvester_api.py +22 -7
- chia/introducer/introducer.py +1 -1
- chia/introducer/introducer_api.py +1 -1
- chia/plot_sync/exceptions.py +1 -1
- chia/plot_sync/receiver.py +1 -1
- chia/plot_sync/sender.py +2 -2
- chia/pools/pool_puzzles.py +13 -18
- chia/pools/pool_wallet.py +23 -46
- chia/protocols/farmer_protocol.py +11 -3
- chia/protocols/full_node_protocol.py +1 -4
- chia/protocols/harvester_protocol.py +3 -3
- chia/protocols/pool_protocol.py +1 -2
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +1 -3
- chia/protocols/wallet_protocol.py +3 -3
- chia/rpc/rpc_client.py +7 -8
- chia/rpc/rpc_server.py +3 -3
- chia/rpc/util.py +3 -1
- chia/seeder/crawler.py +1 -1
- chia/seeder/crawler_api.py +1 -1
- chia/seeder/dns_server.py +2 -0
- chia/seeder/start_crawler.py +3 -3
- chia/server/address_manager.py +286 -38
- chia/server/address_manager_store.py +0 -215
- chia/{types → server}/aliases.py +7 -7
- chia/server/api_protocol.py +1 -1
- chia/server/chia_policy.py +1 -1
- chia/server/node_discovery.py +76 -113
- chia/server/rate_limits.py +1 -1
- chia/server/resolve_peer_info.py +43 -0
- chia/server/server.py +5 -5
- chia/server/start_data_layer.py +4 -4
- chia/server/start_farmer.py +5 -4
- chia/server/start_full_node.py +5 -4
- chia/server/start_harvester.py +7 -5
- chia/server/start_introducer.py +2 -2
- chia/server/start_service.py +1 -1
- chia/server/start_timelord.py +7 -5
- chia/server/start_wallet.py +7 -5
- chia/server/ws_connection.py +1 -1
- chia/simulator/add_blocks_in_batches.py +2 -2
- chia/simulator/block_tools.py +245 -201
- chia/simulator/full_node_simulator.py +38 -10
- chia/simulator/setup_services.py +12 -12
- chia/simulator/simulator_full_node_rpc_api.py +2 -2
- chia/simulator/simulator_full_node_rpc_client.py +2 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +1 -1
- chia/simulator/wallet_tools.py +10 -18
- chia/ssl/create_ssl.py +1 -1
- chia/timelord/iters_from_block.py +14 -14
- chia/timelord/timelord.py +15 -11
- chia/timelord/timelord_api.py +14 -2
- chia/timelord/timelord_state.py +20 -14
- chia/types/blockchain_format/program.py +53 -10
- chia/types/blockchain_format/proof_of_space.py +73 -19
- chia/types/coin_spend.py +3 -56
- chia/types/generator_types.py +28 -0
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +12 -7
- chia/types/unfinished_header_block.py +1 -2
- chia/types/validation_state.py +1 -2
- chia/types/weight_proof.py +1 -3
- chia/util/action_scope.py +3 -3
- chia/util/block_cache.py +1 -2
- chia/util/byte_types.py +1 -1
- chia/util/casts.py +21 -0
- chia/util/config.py +0 -37
- chia/util/db_wrapper.py +8 -1
- chia/util/errors.py +3 -2
- chia/util/initial-config.yaml +21 -5
- chia/util/keychain.py +6 -7
- chia/util/keyring_wrapper.py +5 -5
- chia/util/limited_semaphore.py +1 -1
- chia/util/priority_mutex.py +1 -1
- chia/util/streamable.py +63 -5
- chia/util/task_timing.py +1 -1
- chia/util/virtual_project_analysis.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +7 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
- chia/wallet/cat_wallet/cat_utils.py +1 -1
- chia/wallet/cat_wallet/cat_wallet.py +44 -36
- chia/wallet/cat_wallet/lineage_store.py +7 -0
- chia/wallet/cat_wallet/r_cat_wallet.py +273 -0
- chia/wallet/conditions.py +5 -10
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
- chia/wallet/derivation_record.py +33 -0
- chia/wallet/derive_keys.py +3 -3
- chia/wallet/did_wallet/did_info.py +12 -3
- chia/wallet/did_wallet/did_wallet.py +132 -101
- chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
- chia/wallet/driver_protocol.py +3 -1
- chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
- chia/wallet/nft_wallet/nft_wallet.py +69 -112
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
- chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
- chia/wallet/nft_wallet/uncurry_nft.py +4 -6
- chia/wallet/notification_manager.py +2 -3
- chia/wallet/outer_puzzles.py +7 -2
- chia/wallet/puzzle_drivers.py +1 -1
- chia/wallet/puzzles/clawback/drivers.py +5 -4
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
- chia/wallet/puzzles/singleton_top_layer.py +2 -1
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
- chia/wallet/puzzles/tails.py +1 -3
- chia/wallet/signer_protocol.py +5 -6
- chia/wallet/singleton.py +5 -4
- chia/wallet/singleton_record.py +1 -1
- chia/wallet/trade_manager.py +18 -20
- chia/wallet/trade_record.py +3 -6
- chia/wallet/trading/offer.py +12 -13
- chia/wallet/uncurried_puzzle.py +2 -2
- chia/wallet/util/compute_additions.py +58 -0
- chia/wallet/util/compute_hints.py +3 -3
- chia/wallet/util/compute_memos.py +4 -4
- chia/wallet/util/curry_and_treehash.py +2 -1
- chia/wallet/util/debug_spend_bundle.py +1 -1
- chia/wallet/util/merkle_tree.py +1 -1
- chia/wallet/util/peer_request_cache.py +1 -2
- chia/wallet/util/tx_config.py +3 -8
- chia/wallet/util/wallet_sync_utils.py +10 -5
- chia/wallet/util/wallet_types.py +1 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
- chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
- chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
- chia/wallet/vc_wallet/vc_drivers.py +50 -8
- chia/wallet/vc_wallet/vc_store.py +3 -5
- chia/wallet/vc_wallet/vc_wallet.py +15 -22
- chia/wallet/wallet.py +36 -46
- chia/wallet/wallet_action_scope.py +73 -4
- chia/wallet/wallet_blockchain.py +1 -3
- chia/wallet/wallet_interested_store.py +1 -1
- chia/wallet/wallet_nft_store.py +3 -3
- chia/wallet/wallet_node.py +17 -16
- chia/wallet/wallet_node_api.py +4 -5
- chia/wallet/wallet_pool_store.py +1 -1
- chia/wallet/wallet_protocol.py +2 -0
- chia/wallet/wallet_puzzle_store.py +1 -1
- chia/{rpc → wallet}/wallet_request_types.py +670 -81
- chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
- chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
- chia/wallet/wallet_singleton_store.py +8 -7
- chia/wallet/wallet_spend_bundle.py +4 -3
- chia/wallet/wallet_state_manager.py +320 -191
- chia/wallet/wallet_weight_proof_handler.py +1 -2
- chia/wallet/wsm_apis.py +98 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/RECORD +443 -436
- mozilla-ca/cacert.pem +3 -165
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
- chia/cmds/dev.py +0 -18
- chia/types/blockchain_format/slots.py +0 -9
- chia/types/blockchain_format/sub_epoch_summary.py +0 -5
- chia/types/end_of_slot_bundle.py +0 -5
- chia/types/full_block.py +0 -5
- chia/types/header_block.py +0 -5
- chia/types/spend_bundle_conditions.py +0 -7
- chia/types/transaction_queue_entry.py +0 -56
- chia/types/unfinished_block.py +0 -5
- /chia/cmds/{installers.py → dev/installers.py} +0 -0
- /chia/cmds/{sim.py → dev/sim.py} +0 -0
- /chia/{util → cmds}/dump_keyring.py +0 -0
- /chia/{full_node → consensus}/signage_point.py +0 -0
- /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
- /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
- /chia/{util → full_node}/full_block_utils.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
- /chia/{full_node → protocols}/fee_estimate.py +0 -0
- /chia/{server → protocols}/outbound_message.py +0 -0
- /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
- /chia/{util → simulator}/vdf_prover.py +0 -0
- /chia/{util → ssl}/ssl_check.py +0 -0
- /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/entry_points.txt +0 -0
chia/util/keyring_wrapper.py
CHANGED
|
@@ -24,10 +24,10 @@ from chia.util.file_keyring import FileKeyring
|
|
|
24
24
|
# WARNING: Changing the default passphrase will prevent passphrase-less users from accessing
|
|
25
25
|
# their existing keys. Using a new default passphrase requires migrating existing users to
|
|
26
26
|
# the new passphrase.
|
|
27
|
-
DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE = "$ chia passphrase set # all the cool kids are doing it!"
|
|
27
|
+
DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE = "$ chia passphrase set # all the cool kids are doing it!" # noqa: S105
|
|
28
28
|
|
|
29
|
-
MASTER_PASSPHRASE_SERVICE_NAME = "Chia Passphrase"
|
|
30
|
-
MASTER_PASSPHRASE_USER_NAME = "Chia Passphrase"
|
|
29
|
+
MASTER_PASSPHRASE_SERVICE_NAME = "Chia Passphrase" # noqa: S105
|
|
30
|
+
MASTER_PASSPHRASE_USER_NAME = "Chia Passphrase" # noqa: S105
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
OSPassphraseStore = Union[MacKeyring, WinKeyring]
|
|
@@ -112,7 +112,7 @@ def obtain_current_passphrase(prompt: str = DEFAULT_PASSPHRASE_PROMPT, use_passp
|
|
|
112
112
|
|
|
113
113
|
time.sleep(FAILED_ATTEMPT_DELAY)
|
|
114
114
|
print("Incorrect passphrase\n")
|
|
115
|
-
raise KeychainMaxUnlockAttempts
|
|
115
|
+
raise KeychainMaxUnlockAttempts
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
class KeyringWrapper:
|
|
@@ -254,7 +254,7 @@ class KeyringWrapper:
|
|
|
254
254
|
and current_passphrase is not None
|
|
255
255
|
and not self.master_passphrase_is_valid(current_passphrase)
|
|
256
256
|
):
|
|
257
|
-
raise KeychainCurrentPassphraseIsInvalid
|
|
257
|
+
raise KeychainCurrentPassphraseIsInvalid
|
|
258
258
|
|
|
259
259
|
self.set_cached_master_passphrase(new_passphrase, validated=True)
|
|
260
260
|
|
chia/util/limited_semaphore.py
CHANGED
chia/util/priority_mutex.py
CHANGED
|
@@ -66,7 +66,7 @@ class PriorityMutex(Generic[_T_Priority]):
|
|
|
66
66
|
if task is None:
|
|
67
67
|
raise Exception(f"unable to check current task, got: {task!r}")
|
|
68
68
|
if self._active is not None and self._active.task is task:
|
|
69
|
-
raise NestedLockUnsupportedError
|
|
69
|
+
raise NestedLockUnsupportedError
|
|
70
70
|
|
|
71
71
|
element = _Element(task=task)
|
|
72
72
|
|
chia/util/streamable.py
CHANGED
|
@@ -13,7 +13,7 @@ from typing import TYPE_CHECKING, Any, BinaryIO, Callable, ClassVar, Optional, T
|
|
|
13
13
|
|
|
14
14
|
from chia_rs.sized_bytes import bytes32
|
|
15
15
|
from chia_rs.sized_ints import uint16, uint32, uint64
|
|
16
|
-
from typing_extensions import Literal, get_args, get_origin
|
|
16
|
+
from typing_extensions import Literal, Self, get_args, get_origin
|
|
17
17
|
|
|
18
18
|
from chia.util.byte_types import hexstr_to_bytes
|
|
19
19
|
from chia.util.hash import std_hash
|
|
@@ -126,6 +126,10 @@ def is_type_Tuple(f_type: object) -> bool:
|
|
|
126
126
|
return get_origin(f_type) is tuple or f_type is tuple
|
|
127
127
|
|
|
128
128
|
|
|
129
|
+
def is_type_Dict(f_type: object) -> bool:
|
|
130
|
+
return get_origin(f_type) is dict or f_type is dict
|
|
131
|
+
|
|
132
|
+
|
|
129
133
|
def convert_optional(convert_func: ConvertFunctionType, item: Any) -> Any:
|
|
130
134
|
if item is None:
|
|
131
135
|
return None
|
|
@@ -146,6 +150,12 @@ def convert_list(convert_func: ConvertFunctionType, items: list[Any]) -> list[An
|
|
|
146
150
|
return [convert_func(item) for item in items]
|
|
147
151
|
|
|
148
152
|
|
|
153
|
+
def convert_dict(
|
|
154
|
+
key_converter: ConvertFunctionType, value_converter: ConvertFunctionType, mapping: dict[Any, Any]
|
|
155
|
+
) -> dict[Any, Any]:
|
|
156
|
+
return {key_converter(key): value_converter(value) for key, value in mapping.items()}
|
|
157
|
+
|
|
158
|
+
|
|
149
159
|
def convert_hex_string(item: str) -> bytes:
|
|
150
160
|
if not isinstance(item, str):
|
|
151
161
|
raise InvalidTypeError(str, type(item))
|
|
@@ -213,6 +223,11 @@ def function_to_convert_one_item(
|
|
|
213
223
|
convert_inner_func = function_to_convert_one_item(inner_type, json_parser)
|
|
214
224
|
# Ignoring for now as the proper solution isn't obvious
|
|
215
225
|
return lambda items: convert_list(convert_inner_func, items) # type: ignore[arg-type]
|
|
226
|
+
elif is_type_Dict(f_type):
|
|
227
|
+
inner_types = get_args(f_type)
|
|
228
|
+
key_converter = function_to_convert_one_item(inner_types[0], json_parser)
|
|
229
|
+
value_converter = function_to_convert_one_item(inner_types[1], json_parser)
|
|
230
|
+
return lambda mapping: convert_dict(key_converter, value_converter, mapping) # type: ignore[arg-type]
|
|
216
231
|
elif hasattr(f_type, "from_json_dict"):
|
|
217
232
|
if json_parser is None:
|
|
218
233
|
json_parser = f_type.from_json_dict
|
|
@@ -257,6 +272,11 @@ def function_to_post_init_process_one_item(f_type: type[object]) -> ConvertFunct
|
|
|
257
272
|
inner_type = get_args(f_type)[0]
|
|
258
273
|
process_inner_func = function_to_post_init_process_one_item(inner_type)
|
|
259
274
|
return lambda items: convert_list(process_inner_func, items) # type: ignore[arg-type]
|
|
275
|
+
if is_type_Dict(f_type):
|
|
276
|
+
inner_types = get_args(f_type)
|
|
277
|
+
key_converter = function_to_post_init_process_one_item(inner_types[0])
|
|
278
|
+
value_converter = function_to_post_init_process_one_item(inner_types[1])
|
|
279
|
+
return lambda mapping: convert_dict(key_converter, value_converter, mapping) # type: ignore[arg-type]
|
|
260
280
|
return lambda item: post_init_process_item(f_type, item)
|
|
261
281
|
|
|
262
282
|
|
|
@@ -365,6 +385,19 @@ def parse_tuple(f: BinaryIO, list_parse_inner_type_f: list[ParseFunctionType]) -
|
|
|
365
385
|
return tuple(full_list)
|
|
366
386
|
|
|
367
387
|
|
|
388
|
+
def parse_dict(
|
|
389
|
+
f: BinaryIO, key_parse_inner_type_f: ParseFunctionType, value_parse_inner_type_f: ParseFunctionType
|
|
390
|
+
) -> dict[object, object]:
|
|
391
|
+
# We know this is a list of tuples but our parse_list hint doesn't help us here
|
|
392
|
+
keys_and_values: list[tuple[object, object]] = parse_list( # type: ignore[assignment]
|
|
393
|
+
f, lambda inner_f: parse_tuple(inner_f, [key_parse_inner_type_f, value_parse_inner_type_f])
|
|
394
|
+
)
|
|
395
|
+
parsed_dict: dict[object, object] = dict(keys_and_values)
|
|
396
|
+
if len(parsed_dict) < len(keys_and_values):
|
|
397
|
+
raise ValueError("duplicate dict keys found when deserializing")
|
|
398
|
+
return parsed_dict
|
|
399
|
+
|
|
400
|
+
|
|
368
401
|
def parse_str(f: BinaryIO) -> str:
|
|
369
402
|
str_size = parse_uint32(f)
|
|
370
403
|
str_read_bytes = f.read(str_size)
|
|
@@ -399,6 +432,11 @@ def function_to_parse_one_item(f_type: type[Any]) -> ParseFunctionType:
|
|
|
399
432
|
inner_types = get_args(f_type)
|
|
400
433
|
list_parse_inner_type_f = [function_to_parse_one_item(_) for _ in inner_types]
|
|
401
434
|
return lambda f: parse_tuple(f, list_parse_inner_type_f)
|
|
435
|
+
if is_type_Dict(f_type):
|
|
436
|
+
inner_types = get_args(f_type)
|
|
437
|
+
key_parse_inner_type_f = function_to_parse_one_item(inner_types[0])
|
|
438
|
+
value_parse_inner_type_f = function_to_parse_one_item(inner_types[1])
|
|
439
|
+
return lambda f: parse_dict(f, key_parse_inner_type_f, value_parse_inner_type_f)
|
|
402
440
|
if f_type is str:
|
|
403
441
|
return parse_str
|
|
404
442
|
raise UnsupportedType(f"Type {f_type} does not have parse")
|
|
@@ -429,6 +467,21 @@ def stream_tuple(stream_inner_type_funcs: list[StreamFunctionType], item: Any, f
|
|
|
429
467
|
stream_inner_type_funcs[i](item[i], f)
|
|
430
468
|
|
|
431
469
|
|
|
470
|
+
def stream_dict(
|
|
471
|
+
key_stream_inner_type_func: StreamFunctionType,
|
|
472
|
+
value_stream_inner_type_func: StreamFunctionType,
|
|
473
|
+
item: Any,
|
|
474
|
+
f: BinaryIO,
|
|
475
|
+
) -> None:
|
|
476
|
+
return stream_list(
|
|
477
|
+
lambda inner_item, inner_f: stream_tuple(
|
|
478
|
+
[key_stream_inner_type_func, value_stream_inner_type_func], inner_item, inner_f
|
|
479
|
+
),
|
|
480
|
+
list(item.items()),
|
|
481
|
+
f,
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
|
|
432
485
|
def stream_str(item: Any, f: BinaryIO) -> None:
|
|
433
486
|
str_bytes = item.encode("utf-8")
|
|
434
487
|
write_uint32(f, uint32(len(str_bytes)))
|
|
@@ -469,6 +522,11 @@ def function_to_stream_one_item(f_type: type[Any]) -> StreamFunctionType:
|
|
|
469
522
|
for i in range(len(inner_types)):
|
|
470
523
|
stream_inner_type_funcs.append(function_to_stream_one_item(inner_types[i]))
|
|
471
524
|
return lambda item, f: stream_tuple(stream_inner_type_funcs, item, f)
|
|
525
|
+
elif is_type_Dict(f_type):
|
|
526
|
+
inner_types = get_args(f_type)
|
|
527
|
+
key_stream_inner_type_func = function_to_stream_one_item(inner_types[0])
|
|
528
|
+
value_stream_inner_type_func = function_to_stream_one_item(inner_types[1])
|
|
529
|
+
return lambda item, f: stream_dict(key_stream_inner_type_func, value_stream_inner_type_func, item, f)
|
|
472
530
|
elif f_type is str:
|
|
473
531
|
return stream_str
|
|
474
532
|
elif f_type is bool:
|
|
@@ -575,9 +633,9 @@ class Streamable:
|
|
|
575
633
|
raise
|
|
576
634
|
|
|
577
635
|
@classmethod
|
|
578
|
-
def parse(cls
|
|
636
|
+
def parse(cls, f: BinaryIO) -> Self:
|
|
579
637
|
# Create the object without calling __init__() to avoid unnecessary post-init checks in strictdataclass
|
|
580
|
-
obj:
|
|
638
|
+
obj: Self = object.__new__(cls)
|
|
581
639
|
for field in cls._streamable_fields:
|
|
582
640
|
object.__setattr__(obj, field.name, field.parse_function(f))
|
|
583
641
|
return obj
|
|
@@ -590,7 +648,7 @@ class Streamable:
|
|
|
590
648
|
return std_hash(bytes(self), skip_bytes_conversion=True)
|
|
591
649
|
|
|
592
650
|
@classmethod
|
|
593
|
-
def from_bytes(cls
|
|
651
|
+
def from_bytes(cls, blob: bytes) -> Self:
|
|
594
652
|
f = io.BytesIO(blob)
|
|
595
653
|
parsed = cls.parse(f)
|
|
596
654
|
assert f.read() == b""
|
|
@@ -617,7 +675,7 @@ class Streamable:
|
|
|
617
675
|
return ret
|
|
618
676
|
|
|
619
677
|
@classmethod
|
|
620
|
-
def from_json_dict(cls
|
|
678
|
+
def from_json_dict(cls, json_dict: dict[str, Any]) -> Self:
|
|
621
679
|
return streamable_from_dict(cls, json_dict)
|
|
622
680
|
|
|
623
681
|
|
chia/util/task_timing.py
CHANGED
|
@@ -161,7 +161,7 @@ def find_all_dependency_paths(dependency_graph: dict[str, list[str]], start: str
|
|
|
161
161
|
if current in visited:
|
|
162
162
|
return
|
|
163
163
|
if current == target and len(path) > 0:
|
|
164
|
-
all_paths.append(path[1:]
|
|
164
|
+
all_paths.append([*path[1:], current])
|
|
165
165
|
return
|
|
166
166
|
visited.add(current)
|
|
167
167
|
for provider in sorted(dependency_graph.get(current, [])):
|
|
@@ -19,6 +19,12 @@ class CATInfo(Streamable):
|
|
|
19
19
|
my_tail: Optional[Program] # this is the program
|
|
20
20
|
|
|
21
21
|
|
|
22
|
+
@streamable
|
|
23
|
+
@dataclass(frozen=True)
|
|
24
|
+
class RCATInfo(CATInfo):
|
|
25
|
+
hidden_puzzle_hash: bytes32
|
|
26
|
+
|
|
27
|
+
|
|
22
28
|
@streamable
|
|
23
29
|
@dataclass(frozen=True)
|
|
24
30
|
class CATCoinData(Streamable):
|
|
@@ -41,8 +47,6 @@ class LegacyCATInfo(Streamable):
|
|
|
41
47
|
|
|
42
48
|
@streamable
|
|
43
49
|
@dataclass(frozen=True)
|
|
44
|
-
class CRCATInfo(
|
|
45
|
-
limitations_program_hash: bytes32
|
|
46
|
-
my_tail: Optional[Program] # this is the program
|
|
50
|
+
class CRCATInfo(CATInfo):
|
|
47
51
|
authorized_providers: list[bytes32]
|
|
48
52
|
proofs_checker: ProofsChecker
|
|
@@ -3,12 +3,12 @@ from __future__ import annotations
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Any, Callable, Optional
|
|
5
5
|
|
|
6
|
+
from chia_rs import CoinSpend
|
|
6
7
|
from chia_rs.sized_bytes import bytes32
|
|
7
8
|
from chia_rs.sized_ints import uint64
|
|
8
9
|
|
|
9
10
|
from chia.types.blockchain_format.coin import Coin
|
|
10
11
|
from chia.types.blockchain_format.program import Program
|
|
11
|
-
from chia.types.coin_spend import CoinSpend
|
|
12
12
|
from chia.wallet.cat_wallet.cat_utils import (
|
|
13
13
|
CAT_MOD,
|
|
14
14
|
SpendableCAT,
|
|
@@ -26,7 +26,7 @@ class CATOuterPuzzle:
|
|
|
26
26
|
_match: Callable[[UncurriedPuzzle], Optional[PuzzleInfo]]
|
|
27
27
|
_construct: Callable[[PuzzleInfo, Program], Program]
|
|
28
28
|
_solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
|
|
29
|
-
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle], Optional[Program]]
|
|
29
|
+
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Optional[Program]], Optional[Program]]
|
|
30
30
|
_get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
|
|
31
31
|
|
|
32
32
|
def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
|
|
@@ -43,14 +43,18 @@ class CATOuterPuzzle:
|
|
|
43
43
|
constructor_dict["also"] = next_constructor.info
|
|
44
44
|
return PuzzleInfo(constructor_dict)
|
|
45
45
|
|
|
46
|
-
def get_inner_puzzle(
|
|
46
|
+
def get_inner_puzzle(
|
|
47
|
+
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
|
|
48
|
+
) -> Optional[Program]:
|
|
47
49
|
args = match_cat_puzzle(puzzle_reveal)
|
|
48
50
|
if args is None:
|
|
49
51
|
raise ValueError("This driver is not for the specified puzzle reveal")
|
|
50
52
|
_, _, inner_puzzle = args
|
|
51
53
|
also = constructor.also()
|
|
52
54
|
if also is not None:
|
|
53
|
-
deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(
|
|
55
|
+
deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(
|
|
56
|
+
also, uncurry_puzzle(inner_puzzle), solution.first() if solution is not None else None
|
|
57
|
+
)
|
|
54
58
|
return deep_inner_puzzle
|
|
55
59
|
else:
|
|
56
60
|
return inner_puzzle
|
|
@@ -118,4 +122,4 @@ class CATOuterPuzzle:
|
|
|
118
122
|
)
|
|
119
123
|
)
|
|
120
124
|
bundle = unsigned_spend_bundle_for_spendable_cats(CAT_MOD, spendable_cats)
|
|
121
|
-
return next(cs.solution
|
|
125
|
+
return next(Program.from_serialized(cs.solution) for cs in bundle.coin_spends if cs.coin == target_coin)
|
|
@@ -8,11 +8,11 @@ from chia_puzzles_py.programs import CAT_PUZZLE, CAT_PUZZLE_HASH
|
|
|
8
8
|
from chia_rs import G2Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
10
10
|
|
|
11
|
+
from chia.consensus.condition_tools import conditions_dict_for_solution
|
|
11
12
|
from chia.types.blockchain_format.coin import Coin, coin_as_list
|
|
12
13
|
from chia.types.blockchain_format.program import INFINITE_COST, Program
|
|
13
14
|
from chia.types.coin_spend import make_spend
|
|
14
15
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
15
|
-
from chia.util.condition_tools import conditions_dict_for_solution
|
|
16
16
|
from chia.wallet.lineage_proof import LineageProof
|
|
17
17
|
from chia.wallet.uncurried_puzzle import UncurriedPuzzle
|
|
18
18
|
from chia.wallet.util.curry_and_treehash import calculate_hash_of_quoted_mod_hash
|
|
@@ -9,13 +9,12 @@ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
|
9
9
|
from chia_rs import G1Element
|
|
10
10
|
from chia_rs.sized_bytes import bytes32
|
|
11
11
|
from chia_rs.sized_ints import uint32, uint64, uint128
|
|
12
|
-
from typing_extensions import Unpack
|
|
12
|
+
from typing_extensions import Self, Unpack
|
|
13
13
|
|
|
14
14
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
15
15
|
from chia.server.ws_connection import WSChiaConnection
|
|
16
16
|
from chia.types.blockchain_format.coin import Coin
|
|
17
|
-
from chia.types.blockchain_format.program import Program
|
|
18
|
-
from chia.types.coin_spend import compute_additions_with_cost
|
|
17
|
+
from chia.types.blockchain_format.program import Program, run
|
|
19
18
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
20
19
|
from chia.util.byte_types import hexstr_to_bytes
|
|
21
20
|
from chia.util.errors import Err, ValidationError
|
|
@@ -49,6 +48,7 @@ from chia.wallet.puzzle_drivers import PuzzleInfo
|
|
|
49
48
|
from chia.wallet.puzzles.tails import ALL_LIMITATIONS_PROGRAMS
|
|
50
49
|
from chia.wallet.transaction_record import TransactionRecord
|
|
51
50
|
from chia.wallet.uncurried_puzzle import uncurry_puzzle
|
|
51
|
+
from chia.wallet.util.compute_additions import compute_additions_with_cost
|
|
52
52
|
from chia.wallet.util.compute_memos import compute_memos
|
|
53
53
|
from chia.wallet.util.curry_and_treehash import curry_and_treehash
|
|
54
54
|
from chia.wallet.util.transaction_type import TransactionType
|
|
@@ -93,6 +93,8 @@ class CATWallet:
|
|
|
93
93
|
cat_info: CATInfo
|
|
94
94
|
standard_wallet: Wallet
|
|
95
95
|
lineage_store: CATLineageStore
|
|
96
|
+
wallet_type: ClassVar[WalletType] = WalletType.CAT
|
|
97
|
+
wallet_info_type: ClassVar[type[CATInfo]] = CATInfo
|
|
96
98
|
|
|
97
99
|
@staticmethod
|
|
98
100
|
def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
|
|
@@ -120,7 +122,7 @@ class CATWallet:
|
|
|
120
122
|
|
|
121
123
|
# We use 00 bytes because it's not optional. We must check this is overridden during issuance.
|
|
122
124
|
empty_bytes = bytes32(32 * b"\0")
|
|
123
|
-
self.cat_info =
|
|
125
|
+
self.cat_info = self.wallet_info_type(empty_bytes, None)
|
|
124
126
|
info_as_string = bytes(self.cat_info).hex()
|
|
125
127
|
# If the name is not provided, it will be autogenerated based on the resulting tail hash.
|
|
126
128
|
# For now, give the wallet a temporary name "CAT WALLET" until we get the tail hash
|
|
@@ -128,7 +130,7 @@ class CATWallet:
|
|
|
128
130
|
if name is None:
|
|
129
131
|
name = "CAT WALLET"
|
|
130
132
|
|
|
131
|
-
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name,
|
|
133
|
+
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, self.wallet_type, info_as_string)
|
|
132
134
|
|
|
133
135
|
try:
|
|
134
136
|
spend_bundle = await ALL_LIMITATIONS_PROGRAMS[cat_tail_info["identifier"]].generate_issuance_bundle(
|
|
@@ -193,22 +195,23 @@ class CATWallet:
|
|
|
193
195
|
interface.side_effects.transactions.append(cat_record)
|
|
194
196
|
return self
|
|
195
197
|
|
|
196
|
-
@
|
|
198
|
+
@classmethod
|
|
197
199
|
async def get_or_create_wallet_for_cat(
|
|
200
|
+
cls,
|
|
198
201
|
wallet_state_manager: WalletStateManager,
|
|
199
202
|
wallet: Wallet,
|
|
200
203
|
limitations_program_hash_hex: str,
|
|
201
204
|
name: Optional[str] = None,
|
|
202
|
-
) ->
|
|
203
|
-
self =
|
|
205
|
+
) -> Self:
|
|
206
|
+
self = cls()
|
|
204
207
|
self.standard_wallet = wallet
|
|
205
208
|
self.log = logging.getLogger(__name__)
|
|
206
209
|
|
|
207
210
|
limitations_program_hash_hex = bytes32.from_hexstr(limitations_program_hash_hex).hex() # Normalize the format
|
|
208
211
|
|
|
209
212
|
for id, w in wallet_state_manager.wallets.items():
|
|
210
|
-
if w.type() ==
|
|
211
|
-
assert isinstance(w,
|
|
213
|
+
if w.type() == cls.type():
|
|
214
|
+
assert isinstance(w, cls)
|
|
212
215
|
if w.get_asset_id() == limitations_program_hash_hex:
|
|
213
216
|
self.log.warning("Not creating wallet for already existing CAT wallet")
|
|
214
217
|
return w
|
|
@@ -221,9 +224,9 @@ class CATWallet:
|
|
|
221
224
|
name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
|
|
222
225
|
|
|
223
226
|
limitations_program_hash = bytes32.from_hexstr(limitations_program_hash_hex)
|
|
224
|
-
self.cat_info =
|
|
227
|
+
self.cat_info = cls.wallet_info_type(limitations_program_hash, None)
|
|
225
228
|
info_as_string = bytes(self.cat_info).hex()
|
|
226
|
-
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name,
|
|
229
|
+
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, self.wallet_type, info_as_string)
|
|
227
230
|
|
|
228
231
|
self.lineage_store = await CATLineageStore.create(self.wallet_state_manager.db_wrapper, self.get_asset_id())
|
|
229
232
|
await self.wallet_state_manager.add_new_wallet(self)
|
|
@@ -272,13 +275,14 @@ class CATWallet:
|
|
|
272
275
|
name,
|
|
273
276
|
)
|
|
274
277
|
|
|
275
|
-
@
|
|
278
|
+
@classmethod
|
|
276
279
|
async def create(
|
|
280
|
+
cls,
|
|
277
281
|
wallet_state_manager: WalletStateManager,
|
|
278
282
|
wallet: Wallet,
|
|
279
283
|
wallet_info: WalletInfo,
|
|
280
|
-
) ->
|
|
281
|
-
self =
|
|
284
|
+
) -> Self:
|
|
285
|
+
self = cls()
|
|
282
286
|
|
|
283
287
|
self.log = logging.getLogger(__name__)
|
|
284
288
|
|
|
@@ -286,12 +290,12 @@ class CATWallet:
|
|
|
286
290
|
self.wallet_info = wallet_info
|
|
287
291
|
self.standard_wallet = wallet
|
|
288
292
|
try:
|
|
289
|
-
self.cat_info =
|
|
293
|
+
self.cat_info = cls.wallet_info_type.from_bytes(hexstr_to_bytes(self.wallet_info.data))
|
|
290
294
|
self.lineage_store = await CATLineageStore.create(self.wallet_state_manager.db_wrapper, self.get_asset_id())
|
|
291
295
|
except AssertionError:
|
|
292
296
|
# Do a migration of the lineage proofs
|
|
293
297
|
cat_info = LegacyCATInfo.from_bytes(hexstr_to_bytes(self.wallet_info.data))
|
|
294
|
-
self.cat_info =
|
|
298
|
+
self.cat_info = cls.wallet_info_type(cat_info.limitations_program_hash, cat_info.my_tail)
|
|
295
299
|
self.lineage_store = await CATLineageStore.create(self.wallet_state_manager.db_wrapper, self.get_asset_id())
|
|
296
300
|
for coin_id, lineage in cat_info.lineage_proofs:
|
|
297
301
|
await self.add_lineage(coin_id, lineage)
|
|
@@ -301,7 +305,7 @@ class CATWallet:
|
|
|
301
305
|
|
|
302
306
|
@classmethod
|
|
303
307
|
def type(cls) -> WalletType:
|
|
304
|
-
return
|
|
308
|
+
return cls.wallet_type
|
|
305
309
|
|
|
306
310
|
def id(self) -> uint32:
|
|
307
311
|
return self.wallet_info.id
|
|
@@ -352,15 +356,6 @@ class CATWallet:
|
|
|
352
356
|
def get_asset_id(self) -> str:
|
|
353
357
|
return bytes(self.cat_info.limitations_program_hash).hex()
|
|
354
358
|
|
|
355
|
-
async def set_tail_program(self, tail_program: str) -> None:
|
|
356
|
-
assert Program.fromhex(tail_program).get_tree_hash() == self.cat_info.limitations_program_hash
|
|
357
|
-
await self.save_info(
|
|
358
|
-
CATInfo(
|
|
359
|
-
self.cat_info.limitations_program_hash,
|
|
360
|
-
Program.fromhex(tail_program),
|
|
361
|
-
)
|
|
362
|
-
)
|
|
363
|
-
|
|
364
359
|
async def coin_added(
|
|
365
360
|
self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data: Optional[CATCoinData]
|
|
366
361
|
) -> None:
|
|
@@ -583,7 +578,7 @@ class CATWallet:
|
|
|
583
578
|
selected_amount = sum(c.amount for c in chia_coins)
|
|
584
579
|
await self.standard_wallet.generate_signed_transaction(
|
|
585
580
|
[uint64(selected_amount + amount_to_claim - fee)],
|
|
586
|
-
[
|
|
581
|
+
[await action_scope.get_puzzle_hash(self.wallet_state_manager)],
|
|
587
582
|
inner_action_scope,
|
|
588
583
|
coins=chia_coins,
|
|
589
584
|
negative_change_allowed=True,
|
|
@@ -596,7 +591,7 @@ class CATWallet:
|
|
|
596
591
|
continue
|
|
597
592
|
for spend in tx.spend_bundle.coin_spends:
|
|
598
593
|
if spend.coin.name() == origin_id:
|
|
599
|
-
conditions = spend.puzzle_reveal.
|
|
594
|
+
conditions = run(spend.puzzle_reveal, Program.from_serialized(spend.solution)).as_python()
|
|
600
595
|
for condition in conditions:
|
|
601
596
|
if condition[0] == ConditionOpcode.CREATE_COIN_ANNOUNCEMENT:
|
|
602
597
|
message = condition[1]
|
|
@@ -609,6 +604,14 @@ class CATWallet:
|
|
|
609
604
|
|
|
610
605
|
return announcement
|
|
611
606
|
|
|
607
|
+
async def make_inner_solution(
|
|
608
|
+
self,
|
|
609
|
+
coin: Coin,
|
|
610
|
+
primaries: list[CreateCoin],
|
|
611
|
+
conditions: tuple[Condition, ...] = tuple(),
|
|
612
|
+
) -> Program:
|
|
613
|
+
return self.standard_wallet.make_solution(primaries=primaries, conditions=conditions)
|
|
614
|
+
|
|
612
615
|
async def generate_unsigned_spendbundle(
|
|
613
616
|
self,
|
|
614
617
|
payments: list[CreateCoin],
|
|
@@ -657,10 +660,12 @@ class CATWallet:
|
|
|
657
660
|
for payment in payments:
|
|
658
661
|
if change_puzhash == payment.puzzle_hash and change == payment.amount:
|
|
659
662
|
# We cannot create two coins has same id, create a new puzhash for the change
|
|
660
|
-
change_puzhash = await
|
|
663
|
+
change_puzhash = await action_scope.get_puzzle_hash(
|
|
664
|
+
self.wallet_state_manager, override_reuse_puzhash_with=False
|
|
665
|
+
)
|
|
661
666
|
break
|
|
662
667
|
else:
|
|
663
|
-
change_puzhash = await
|
|
668
|
+
change_puzhash = await action_scope.get_puzzle_hash(self.wallet_state_manager)
|
|
664
669
|
primaries.append(CreateCoin(change_puzhash, uint64(change), [change_puzhash]))
|
|
665
670
|
|
|
666
671
|
# Loop through the coins we've selected and gather the information we need to spend them
|
|
@@ -692,7 +697,8 @@ class CATWallet:
|
|
|
692
697
|
action_scope,
|
|
693
698
|
extra_conditions=(announcement.corresponding_assertion(),),
|
|
694
699
|
)
|
|
695
|
-
innersol = self.
|
|
700
|
+
innersol = await self.make_inner_solution(
|
|
701
|
+
coin=coin,
|
|
696
702
|
primaries=primaries,
|
|
697
703
|
conditions=(*extra_conditions, announcement),
|
|
698
704
|
)
|
|
@@ -703,7 +709,8 @@ class CATWallet:
|
|
|
703
709
|
action_scope,
|
|
704
710
|
)
|
|
705
711
|
assert xch_announcement is not None
|
|
706
|
-
innersol = self.
|
|
712
|
+
innersol = await self.make_inner_solution(
|
|
713
|
+
coin=coin,
|
|
707
714
|
primaries=primaries,
|
|
708
715
|
conditions=(*extra_conditions, xch_announcement, announcement),
|
|
709
716
|
)
|
|
@@ -711,13 +718,14 @@ class CATWallet:
|
|
|
711
718
|
# TODO: what about when they are equal?
|
|
712
719
|
raise Exception("Equality not handled")
|
|
713
720
|
else:
|
|
714
|
-
innersol = self.
|
|
721
|
+
innersol = await self.make_inner_solution(
|
|
722
|
+
coin=coin,
|
|
715
723
|
primaries=primaries,
|
|
716
724
|
conditions=(*extra_conditions, announcement),
|
|
717
725
|
)
|
|
718
726
|
else:
|
|
719
|
-
innersol = self.
|
|
720
|
-
primaries=[], conditions=(announcement.corresponding_assertion(),)
|
|
727
|
+
innersol = await self.make_inner_solution(
|
|
728
|
+
coin=coin, primaries=[], conditions=(announcement.corresponding_assertion(),)
|
|
721
729
|
)
|
|
722
730
|
inner_puzzle = await self.inner_puzzle_for_cat_puzhash(coin.puzzle_hash)
|
|
723
731
|
lineage_proof = await self.get_lineage_proof_for_coin(coin)
|
|
@@ -73,3 +73,10 @@ class CATLineageStore:
|
|
|
73
73
|
lineage_dict[bytes32.from_hexstr(row[0])] = LineageProof.from_bytes(row[1])
|
|
74
74
|
|
|
75
75
|
return lineage_dict
|
|
76
|
+
|
|
77
|
+
async def is_empty(self) -> bool:
|
|
78
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
79
|
+
cursor = await conn.execute(f"SELECT COUNT(*) FROM {self.table_name}")
|
|
80
|
+
row_count = await cursor.fetchone()
|
|
81
|
+
assert row_count is not None
|
|
82
|
+
return bool(row_count[0] == 0)
|