chia-blockchain 2.5.4rc2__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 +47 -45
- 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.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc2.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.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
chia/data_layer/data_layer.py
CHANGED
|
@@ -56,10 +56,8 @@ from chia.data_layer.download_data import (
|
|
|
56
56
|
write_files_for_root,
|
|
57
57
|
)
|
|
58
58
|
from chia.data_layer.singleton_record import SingletonRecord
|
|
59
|
+
from chia.protocols.outbound_message import NodeType
|
|
59
60
|
from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
|
|
60
|
-
from chia.rpc.wallet_request_types import LogIn
|
|
61
|
-
from chia.rpc.wallet_rpc_client import WalletRpcClient
|
|
62
|
-
from chia.server.outbound_message import NodeType
|
|
63
61
|
from chia.server.server import ChiaServer
|
|
64
62
|
from chia.server.ws_connection import WSChiaConnection
|
|
65
63
|
from chia.util.async_pool import Job, QueuedAsyncPool
|
|
@@ -69,6 +67,32 @@ from chia.wallet.trade_record import TradeRecord
|
|
|
69
67
|
from chia.wallet.trading.offer import Offer as TradingOffer
|
|
70
68
|
from chia.wallet.transaction_record import TransactionRecord
|
|
71
69
|
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
70
|
+
from chia.wallet.wallet_request_types import (
|
|
71
|
+
CreateNewDL,
|
|
72
|
+
DLDeleteMirror,
|
|
73
|
+
DLGetMirrors,
|
|
74
|
+
DLHistory,
|
|
75
|
+
DLLatestSingleton,
|
|
76
|
+
DLNewMirror,
|
|
77
|
+
DLStopTracking,
|
|
78
|
+
DLTrackNew,
|
|
79
|
+
DLUpdateMultiple,
|
|
80
|
+
DLUpdateMultipleUpdates,
|
|
81
|
+
DLUpdateRoot,
|
|
82
|
+
LauncherRootPair,
|
|
83
|
+
LogIn,
|
|
84
|
+
)
|
|
85
|
+
from chia.wallet.wallet_rpc_client import WalletRpcClient
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def server_files_path_from_config(config: dict[str, Any], root_path: Path) -> Path:
|
|
89
|
+
server_files_replaced: Path = path_from_root(
|
|
90
|
+
root_path,
|
|
91
|
+
config.get("server_files_location", "data_layer/db/server_files_location_CHALLENGE").replace(
|
|
92
|
+
"CHALLENGE", config["selected_network"]
|
|
93
|
+
),
|
|
94
|
+
)
|
|
95
|
+
return server_files_replaced
|
|
72
96
|
|
|
73
97
|
|
|
74
98
|
async def get_plugin_info(plugin_remote: PluginRemote) -> tuple[PluginRemote, dict[str, Any]]:
|
|
@@ -162,9 +186,7 @@ class DataLayer:
|
|
|
162
186
|
# need this.
|
|
163
187
|
name = None
|
|
164
188
|
|
|
165
|
-
server_files_replaced
|
|
166
|
-
"server_files_location", "data_layer/db/server_files_location_CHALLENGE"
|
|
167
|
-
).replace("CHALLENGE", config["selected_network"])
|
|
189
|
+
server_files_replaced = server_files_path_from_config(config, root_path)
|
|
168
190
|
|
|
169
191
|
db_path_replaced: str = config["database_path"].replace("CHALLENGE", config["selected_network"])
|
|
170
192
|
|
|
@@ -174,7 +196,7 @@ class DataLayer:
|
|
|
174
196
|
wallet_rpc_init=wallet_rpc_init,
|
|
175
197
|
log=logging.getLogger(name if name is None else __name__),
|
|
176
198
|
db_path=path_from_root(root_path, db_path_replaced),
|
|
177
|
-
server_files_location=
|
|
199
|
+
server_files_location=server_files_replaced,
|
|
178
200
|
downloaders=downloaders,
|
|
179
201
|
uploaders=uploaders,
|
|
180
202
|
maximum_full_file_count=config.get("maximum_full_file_count", 1),
|
|
@@ -240,12 +262,12 @@ class DataLayer:
|
|
|
240
262
|
return result.fingerprint
|
|
241
263
|
|
|
242
264
|
async def create_store(self, fee: uint64, root: bytes32 = bytes32.zeros) -> tuple[list[TransactionRecord], bytes32]:
|
|
243
|
-
|
|
244
|
-
res = await self.data_store.create_tree(store_id=
|
|
265
|
+
create_res = await self.wallet_rpc.create_new_dl(CreateNewDL(root=root, fee=fee, push=True), DEFAULT_TX_CONFIG)
|
|
266
|
+
res = await self.data_store.create_tree(store_id=create_res.launcher_id)
|
|
245
267
|
if res is None:
|
|
246
268
|
self.log.fatal("failed creating store")
|
|
247
269
|
self.initialized = True
|
|
248
|
-
return
|
|
270
|
+
return create_res.transactions, create_res.launcher_id
|
|
249
271
|
|
|
250
272
|
async def batch_update(
|
|
251
273
|
self,
|
|
@@ -293,13 +315,15 @@ class DataLayer:
|
|
|
293
315
|
await self.data_store.clean_node_table()
|
|
294
316
|
|
|
295
317
|
if submit_on_chain:
|
|
296
|
-
|
|
318
|
+
updates: list[LauncherRootPair] = []
|
|
297
319
|
for store_id in store_ids:
|
|
298
320
|
await self._update_confirmation_status(store_id=store_id)
|
|
299
321
|
root_hash = await self._get_publishable_root_hash(store_id=store_id)
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
322
|
+
updates.append(LauncherRootPair(store_id, root_hash))
|
|
323
|
+
response = await self.wallet_rpc.dl_update_multiple(
|
|
324
|
+
DLUpdateMultiple(updates=DLUpdateMultipleUpdates(updates), fee=fee), DEFAULT_TX_CONFIG
|
|
325
|
+
)
|
|
326
|
+
return response.transactions
|
|
303
327
|
else:
|
|
304
328
|
return []
|
|
305
329
|
|
|
@@ -321,15 +345,17 @@ class DataLayer:
|
|
|
321
345
|
|
|
322
346
|
async def submit_all_pending_roots(self, fee: uint64) -> list[TransactionRecord]:
|
|
323
347
|
pending_roots = await self.data_store.get_all_pending_batches_roots()
|
|
324
|
-
|
|
348
|
+
updates: list[LauncherRootPair] = []
|
|
325
349
|
if len(pending_roots) == 0:
|
|
326
350
|
raise Exception("No pending roots found to submit")
|
|
327
351
|
for pending_root in pending_roots:
|
|
328
352
|
root_hash = pending_root.node_hash if pending_root.node_hash is not None else self.none_bytes
|
|
329
|
-
|
|
353
|
+
updates.append(LauncherRootPair(pending_root.store_id, root_hash))
|
|
330
354
|
await self.data_store.change_root_status(pending_root, Status.PENDING)
|
|
331
|
-
|
|
332
|
-
|
|
355
|
+
response = await self.wallet_rpc.dl_update_multiple(
|
|
356
|
+
DLUpdateMultiple(updates=DLUpdateMultipleUpdates(updates), fee=fee), DEFAULT_TX_CONFIG
|
|
357
|
+
)
|
|
358
|
+
return response.transactions
|
|
333
359
|
|
|
334
360
|
async def batch_insert(
|
|
335
361
|
self,
|
|
@@ -371,11 +397,17 @@ class DataLayer:
|
|
|
371
397
|
) -> TransactionRecord:
|
|
372
398
|
await self._update_confirmation_status(store_id=store_id)
|
|
373
399
|
root_hash = await self._get_publishable_root_hash(store_id=store_id)
|
|
374
|
-
transaction_record =
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
400
|
+
transaction_record = (
|
|
401
|
+
await self.wallet_rpc.dl_update_root(
|
|
402
|
+
DLUpdateRoot(
|
|
403
|
+
launcher_id=store_id,
|
|
404
|
+
new_root=root_hash,
|
|
405
|
+
fee=fee,
|
|
406
|
+
push=True,
|
|
407
|
+
),
|
|
408
|
+
DEFAULT_TX_CONFIG,
|
|
409
|
+
)
|
|
410
|
+
).tx_record
|
|
379
411
|
return transaction_record
|
|
380
412
|
|
|
381
413
|
async def get_key_value_hash(
|
|
@@ -455,7 +487,7 @@ class DataLayer:
|
|
|
455
487
|
return res
|
|
456
488
|
|
|
457
489
|
async def get_root(self, store_id: bytes32) -> Optional[SingletonRecord]:
|
|
458
|
-
latest = await self.wallet_rpc.dl_latest_singleton(store_id, True)
|
|
490
|
+
latest = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
|
|
459
491
|
if latest is None:
|
|
460
492
|
self.log.error(f"Failed to get root for {store_id.hex()}")
|
|
461
493
|
return latest
|
|
@@ -470,7 +502,7 @@ class DataLayer:
|
|
|
470
502
|
return res.node_hash
|
|
471
503
|
|
|
472
504
|
async def get_root_history(self, store_id: bytes32) -> list[SingletonRecord]:
|
|
473
|
-
records = await self.wallet_rpc.dl_history(store_id)
|
|
505
|
+
records = (await self.wallet_rpc.dl_history(DLHistory(store_id))).history
|
|
474
506
|
if records is None:
|
|
475
507
|
self.log.error(f"Failed to get root history for {store_id.hex()}")
|
|
476
508
|
root_history = []
|
|
@@ -487,7 +519,7 @@ class DataLayer:
|
|
|
487
519
|
root = await self.data_store.get_tree_root(store_id=store_id)
|
|
488
520
|
except Exception:
|
|
489
521
|
root = None
|
|
490
|
-
singleton_record
|
|
522
|
+
singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
|
|
491
523
|
if singleton_record is None:
|
|
492
524
|
return
|
|
493
525
|
if root is None:
|
|
@@ -510,11 +542,15 @@ class DataLayer:
|
|
|
510
542
|
"Maybe we're doing a batch update."
|
|
511
543
|
)
|
|
512
544
|
return
|
|
513
|
-
wallet_history =
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
545
|
+
wallet_history = (
|
|
546
|
+
await self.wallet_rpc.dl_history(
|
|
547
|
+
DLHistory(
|
|
548
|
+
launcher_id=store_id,
|
|
549
|
+
min_generation=uint32(root.generation + 1),
|
|
550
|
+
max_generation=singleton_record.generation,
|
|
551
|
+
)
|
|
552
|
+
)
|
|
553
|
+
).history
|
|
518
554
|
new_hashes = [record.root for record in reversed(wallet_history)]
|
|
519
555
|
root_hash = self.none_bytes if root.node_hash is None else root.node_hash
|
|
520
556
|
generation_shift = 0
|
|
@@ -538,7 +574,7 @@ class DataLayer:
|
|
|
538
574
|
await self.data_store.clear_pending_roots(store_id=store_id)
|
|
539
575
|
|
|
540
576
|
async def fetch_and_validate(self, store_id: bytes32) -> None:
|
|
541
|
-
singleton_record
|
|
577
|
+
singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
|
|
542
578
|
if singleton_record is None:
|
|
543
579
|
self.log.info(f"Fetch data: No singleton record for {store_id}.")
|
|
544
580
|
return
|
|
@@ -577,11 +613,15 @@ class DataLayer:
|
|
|
577
613
|
f"Server used: {url}."
|
|
578
614
|
)
|
|
579
615
|
|
|
580
|
-
to_download =
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
616
|
+
to_download = (
|
|
617
|
+
await self.wallet_rpc.dl_history(
|
|
618
|
+
DLHistory(
|
|
619
|
+
launcher_id=store_id,
|
|
620
|
+
min_generation=uint32(root.generation + 1),
|
|
621
|
+
max_generation=singleton_record.generation,
|
|
622
|
+
)
|
|
623
|
+
)
|
|
624
|
+
).history
|
|
585
625
|
try:
|
|
586
626
|
proxy_url = self.config.get("proxy_url", None)
|
|
587
627
|
success = await insert_from_delta_file(
|
|
@@ -653,7 +693,7 @@ class DataLayer:
|
|
|
653
693
|
return None
|
|
654
694
|
|
|
655
695
|
async def clean_old_full_tree_files(self, store_id: bytes32) -> None:
|
|
656
|
-
singleton_record
|
|
696
|
+
singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
|
|
657
697
|
if singleton_record is None:
|
|
658
698
|
return
|
|
659
699
|
await self._update_confirmation_status(store_id=store_id)
|
|
@@ -671,7 +711,7 @@ class DataLayer:
|
|
|
671
711
|
|
|
672
712
|
async def upload_files(self, store_id: bytes32) -> None:
|
|
673
713
|
uploaders = await self.get_uploaders(store_id)
|
|
674
|
-
singleton_record
|
|
714
|
+
singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
|
|
675
715
|
if singleton_record is None:
|
|
676
716
|
self.log.info(f"Upload files: no on-chain record for {store_id}.")
|
|
677
717
|
return
|
|
@@ -738,7 +778,7 @@ class DataLayer:
|
|
|
738
778
|
root = await self.data_store.get_tree_root(store_id=store_id)
|
|
739
779
|
latest_generation = root.generation
|
|
740
780
|
full_tree_first_publish_generation = max(0, latest_generation - self.maximum_full_file_count + 1)
|
|
741
|
-
singleton_record
|
|
781
|
+
singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
|
|
742
782
|
if singleton_record is None:
|
|
743
783
|
self.log.error(f"No singleton record found for: {store_id}")
|
|
744
784
|
return
|
|
@@ -783,7 +823,7 @@ class DataLayer:
|
|
|
783
823
|
async def subscribe(self, store_id: bytes32, urls: list[str]) -> Subscription:
|
|
784
824
|
parsed_urls = [url.rstrip("/") for url in urls]
|
|
785
825
|
subscription = Subscription(store_id, [ServerInfo(url, 0, 0) for url in parsed_urls])
|
|
786
|
-
await self.wallet_rpc.dl_track_new(subscription.store_id)
|
|
826
|
+
await self.wallet_rpc.dl_track_new(DLTrackNew(subscription.store_id))
|
|
787
827
|
async with self.subscription_lock:
|
|
788
828
|
await self.data_store.subscribe(subscription)
|
|
789
829
|
self.log.info(f"Done adding subscription: {subscription.store_id}")
|
|
@@ -835,7 +875,7 @@ class DataLayer:
|
|
|
835
875
|
)
|
|
836
876
|
|
|
837
877
|
# stop tracking first, then unsubscribe from the data store
|
|
838
|
-
await self.wallet_rpc.dl_stop_tracking(store_id)
|
|
878
|
+
await self.wallet_rpc.dl_stop_tracking(DLStopTracking(store_id))
|
|
839
879
|
await self.data_store.unsubscribe(store_id)
|
|
840
880
|
if not retain_data:
|
|
841
881
|
await self.data_store.delete_store_data(store_id)
|
|
@@ -854,26 +894,27 @@ class DataLayer:
|
|
|
854
894
|
async def add_mirror(self, store_id: bytes32, urls: list[str], amount: uint64, fee: uint64) -> None:
|
|
855
895
|
if not urls:
|
|
856
896
|
raise RuntimeError("URL list can't be empty")
|
|
857
|
-
|
|
858
|
-
|
|
897
|
+
await self.wallet_rpc.dl_new_mirror(
|
|
898
|
+
DLNewMirror(launcher_id=store_id, amount=amount, urls=urls, fee=fee, push=True), DEFAULT_TX_CONFIG
|
|
899
|
+
)
|
|
859
900
|
|
|
860
901
|
async def delete_mirror(self, coin_id: bytes32, fee: uint64) -> None:
|
|
861
|
-
await self.wallet_rpc.dl_delete_mirror(coin_id, fee)
|
|
902
|
+
await self.wallet_rpc.dl_delete_mirror(DLDeleteMirror(coin_id=coin_id, fee=fee, push=True), DEFAULT_TX_CONFIG)
|
|
862
903
|
|
|
863
904
|
async def get_mirrors(self, store_id: bytes32) -> list[Mirror]:
|
|
864
|
-
mirrors: list[Mirror] = await self.wallet_rpc.dl_get_mirrors(store_id)
|
|
905
|
+
mirrors: list[Mirror] = (await self.wallet_rpc.dl_get_mirrors(DLGetMirrors(store_id))).mirrors
|
|
865
906
|
return [mirror for mirror in mirrors if mirror.urls]
|
|
866
907
|
|
|
867
908
|
async def update_subscriptions_from_wallet(self, store_id: bytes32) -> None:
|
|
868
|
-
mirrors: list[Mirror] = await self.wallet_rpc.dl_get_mirrors(store_id)
|
|
909
|
+
mirrors: list[Mirror] = (await self.wallet_rpc.dl_get_mirrors(DLGetMirrors(store_id))).mirrors
|
|
869
910
|
urls: list[str] = []
|
|
870
911
|
for mirror in mirrors:
|
|
871
|
-
urls +=
|
|
912
|
+
urls += mirror.urls
|
|
872
913
|
urls = [url.rstrip("/") for url in urls]
|
|
873
914
|
await self.data_store.update_subscriptions_from_wallet(store_id, urls)
|
|
874
915
|
|
|
875
916
|
async def get_owned_stores(self) -> list[SingletonRecord]:
|
|
876
|
-
return await self.wallet_rpc.dl_owned_singletons()
|
|
917
|
+
return (await self.wallet_rpc.dl_owned_singletons()).singletons
|
|
877
918
|
|
|
878
919
|
async def get_kv_diff(self, store_id: bytes32, hash_1: bytes32, hash_2: bytes32) -> set[DiffData]:
|
|
879
920
|
return await self.data_store.get_kv_diff(store_id, hash_1, hash_2)
|
|
@@ -898,7 +939,7 @@ class DataLayer:
|
|
|
898
939
|
try:
|
|
899
940
|
subscriptions = await self.data_store.get_subscriptions()
|
|
900
941
|
for subscription in subscriptions:
|
|
901
|
-
await self.wallet_rpc.dl_track_new(subscription.store_id)
|
|
942
|
+
await self.wallet_rpc.dl_track_new(DLTrackNew(subscription.store_id))
|
|
902
943
|
break
|
|
903
944
|
except aiohttp.client_exceptions.ClientConnectorError:
|
|
904
945
|
pass
|
|
@@ -1248,7 +1289,7 @@ class DataLayer:
|
|
|
1248
1289
|
if not await self.data_store.store_id_exists(store_id=store_id):
|
|
1249
1290
|
raise Exception(f"No store id stored in the local database for {store_id}")
|
|
1250
1291
|
root = await self.data_store.get_tree_root(store_id=store_id)
|
|
1251
|
-
singleton_record = await self.wallet_rpc.dl_latest_singleton(store_id, True)
|
|
1292
|
+
singleton_record = (await self.wallet_rpc.dl_latest_singleton(DLLatestSingleton(store_id, True))).singleton
|
|
1252
1293
|
if singleton_record is None:
|
|
1253
1294
|
raise Exception(f"No singleton found for {store_id}")
|
|
1254
1295
|
|
|
@@ -8,6 +8,7 @@ from chia_rs.sized_bytes import bytes32
|
|
|
8
8
|
from chia_rs.sized_ints import uint8, uint64
|
|
9
9
|
|
|
10
10
|
from chia.data_layer.data_layer_errors import OfferIntegrityError
|
|
11
|
+
from chia.data_layer.data_layer_rpc_util import marshal
|
|
11
12
|
from chia.data_layer.data_layer_util import (
|
|
12
13
|
CancelOfferRequest,
|
|
13
14
|
CancelOfferResponse,
|
|
@@ -31,7 +32,6 @@ from chia.data_layer.data_layer_util import (
|
|
|
31
32
|
unspecified,
|
|
32
33
|
)
|
|
33
34
|
from chia.data_layer.data_layer_wallet import DataLayerWallet, Mirror, verify_offer
|
|
34
|
-
from chia.rpc.data_layer_rpc_util import marshal
|
|
35
35
|
from chia.rpc.rpc_server import Endpoint, EndpointResult
|
|
36
36
|
from chia.rpc.util import marshal as streamable_marshal
|
|
37
37
|
from chia.util.byte_types import hexstr_to_bytes
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from typing_extensions import Protocol
|
|
6
|
-
|
|
7
|
-
_T = TypeVar("_T")
|
|
3
|
+
from typing import Any
|
|
8
4
|
|
|
5
|
+
from typing_extensions import Protocol, Self
|
|
9
6
|
|
|
10
7
|
# If accepted for general use then this should be moved to a common location
|
|
11
8
|
# and probably implemented by the framework instead of manual decoration.
|
|
@@ -13,7 +10,7 @@ _T = TypeVar("_T")
|
|
|
13
10
|
|
|
14
11
|
class MarshallableProtocol(Protocol):
|
|
15
12
|
@classmethod
|
|
16
|
-
def unmarshal(cls
|
|
13
|
+
def unmarshal(cls, marshalled: dict[str, Any]) -> Self: ...
|
|
17
14
|
|
|
18
15
|
def marshal(self) -> dict[str, Any]: ...
|
|
19
16
|
|
|
@@ -392,7 +392,7 @@ class Root:
|
|
|
392
392
|
}
|
|
393
393
|
|
|
394
394
|
|
|
395
|
-
node_type_to_class: dict[NodeType, Union[
|
|
395
|
+
node_type_to_class: dict[NodeType, type[Union[InternalNode, TerminalNode]]] = {
|
|
396
396
|
NodeType.INTERNAL: InternalNode,
|
|
397
397
|
NodeType.TERMINAL: TerminalNode,
|
|
398
398
|
}
|
|
@@ -962,14 +962,12 @@ def dl_verify_proof_internal(dl_proof: DLProof, puzzle_hash: bytes32) -> list[Ke
|
|
|
962
962
|
|
|
963
963
|
|
|
964
964
|
async def dl_verify_proof(
|
|
965
|
-
|
|
965
|
+
dlproof: DLProof,
|
|
966
966
|
wallet_node: WalletNode,
|
|
967
967
|
peer: WSChiaConnection,
|
|
968
|
-
) ->
|
|
968
|
+
) -> VerifyProofResponse:
|
|
969
969
|
"""Verify a proof of inclusion for a DL singleton"""
|
|
970
970
|
|
|
971
|
-
dlproof = DLProof.from_json_dict(request)
|
|
972
|
-
|
|
973
971
|
coin_id = dlproof.coin_id
|
|
974
972
|
coin_states = await wallet_node.get_coin_state([coin_id], peer=peer)
|
|
975
973
|
if len(coin_states) == 0:
|
|
@@ -982,4 +980,4 @@ async def dl_verify_proof(
|
|
|
982
980
|
success=True,
|
|
983
981
|
current_root=coin_states[0].spent_height is None,
|
|
984
982
|
)
|
|
985
|
-
return response
|
|
983
|
+
return response
|
|
@@ -5,23 +5,21 @@ import logging
|
|
|
5
5
|
import time
|
|
6
6
|
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
7
7
|
|
|
8
|
-
from chia_rs import G1Element, G2Element
|
|
8
|
+
from chia_rs import BlockRecord, CoinSpend, CoinState, G1Element, G2Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
10
10
|
from chia_rs.sized_ints import uint8, uint32, uint64, uint128
|
|
11
11
|
from clvm.EvalError import EvalError
|
|
12
12
|
from typing_extensions import Unpack, final
|
|
13
13
|
|
|
14
|
-
from chia.consensus.block_record import BlockRecord
|
|
15
14
|
from chia.data_layer.data_layer_errors import LauncherCoinNotFoundError, OfferIntegrityError
|
|
16
15
|
from chia.data_layer.data_layer_util import OfferStore, ProofOfInclusion, ProofOfInclusionLayer, StoreProofs, leaf_hash
|
|
17
16
|
from chia.data_layer.singleton_record import SingletonRecord
|
|
18
|
-
from chia.protocols.wallet_protocol import CoinState
|
|
19
17
|
from chia.server.ws_connection import WSChiaConnection
|
|
20
18
|
from chia.types.blockchain_format.coin import Coin
|
|
21
|
-
from chia.types.blockchain_format.program import Program
|
|
22
|
-
from chia.types.
|
|
23
|
-
from chia.types.coin_spend import CoinSpend, compute_additions
|
|
19
|
+
from chia.types.blockchain_format.program import Program, run_with_cost
|
|
20
|
+
from chia.types.coin_spend import make_spend
|
|
24
21
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
22
|
+
from chia.util.streamable import Streamable, streamable
|
|
25
23
|
from chia.wallet.conditions import (
|
|
26
24
|
AssertAnnouncement,
|
|
27
25
|
AssertCoinAnnouncement,
|
|
@@ -52,6 +50,7 @@ from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
|
|
|
52
50
|
from chia.wallet.singleton import SINGLETON_LAUNCHER_PUZZLE, SINGLETON_LAUNCHER_PUZZLE_HASH
|
|
53
51
|
from chia.wallet.trading.offer import NotarizedPayment, Offer
|
|
54
52
|
from chia.wallet.transaction_record import TransactionRecord
|
|
53
|
+
from chia.wallet.util.compute_additions import compute_additions
|
|
55
54
|
from chia.wallet.util.compute_memos import compute_memos
|
|
56
55
|
from chia.wallet.util.merkle_utils import _simplify_merkle_proof
|
|
57
56
|
from chia.wallet.util.transaction_type import TransactionType
|
|
@@ -68,35 +67,23 @@ if TYPE_CHECKING:
|
|
|
68
67
|
from chia.wallet.wallet_state_manager import WalletStateManager
|
|
69
68
|
|
|
70
69
|
|
|
70
|
+
@streamable
|
|
71
71
|
@dataclasses.dataclass(frozen=True)
|
|
72
|
-
class Mirror:
|
|
72
|
+
class Mirror(Streamable):
|
|
73
73
|
coin_id: bytes32
|
|
74
74
|
launcher_id: bytes32
|
|
75
75
|
amount: uint64
|
|
76
|
-
urls: list[
|
|
76
|
+
urls: list[str]
|
|
77
77
|
ours: bool
|
|
78
78
|
confirmed_at_height: Optional[uint32]
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"launcher_id": self.launcher_id.hex(),
|
|
84
|
-
"amount": self.amount,
|
|
85
|
-
"urls": [url.decode("utf8") for url in self.urls],
|
|
86
|
-
"ours": self.ours,
|
|
87
|
-
"confirmed_at_height": self.confirmed_at_height,
|
|
88
|
-
}
|
|
80
|
+
@staticmethod
|
|
81
|
+
def encode_urls(urls: list[str]) -> list[bytes]:
|
|
82
|
+
return [url.encode("utf8") for url in urls]
|
|
89
83
|
|
|
90
|
-
@
|
|
91
|
-
def
|
|
92
|
-
return
|
|
93
|
-
bytes32.from_hexstr(json_dict["coin_id"]),
|
|
94
|
-
bytes32.from_hexstr(json_dict["launcher_id"]),
|
|
95
|
-
json_dict["amount"],
|
|
96
|
-
[bytes(url, "utf8") for url in json_dict["urls"]],
|
|
97
|
-
json_dict["ours"],
|
|
98
|
-
json_dict["confirmed_at_height"],
|
|
99
|
-
)
|
|
84
|
+
@staticmethod
|
|
85
|
+
def decode_urls(urls: list[bytes]) -> list[str]:
|
|
86
|
+
return [url.decode("utf8") for url in urls]
|
|
100
87
|
|
|
101
88
|
|
|
102
89
|
@final
|
|
@@ -167,13 +154,13 @@ class DataLayerWallet:
|
|
|
167
154
|
@staticmethod
|
|
168
155
|
async def match_dl_launcher(launcher_spend: CoinSpend) -> tuple[bool, Optional[bytes32]]:
|
|
169
156
|
# Sanity check it's a launcher
|
|
170
|
-
if launcher_spend.puzzle_reveal
|
|
157
|
+
if launcher_spend.puzzle_reveal != SINGLETON_LAUNCHER_PUZZLE.to_serialized():
|
|
171
158
|
return False, None
|
|
172
159
|
|
|
173
160
|
# Let's make sure the solution looks how we expect it to
|
|
174
161
|
try:
|
|
175
162
|
full_puzhash, amount, root, inner_puzhash = launch_solution_to_singleton_info(
|
|
176
|
-
launcher_spend.solution
|
|
163
|
+
Program.from_serialized(launcher_spend.solution)
|
|
177
164
|
)
|
|
178
165
|
except ValueError:
|
|
179
166
|
return False, None
|
|
@@ -223,7 +210,9 @@ class DataLayerWallet:
|
|
|
223
210
|
|
|
224
211
|
assert spend.coin.name() == launcher_id, "coin_id should always match the launcher_id here"
|
|
225
212
|
|
|
226
|
-
full_puzhash, amount, root, inner_puzhash = launch_solution_to_singleton_info(
|
|
213
|
+
full_puzhash, amount, root, inner_puzhash = launch_solution_to_singleton_info(
|
|
214
|
+
Program.from_serialized(spend.solution)
|
|
215
|
+
)
|
|
227
216
|
new_singleton = Coin(launcher_id, full_puzhash, amount)
|
|
228
217
|
|
|
229
218
|
singleton_record: Optional[SingletonRecord] = await self.wallet_state_manager.dl_store.get_latest_singleton(
|
|
@@ -300,9 +289,7 @@ class DataLayerWallet:
|
|
|
300
289
|
launcher_parent: Coin = next(iter(coins))
|
|
301
290
|
launcher_coin: Coin = Coin(launcher_parent.name(), SINGLETON_LAUNCHER_PUZZLE_HASH, uint64(1))
|
|
302
291
|
|
|
303
|
-
inner_puzzle: Program = await
|
|
304
|
-
new=not action_scope.config.tx_config.reuse_puzhash
|
|
305
|
-
)
|
|
292
|
+
inner_puzzle: Program = await action_scope.get_puzzle(self.wallet_state_manager)
|
|
306
293
|
full_puzzle: Program = create_host_fullpuz(inner_puzzle, initial_root, launcher_coin.name())
|
|
307
294
|
|
|
308
295
|
genesis_launcher_solution: Program = Program.to(
|
|
@@ -321,10 +308,10 @@ class DataLayerWallet:
|
|
|
321
308
|
extra_conditions=(*extra_conditions, announcement),
|
|
322
309
|
)
|
|
323
310
|
|
|
324
|
-
launcher_cs: CoinSpend =
|
|
311
|
+
launcher_cs: CoinSpend = make_spend(
|
|
325
312
|
launcher_coin,
|
|
326
|
-
|
|
327
|
-
|
|
313
|
+
SINGLETON_LAUNCHER_PUZZLE,
|
|
314
|
+
genesis_launcher_solution,
|
|
328
315
|
)
|
|
329
316
|
launcher_sb = WalletSpendBundle([launcher_cs], G2Element())
|
|
330
317
|
launcher_id = launcher_coin.name()
|
|
@@ -394,9 +381,7 @@ class DataLayerWallet:
|
|
|
394
381
|
|
|
395
382
|
# Make the child's puzzles
|
|
396
383
|
if new_puz_hash is None:
|
|
397
|
-
new_puz_hash = await
|
|
398
|
-
new=not action_scope.config.tx_config.reuse_puzhash
|
|
399
|
-
)
|
|
384
|
+
new_puz_hash = await action_scope.get_puzzle_hash(self.wallet_state_manager)
|
|
400
385
|
assert new_puz_hash is not None
|
|
401
386
|
next_full_puz_hash: bytes32 = create_host_fullpuz(new_puz_hash, root_hash, launcher_id).get_tree_hash_precalc(
|
|
402
387
|
new_puz_hash
|
|
@@ -457,10 +442,10 @@ class DataLayerWallet:
|
|
|
457
442
|
second_coin = Coin(
|
|
458
443
|
current_coin.name(), second_full_puz.get_tree_hash(), singleton_record.lineage_proof.amount
|
|
459
444
|
)
|
|
460
|
-
second_coin_spend =
|
|
445
|
+
second_coin_spend = make_spend(
|
|
461
446
|
second_coin,
|
|
462
|
-
|
|
463
|
-
|
|
447
|
+
second_full_puz,
|
|
448
|
+
Program.to(
|
|
464
449
|
[
|
|
465
450
|
LineageProof(
|
|
466
451
|
current_coin.parent_coin_info,
|
|
@@ -538,10 +523,10 @@ class DataLayerWallet:
|
|
|
538
523
|
)
|
|
539
524
|
|
|
540
525
|
# Create the spend
|
|
541
|
-
coin_spend =
|
|
526
|
+
coin_spend = make_spend(
|
|
542
527
|
current_coin,
|
|
543
|
-
|
|
544
|
-
|
|
528
|
+
current_full_puz,
|
|
529
|
+
full_sol,
|
|
545
530
|
)
|
|
546
531
|
|
|
547
532
|
spend_bundle = WalletSpendBundle([coin_spend], G2Element())
|
|
@@ -722,18 +707,16 @@ class DataLayerWallet:
|
|
|
722
707
|
raise ValueError(f"DL Wallet does not have permission to delete mirror with ID {mirror_id}")
|
|
723
708
|
|
|
724
709
|
parent_inner_puzzle: Program = self.standard_wallet.puzzle_for_pk(inner_puzzle_derivation.pubkey)
|
|
725
|
-
new_puzhash: bytes32 = await
|
|
726
|
-
new=not action_scope.config.tx_config.reuse_puzhash
|
|
727
|
-
)
|
|
710
|
+
new_puzhash: bytes32 = await action_scope.get_puzzle_hash(self.wallet_state_manager)
|
|
728
711
|
excess_fee: int = fee - mirror_coin.amount
|
|
729
712
|
inner_sol: Program = self.standard_wallet.make_solution(
|
|
730
713
|
primaries=[CreateCoin(new_puzhash, uint64(mirror_coin.amount - fee))] if excess_fee < 0 else [],
|
|
731
714
|
conditions=(*extra_conditions, CreateCoinAnnouncement(b"$")) if excess_fee > 0 else extra_conditions,
|
|
732
715
|
)
|
|
733
|
-
mirror_spend =
|
|
716
|
+
mirror_spend = make_spend(
|
|
734
717
|
mirror_coin,
|
|
735
|
-
|
|
736
|
-
|
|
718
|
+
create_mirror_puzzle(),
|
|
719
|
+
Program.to(
|
|
737
720
|
[
|
|
738
721
|
parent_coin.parent_coin_info,
|
|
739
722
|
parent_inner_puzzle,
|
|
@@ -798,7 +781,7 @@ class DataLayerWallet:
|
|
|
798
781
|
coin.name(),
|
|
799
782
|
launcher_id,
|
|
800
783
|
uint64(coin.amount),
|
|
801
|
-
urls,
|
|
784
|
+
Mirror.decode_urls(urls),
|
|
802
785
|
ours,
|
|
803
786
|
height,
|
|
804
787
|
)
|
|
@@ -826,7 +809,7 @@ class DataLayerWallet:
|
|
|
826
809
|
root: bytes32
|
|
827
810
|
inner_puzzle_hash: bytes32
|
|
828
811
|
|
|
829
|
-
conditions =
|
|
812
|
+
conditions = run_with_cost(puzzle, self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM, solution)[
|
|
830
813
|
1
|
|
831
814
|
].as_python()
|
|
832
815
|
found_singleton: bool = False
|
|
@@ -936,14 +919,6 @@ class DataLayerWallet:
|
|
|
936
919
|
def puzzle_for_pk(self, pubkey: G1Element) -> Program:
|
|
937
920
|
return self.standard_wallet.puzzle_for_pk(pubkey)
|
|
938
921
|
|
|
939
|
-
async def get_new_puzzle(self) -> Program:
|
|
940
|
-
return self.puzzle_for_pk(
|
|
941
|
-
(await self.wallet_state_manager.get_unused_derivation_record(self.wallet_info.id)).pubkey
|
|
942
|
-
)
|
|
943
|
-
|
|
944
|
-
async def get_new_puzzlehash(self) -> bytes32:
|
|
945
|
-
return (await self.get_new_puzzle()).get_tree_hash()
|
|
946
|
-
|
|
947
922
|
async def new_peak(self, peak: BlockRecord) -> None:
|
|
948
923
|
pass
|
|
949
924
|
|
|
@@ -1024,9 +999,7 @@ class DataLayerWallet:
|
|
|
1024
999
|
except KeyError:
|
|
1025
1000
|
this_solver = solver["0x" + launcher.hex()]
|
|
1026
1001
|
new_root: bytes32 = this_solver["new_root"]
|
|
1027
|
-
new_ph: bytes32 = await
|
|
1028
|
-
new=not action_scope.config.tx_config.reuse_puzhash
|
|
1029
|
-
)
|
|
1002
|
+
new_ph: bytes32 = await action_scope.get_puzzle_hash(wallet_state_manager)
|
|
1030
1003
|
async with wallet_state_manager.new_action_scope(
|
|
1031
1004
|
action_scope.config.tx_config, push=False
|
|
1032
1005
|
) as inner_action_scope:
|
|
@@ -1050,7 +1023,7 @@ class DataLayerWallet:
|
|
|
1050
1023
|
for cs in tx.spend_bundle.coin_spends
|
|
1051
1024
|
if tx.spend_bundle is not None and match_dl_singleton(cs.puzzle_reveal)[0]
|
|
1052
1025
|
)
|
|
1053
|
-
dl_solution
|
|
1026
|
+
dl_solution = Program.from_serialized(dl_spend.solution)
|
|
1054
1027
|
old_graftroot: Program = dl_solution.at("rrffrf")
|
|
1055
1028
|
new_graftroot: Program = create_graftroot_offer_puz(
|
|
1056
1029
|
[bytes32(dep["launcher_id"]) for dep in this_solver["dependencies"]],
|
|
@@ -1059,7 +1032,7 @@ class DataLayerWallet:
|
|
|
1059
1032
|
)
|
|
1060
1033
|
|
|
1061
1034
|
new_solution: Program = dl_solution.replace(rrffrf=new_graftroot, rrffrrf=Program.to([None] * 5))
|
|
1062
|
-
new_spend: CoinSpend = dl_spend.replace(solution=
|
|
1035
|
+
new_spend: CoinSpend = dl_spend.replace(solution=new_solution.to_serialized())
|
|
1063
1036
|
async with inner_action_scope.use() as interface:
|
|
1064
1037
|
for i, tx in enumerate(interface.side_effects.transactions):
|
|
1065
1038
|
if tx.spend_bundle is not None and dl_spend in tx.spend_bundle.coin_spends:
|
|
@@ -1115,7 +1088,7 @@ class DataLayerWallet:
|
|
|
1115
1088
|
# Create all of the new solutions
|
|
1116
1089
|
new_spends: list[CoinSpend] = []
|
|
1117
1090
|
for spend in offer.coin_spends():
|
|
1118
|
-
solution = spend.solution
|
|
1091
|
+
solution = Program.from_serialized(spend.solution)
|
|
1119
1092
|
if match_dl_singleton(spend.puzzle_reveal)[0]:
|
|
1120
1093
|
try:
|
|
1121
1094
|
graftroot: Program = solution.at("rrffrf")
|
|
@@ -1163,7 +1136,7 @@ class DataLayerWallet:
|
|
|
1163
1136
|
]
|
|
1164
1137
|
)
|
|
1165
1138
|
)
|
|
1166
|
-
new_spend: CoinSpend = spend.replace(solution=
|
|
1139
|
+
new_spend: CoinSpend = spend.replace(solution=new_solution.to_serialized())
|
|
1167
1140
|
spend = new_spend
|
|
1168
1141
|
new_spends.append(spend)
|
|
1169
1142
|
|
|
@@ -1173,7 +1146,7 @@ class DataLayerWallet:
|
|
|
1173
1146
|
async def get_offer_summary(offer: Offer) -> dict[str, Any]:
|
|
1174
1147
|
summary: dict[str, Any] = {"offered": []}
|
|
1175
1148
|
for spend in offer.coin_spends():
|
|
1176
|
-
solution = spend.solution
|
|
1149
|
+
solution = Program.from_serialized(spend.solution)
|
|
1177
1150
|
matched, curried_args = match_dl_singleton(spend.puzzle_reveal)
|
|
1178
1151
|
if matched:
|
|
1179
1152
|
try:
|