chia-blockchain 2.5.4rc1__py3-none-any.whl → 2.5.5__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 +529 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +61 -132
- 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 +495 -265
- 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 +153 -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 +53 -47
- 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 +274 -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.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.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.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from enum import IntEnum
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
7
|
+
|
|
8
|
+
from chia_rs import G1Element
|
|
9
|
+
from chia_rs.sized_bytes import bytes32
|
|
10
|
+
from chia_rs.sized_ints import uint8, uint16
|
|
11
|
+
from typing_extensions import Self
|
|
12
|
+
|
|
13
|
+
from chia.types.blockchain_format.coin import Coin
|
|
14
|
+
from chia.types.blockchain_format.program import Program
|
|
15
|
+
from chia.util.streamable import Streamable, streamable
|
|
16
|
+
from chia.wallet.cat_wallet.cat_constants import DEFAULT_CATS
|
|
17
|
+
from chia.wallet.cat_wallet.cat_info import CATCoinData, RCATInfo
|
|
18
|
+
from chia.wallet.cat_wallet.cat_utils import (
|
|
19
|
+
CAT_MOD,
|
|
20
|
+
CAT_MOD_HASH,
|
|
21
|
+
CAT_MOD_HASH_HASH,
|
|
22
|
+
QUOTED_CAT_MOD_HASH,
|
|
23
|
+
construct_cat_puzzle,
|
|
24
|
+
)
|
|
25
|
+
from chia.wallet.cat_wallet.cat_wallet import CATWallet
|
|
26
|
+
from chia.wallet.cat_wallet.lineage_store import CATLineageStore
|
|
27
|
+
from chia.wallet.conditions import (
|
|
28
|
+
Condition,
|
|
29
|
+
CreateCoin,
|
|
30
|
+
)
|
|
31
|
+
from chia.wallet.derivation_record import DerivationRecord
|
|
32
|
+
from chia.wallet.lineage_proof import LineageProof
|
|
33
|
+
from chia.wallet.outer_puzzles import AssetType
|
|
34
|
+
from chia.wallet.puzzle_drivers import PuzzleInfo
|
|
35
|
+
from chia.wallet.util.curry_and_treehash import curry_and_treehash
|
|
36
|
+
from chia.wallet.util.wallet_types import WalletType
|
|
37
|
+
from chia.wallet.vc_wallet.vc_drivers import create_revocation_layer, solve_revocation_layer
|
|
38
|
+
from chia.wallet.wallet import Wallet
|
|
39
|
+
from chia.wallet.wallet_info import WalletInfo
|
|
40
|
+
from chia.wallet.wallet_protocol import WalletProtocol
|
|
41
|
+
|
|
42
|
+
if TYPE_CHECKING:
|
|
43
|
+
from chia.wallet.wallet_state_manager import WalletStateManager
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class RCATVersion(IntEnum):
|
|
47
|
+
V1 = uint16(1)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@streamable
|
|
51
|
+
@dataclass(frozen=True)
|
|
52
|
+
class RCATMetadata(Streamable):
|
|
53
|
+
lineage_proof: LineageProof
|
|
54
|
+
inner_puzzle_hash: bytes32
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class RCATWallet(CATWallet):
|
|
58
|
+
if TYPE_CHECKING:
|
|
59
|
+
_protocol_check: ClassVar[WalletProtocol[CATCoinData]] = cast("RCATWallet", None)
|
|
60
|
+
|
|
61
|
+
wallet_state_manager: WalletStateManager
|
|
62
|
+
log: logging.Logger
|
|
63
|
+
wallet_info: WalletInfo
|
|
64
|
+
cat_info: RCATInfo
|
|
65
|
+
standard_wallet: Wallet
|
|
66
|
+
lineage_store: CATLineageStore
|
|
67
|
+
wallet_type: ClassVar[WalletType] = WalletType.RCAT
|
|
68
|
+
wallet_info_type: ClassVar[type[RCATInfo]] = RCATInfo
|
|
69
|
+
|
|
70
|
+
# this is a legacy method and is not available on R-CAT wallets
|
|
71
|
+
create_new_cat_wallet = None # type: ignore[assignment]
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
|
|
75
|
+
return f"Revocable-CAT {limitations_program_hash_hex[:16]}..."
|
|
76
|
+
|
|
77
|
+
# We need to override this with a different signature.
|
|
78
|
+
# It's not immediately clear what is proper here, likely needs a bit of a refactor.
|
|
79
|
+
@classmethod
|
|
80
|
+
async def get_or_create_wallet_for_cat( # type: ignore[override]
|
|
81
|
+
cls,
|
|
82
|
+
wallet_state_manager: WalletStateManager,
|
|
83
|
+
wallet: Wallet,
|
|
84
|
+
limitations_program_hash_hex: str,
|
|
85
|
+
hidden_puzzle_hash: bytes32,
|
|
86
|
+
name: Optional[str] = None,
|
|
87
|
+
) -> Self:
|
|
88
|
+
self = cls()
|
|
89
|
+
self.standard_wallet = wallet
|
|
90
|
+
self.log = logging.getLogger(__name__)
|
|
91
|
+
|
|
92
|
+
limitations_program_hash_hex = bytes32.from_hexstr(limitations_program_hash_hex).hex() # Normalize the format
|
|
93
|
+
|
|
94
|
+
for id, w in wallet_state_manager.wallets.items():
|
|
95
|
+
if w.type() == cls.type():
|
|
96
|
+
assert isinstance(w, cls)
|
|
97
|
+
if w.get_asset_id() == limitations_program_hash_hex:
|
|
98
|
+
self.log.warning("Not creating wallet for already existing CAT wallet")
|
|
99
|
+
return w
|
|
100
|
+
|
|
101
|
+
self.wallet_state_manager = wallet_state_manager
|
|
102
|
+
if limitations_program_hash_hex in DEFAULT_CATS:
|
|
103
|
+
cat_info = DEFAULT_CATS[limitations_program_hash_hex]
|
|
104
|
+
name = cat_info["name"]
|
|
105
|
+
elif name is None:
|
|
106
|
+
name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
|
|
107
|
+
|
|
108
|
+
limitations_program_hash = bytes32.from_hexstr(limitations_program_hash_hex)
|
|
109
|
+
self.cat_info = cls.wallet_info_type(limitations_program_hash, None, hidden_puzzle_hash)
|
|
110
|
+
info_as_string = bytes(self.cat_info).hex()
|
|
111
|
+
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, cls.wallet_type, info_as_string)
|
|
112
|
+
|
|
113
|
+
self.lineage_store = await CATLineageStore.create(self.wallet_state_manager.db_wrapper, self.get_asset_id())
|
|
114
|
+
# Inherited from duplicating parent
|
|
115
|
+
await self.wallet_state_manager.add_new_wallet(self)
|
|
116
|
+
|
|
117
|
+
delete: bool = False
|
|
118
|
+
for state in await self.wallet_state_manager.interested_store.get_unacknowledged_states_for_asset_id(
|
|
119
|
+
limitations_program_hash
|
|
120
|
+
):
|
|
121
|
+
new_peer = self.wallet_state_manager.wallet_node.get_full_node_peer()
|
|
122
|
+
if new_peer is not None:
|
|
123
|
+
delete = True
|
|
124
|
+
peer_id: bytes32 = new_peer.peer_node_id
|
|
125
|
+
await self.wallet_state_manager.retry_store.add_state(state[0], peer_id, state[1])
|
|
126
|
+
|
|
127
|
+
if delete:
|
|
128
|
+
await self.wallet_state_manager.interested_store.delete_unacknowledged_states_for_asset_id(
|
|
129
|
+
limitations_program_hash
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
return self
|
|
133
|
+
|
|
134
|
+
@classmethod
|
|
135
|
+
async def create_from_puzzle_info(
|
|
136
|
+
cls,
|
|
137
|
+
wallet_state_manager: WalletStateManager,
|
|
138
|
+
wallet: Wallet,
|
|
139
|
+
puzzle_driver: PuzzleInfo,
|
|
140
|
+
name: Optional[str] = None,
|
|
141
|
+
# We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
|
|
142
|
+
potential_subclasses: dict[AssetType, Any] = {},
|
|
143
|
+
) -> Any:
|
|
144
|
+
rev_layer: Optional[PuzzleInfo] = puzzle_driver.also()
|
|
145
|
+
if rev_layer is None:
|
|
146
|
+
raise ValueError("create_from_puzzle_info called on RCATWallet with a non R-CAT puzzle driver")
|
|
147
|
+
return await cls.get_or_create_wallet_for_cat(
|
|
148
|
+
wallet_state_manager,
|
|
149
|
+
wallet,
|
|
150
|
+
puzzle_driver["tail"].hex(),
|
|
151
|
+
bytes32(rev_layer["hidden_puzzle_hash"]),
|
|
152
|
+
name,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def cost_of_single_tx(self) -> int:
|
|
157
|
+
return 78000000 # Estimate measured in testing
|
|
158
|
+
|
|
159
|
+
@classmethod
|
|
160
|
+
async def convert_to_revocable(
|
|
161
|
+
cls,
|
|
162
|
+
cat_wallet: CATWallet,
|
|
163
|
+
hidden_puzzle_hash: bytes32,
|
|
164
|
+
) -> bool:
|
|
165
|
+
if not cat_wallet.lineage_store.is_empty():
|
|
166
|
+
cat_wallet.log.error("Received a revocable CAT to a CAT wallet that already has CATs")
|
|
167
|
+
return False
|
|
168
|
+
replace_self = cls()
|
|
169
|
+
replace_self.standard_wallet = cat_wallet.standard_wallet
|
|
170
|
+
replace_self.log = logging.getLogger(cat_wallet.get_name())
|
|
171
|
+
replace_self.log.info(f"Converting CAT wallet {cat_wallet.id()} to R-CAT wallet")
|
|
172
|
+
replace_self.wallet_state_manager = cat_wallet.wallet_state_manager
|
|
173
|
+
replace_self.lineage_store = cat_wallet.lineage_store
|
|
174
|
+
replace_self.cat_info = cls.wallet_info_type(
|
|
175
|
+
cat_wallet.cat_info.limitations_program_hash, None, hidden_puzzle_hash
|
|
176
|
+
)
|
|
177
|
+
await cat_wallet.wallet_state_manager.user_store.update_wallet(
|
|
178
|
+
WalletInfo(
|
|
179
|
+
cat_wallet.id(), cat_wallet.get_name(), uint8(cls.wallet_type.value), bytes(replace_self.cat_info).hex()
|
|
180
|
+
)
|
|
181
|
+
)
|
|
182
|
+
updated_wallet_info = await cat_wallet.wallet_state_manager.user_store.get_wallet_by_id(cat_wallet.id())
|
|
183
|
+
assert updated_wallet_info is not None
|
|
184
|
+
replace_self.wallet_info = updated_wallet_info
|
|
185
|
+
|
|
186
|
+
cat_wallet.wallet_state_manager.wallets[cat_wallet.id()] = replace_self
|
|
187
|
+
await cat_wallet.wallet_state_manager.puzzle_store.delete_wallet(cat_wallet.id())
|
|
188
|
+
result = await cat_wallet.wallet_state_manager.create_more_puzzle_hashes()
|
|
189
|
+
await result.commit(cat_wallet.wallet_state_manager)
|
|
190
|
+
return True
|
|
191
|
+
|
|
192
|
+
def puzzle_for_pk(self, pubkey: G1Element) -> Program:
|
|
193
|
+
inner_puzzle = create_revocation_layer(
|
|
194
|
+
self.cat_info.hidden_puzzle_hash, self.standard_wallet.puzzle_hash_for_pk(pubkey)
|
|
195
|
+
)
|
|
196
|
+
cat_puzzle: Program = construct_cat_puzzle(CAT_MOD, self.cat_info.limitations_program_hash, inner_puzzle)
|
|
197
|
+
return cat_puzzle
|
|
198
|
+
|
|
199
|
+
def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32:
|
|
200
|
+
inner_puzzle_hash = create_revocation_layer(
|
|
201
|
+
self.cat_info.hidden_puzzle_hash, self.standard_wallet.puzzle_hash_for_pk(pubkey)
|
|
202
|
+
).get_tree_hash()
|
|
203
|
+
limitations_program_hash_hash = Program.to(self.cat_info.limitations_program_hash).get_tree_hash()
|
|
204
|
+
return curry_and_treehash(
|
|
205
|
+
QUOTED_CAT_MOD_HASH, CAT_MOD_HASH_HASH, limitations_program_hash_hash, inner_puzzle_hash
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
async def inner_puzzle_for_cat_puzhash(self, cat_hash: bytes32) -> Program:
|
|
209
|
+
return create_revocation_layer(
|
|
210
|
+
self.cat_info.hidden_puzzle_hash, (await super().inner_puzzle_for_cat_puzhash(cat_hash)).get_tree_hash()
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
async def make_inner_solution(
|
|
214
|
+
self,
|
|
215
|
+
coin: Coin,
|
|
216
|
+
primaries: list[CreateCoin],
|
|
217
|
+
conditions: tuple[Condition, ...] = tuple(),
|
|
218
|
+
) -> Program:
|
|
219
|
+
record: Optional[
|
|
220
|
+
DerivationRecord
|
|
221
|
+
] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(coin.puzzle_hash)
|
|
222
|
+
if record is None:
|
|
223
|
+
raise RuntimeError(f"Missing Derivation Record for CAT puzzle_hash {coin.puzzle_hash}")
|
|
224
|
+
return solve_revocation_layer(
|
|
225
|
+
self.standard_wallet.puzzle_for_pk(record.pubkey),
|
|
226
|
+
(await super().make_inner_solution(coin, primaries=primaries, conditions=conditions)),
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
async def match_puzzle_info(self, puzzle_driver: PuzzleInfo) -> bool:
|
|
230
|
+
if (
|
|
231
|
+
AssetType(puzzle_driver.type()) == AssetType.CAT
|
|
232
|
+
and puzzle_driver["tail"] == self.cat_info.limitations_program_hash
|
|
233
|
+
):
|
|
234
|
+
inner_puzzle_driver: Optional[PuzzleInfo] = puzzle_driver.also()
|
|
235
|
+
if inner_puzzle_driver is None:
|
|
236
|
+
raise ValueError("Malformed puzzle driver passed to RCATWallet.match_puzzle_info")
|
|
237
|
+
return (
|
|
238
|
+
AssetType(inner_puzzle_driver.type()) == AssetType.REVOCATION_LAYER
|
|
239
|
+
and bytes32(inner_puzzle_driver["hidden_puzzle_hash"]) == self.cat_info.hidden_puzzle_hash
|
|
240
|
+
)
|
|
241
|
+
return False
|
|
242
|
+
|
|
243
|
+
async def get_puzzle_info(self, asset_id: bytes32) -> PuzzleInfo:
|
|
244
|
+
return PuzzleInfo(
|
|
245
|
+
{
|
|
246
|
+
"type": AssetType.CAT.value,
|
|
247
|
+
"tail": "0x" + self.get_asset_id(),
|
|
248
|
+
"also": {
|
|
249
|
+
"type": AssetType.REVOCATION_LAYER.value,
|
|
250
|
+
"hidden_puzzle_hash": "0x" + self.cat_info.hidden_puzzle_hash.hex(),
|
|
251
|
+
},
|
|
252
|
+
}
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
async def match_hinted_coin(self, coin: Coin, hint: bytes32) -> bool:
|
|
256
|
+
"""
|
|
257
|
+
This matches coins that are RCATs with the hint as the inner puzzle
|
|
258
|
+
"""
|
|
259
|
+
|
|
260
|
+
hint_inner_hash: bytes32 = create_revocation_layer(
|
|
261
|
+
self.cat_info.hidden_puzzle_hash,
|
|
262
|
+
hint,
|
|
263
|
+
).get_tree_hash()
|
|
264
|
+
if (
|
|
265
|
+
construct_cat_puzzle(
|
|
266
|
+
Program.to(CAT_MOD_HASH),
|
|
267
|
+
self.cat_info.limitations_program_hash,
|
|
268
|
+
hint_inner_hash,
|
|
269
|
+
mod_code_hash=CAT_MOD_HASH_HASH,
|
|
270
|
+
).get_tree_hash_precalc(hint, CAT_MOD_HASH, CAT_MOD_HASH_HASH, hint_inner_hash)
|
|
271
|
+
== coin.puzzle_hash
|
|
272
|
+
):
|
|
273
|
+
return True
|
|
274
|
+
return False
|
chia/wallet/conditions.py
CHANGED
|
@@ -8,10 +8,11 @@ from typing import Any, ClassVar, Optional, TypeVar, Union, final, get_type_hint
|
|
|
8
8
|
from chia_rs import Coin, G1Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
10
10
|
from chia_rs.sized_ints import uint8, uint32, uint64
|
|
11
|
-
from
|
|
11
|
+
from typing_extensions import Self
|
|
12
12
|
|
|
13
13
|
from chia.types.blockchain_format.program import Program
|
|
14
14
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
15
|
+
from chia.util.casts import int_from_bytes, int_to_bytes
|
|
15
16
|
from chia.util.hash import std_hash
|
|
16
17
|
from chia.util.streamable import Streamable, streamable
|
|
17
18
|
|
|
@@ -237,7 +238,7 @@ class CreateCoin(Condition):
|
|
|
237
238
|
return condition
|
|
238
239
|
|
|
239
240
|
@classmethod
|
|
240
|
-
def from_program(cls
|
|
241
|
+
def from_program(cls, program: Program) -> Self:
|
|
241
242
|
potential_memos: Program = program.at("rrr")
|
|
242
243
|
return cls(
|
|
243
244
|
bytes32(program.at("rf").as_atom()),
|
|
@@ -253,9 +254,6 @@ class CreateCoin(Condition):
|
|
|
253
254
|
return [self.puzzle_hash, self.amount, self.memos]
|
|
254
255
|
|
|
255
256
|
|
|
256
|
-
_T_CreateCoin = TypeVar("_T_CreateCoin", bound=CreateCoin)
|
|
257
|
-
|
|
258
|
-
|
|
259
257
|
@final
|
|
260
258
|
@streamable
|
|
261
259
|
@dataclass(frozen=True)
|
|
@@ -541,9 +539,6 @@ class MessageParticipant(Streamable):
|
|
|
541
539
|
)
|
|
542
540
|
|
|
543
541
|
|
|
544
|
-
_T_MessageCondition = TypeVar("_T_MessageCondition", bound="SendMessage")
|
|
545
|
-
|
|
546
|
-
|
|
547
542
|
@streamable
|
|
548
543
|
@dataclass(frozen=True)
|
|
549
544
|
class SendMessage(Condition):
|
|
@@ -564,7 +559,7 @@ class SendMessage(Condition):
|
|
|
564
559
|
|
|
565
560
|
def __post_init__(self) -> None:
|
|
566
561
|
if self.mode_integer is None and (self.sender is None or self.receiver is None):
|
|
567
|
-
raise ValueError("Must specify either mode_integer or both sender and
|
|
562
|
+
raise ValueError("Must specify either mode_integer or both sender and receiver")
|
|
568
563
|
|
|
569
564
|
if self.mode_integer is not None and self.sender is not None:
|
|
570
565
|
assert self.mode_integer >> 3 == self.sender.mode, (
|
|
@@ -607,7 +602,7 @@ class SendMessage(Condition):
|
|
|
607
602
|
return condition
|
|
608
603
|
|
|
609
604
|
@classmethod
|
|
610
|
-
def from_program(cls
|
|
605
|
+
def from_program(cls, program: Program) -> Self:
|
|
611
606
|
full_mode = uint8(program.at("rf").as_int())
|
|
612
607
|
var_args = list(program.at("rrr").as_iter())
|
|
613
608
|
return cls(
|
|
@@ -8,7 +8,7 @@ from chia_puzzles_py.programs import P2_PARENT as P2_PARENT_BYTES
|
|
|
8
8
|
from chia_rs.sized_bytes import bytes32
|
|
9
9
|
from chia_rs.sized_ints import uint64
|
|
10
10
|
|
|
11
|
-
from chia.types.blockchain_format.program import INFINITE_COST, Program
|
|
11
|
+
from chia.types.blockchain_format.program import INFINITE_COST, Program, run_with_cost, uncurry
|
|
12
12
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
13
13
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
14
14
|
from chia.wallet.nft_wallet.nft_puzzle_utils import create_nft_layer_puzzle_with_curry_params
|
|
@@ -45,9 +45,9 @@ def match_dl_singleton(puzzle: Union[Program, SerializedProgram]) -> tuple[bool,
|
|
|
45
45
|
"""
|
|
46
46
|
Given a puzzle test if it's a CAT and, if it is, return the curried arguments
|
|
47
47
|
"""
|
|
48
|
-
mod, singleton_curried_args =
|
|
48
|
+
mod, singleton_curried_args = uncurry(puzzle)
|
|
49
49
|
if mod == SINGLETON_TOP_LAYER_MOD:
|
|
50
|
-
mod, dl_curried_args = singleton_curried_args.at("rf")
|
|
50
|
+
mod, dl_curried_args = uncurry(singleton_curried_args.at("rf"))
|
|
51
51
|
if mod == NFT_STATE_LAYER_MOD and dl_curried_args.at("rrf") == ACS_MU_PH:
|
|
52
52
|
launcher_id = singleton_curried_args.at("frf")
|
|
53
53
|
root = dl_curried_args.at("rff")
|
|
@@ -99,7 +99,7 @@ def get_mirror_info(
|
|
|
99
99
|
parent_puzzle: Union[Program, SerializedProgram], parent_solution: Union[Program, SerializedProgram]
|
|
100
100
|
) -> tuple[bytes32, list[bytes]]:
|
|
101
101
|
assert type(parent_puzzle) is type(parent_solution)
|
|
102
|
-
_, conditions =
|
|
102
|
+
_, conditions = run_with_cost(parent_puzzle, INFINITE_COST, parent_solution)
|
|
103
103
|
for condition in conditions.as_iter():
|
|
104
104
|
if (
|
|
105
105
|
condition.first().as_python() == ConditionOpcode.CREATE_COIN
|
chia/wallet/derivation_record.py
CHANGED
|
@@ -7,6 +7,7 @@ from chia_rs import G1Element
|
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
8
8
|
from chia_rs.sized_ints import uint32
|
|
9
9
|
|
|
10
|
+
from chia.util.streamable import Streamable, streamable
|
|
10
11
|
from chia.wallet.util.wallet_types import WalletType
|
|
11
12
|
|
|
12
13
|
|
|
@@ -28,3 +29,35 @@ class DerivationRecord:
|
|
|
28
29
|
def pubkey(self) -> G1Element:
|
|
29
30
|
assert isinstance(self._pubkey, G1Element)
|
|
30
31
|
return self._pubkey
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@streamable
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class StreamableDerivationRecord(Streamable):
|
|
37
|
+
index: uint32
|
|
38
|
+
puzzle_hash: bytes32
|
|
39
|
+
pubkey: bytes
|
|
40
|
+
wallet_type: uint32
|
|
41
|
+
wallet_id: uint32
|
|
42
|
+
hardened: bool
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def from_standard(cls, record: DerivationRecord) -> StreamableDerivationRecord:
|
|
46
|
+
return cls(
|
|
47
|
+
record.index,
|
|
48
|
+
record.puzzle_hash,
|
|
49
|
+
bytes(record._pubkey),
|
|
50
|
+
uint32(record.wallet_type.value),
|
|
51
|
+
record.wallet_id,
|
|
52
|
+
record.hardened,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def to_standard(self) -> DerivationRecord:
|
|
56
|
+
return DerivationRecord(
|
|
57
|
+
self.index,
|
|
58
|
+
self.puzzle_hash,
|
|
59
|
+
G1Element.from_bytes(self.pubkey),
|
|
60
|
+
WalletType(self.wallet_type),
|
|
61
|
+
self.wallet_id,
|
|
62
|
+
self.hardened,
|
|
63
|
+
)
|
chia/wallet/derive_keys.py
CHANGED
|
@@ -6,7 +6,7 @@ from chia_rs import AugSchemeMPL, G1Element, PrivateKey
|
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint32
|
|
8
8
|
|
|
9
|
-
from chia.
|
|
9
|
+
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_hash_for_pk
|
|
10
10
|
|
|
11
11
|
# EIP 2334 bls key derivation
|
|
12
12
|
# https://eips.ethereum.org/EIPS/eip-2334
|
|
@@ -131,8 +131,8 @@ def match_address_to_sk(
|
|
|
131
131
|
|
|
132
132
|
for i in range(max_ph_to_search):
|
|
133
133
|
phs = [
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
puzzle_hash_for_pk(master_sk_to_wallet_sk(sk, uint32(i)).get_g1()),
|
|
135
|
+
puzzle_hash_for_pk(master_sk_to_wallet_sk_unhardened(sk, uint32(i)).get_g1()),
|
|
136
136
|
]
|
|
137
137
|
|
|
138
138
|
for address in search_list:
|
|
@@ -3,14 +3,23 @@ from __future__ import annotations
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Optional
|
|
5
5
|
|
|
6
|
+
from chia_rs import CoinState
|
|
6
7
|
from chia_rs.sized_bytes import bytes32
|
|
7
8
|
from chia_rs.sized_ints import uint16, uint64
|
|
8
9
|
|
|
9
|
-
from chia.protocols.wallet_protocol import CoinState
|
|
10
10
|
from chia.types.blockchain_format.coin import Coin
|
|
11
|
-
from chia.types.blockchain_format.program import Program
|
|
11
|
+
from chia.types.blockchain_format.program import NIL, Program
|
|
12
12
|
from chia.util.streamable import Streamable, streamable
|
|
13
13
|
from chia.wallet.lineage_proof import LineageProof
|
|
14
|
+
from chia.wallet.util.curry_and_treehash import NIL_TREEHASH
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def did_recovery_is_nil(recovery_program: Program) -> bool:
|
|
18
|
+
# cannot use set as not hashable
|
|
19
|
+
if recovery_program in (NIL, NIL_TREEHASH): # noqa: PLR6201
|
|
20
|
+
return True
|
|
21
|
+
else:
|
|
22
|
+
return False
|
|
14
23
|
|
|
15
24
|
|
|
16
25
|
@streamable
|
|
@@ -32,7 +41,7 @@ class DIDInfo(Streamable):
|
|
|
32
41
|
@dataclass(frozen=True)
|
|
33
42
|
class DIDCoinData(Streamable):
|
|
34
43
|
p2_puzzle: Program
|
|
35
|
-
recovery_list_hash: bytes32
|
|
44
|
+
recovery_list_hash: Optional[bytes32]
|
|
36
45
|
num_verification: uint16
|
|
37
46
|
singleton_struct: Program
|
|
38
47
|
metadata: Program
|