chia-blockchain 2.5.1rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +10 -0
- chia/__main__.py +5 -0
- chia/_tests/README.md +53 -0
- chia/_tests/__init__.py +0 -0
- chia/_tests/blockchain/__init__.py +0 -0
- chia/_tests/blockchain/blockchain_test_utils.py +195 -0
- chia/_tests/blockchain/config.py +4 -0
- chia/_tests/blockchain/test_augmented_chain.py +145 -0
- chia/_tests/blockchain/test_blockchain.py +4202 -0
- chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
- chia/_tests/blockchain/test_build_chains.py +59 -0
- chia/_tests/blockchain/test_get_block_generator.py +72 -0
- chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
- chia/_tests/build-init-files.py +92 -0
- chia/_tests/build-job-matrix.py +204 -0
- chia/_tests/check_pytest_monitor_output.py +34 -0
- chia/_tests/check_sql_statements.py +72 -0
- chia/_tests/chia-start-sim +42 -0
- chia/_tests/clvm/__init__.py +0 -0
- chia/_tests/clvm/benchmark_costs.py +23 -0
- chia/_tests/clvm/coin_store.py +149 -0
- chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
- chia/_tests/clvm/test_clvm_step.py +37 -0
- chia/_tests/clvm/test_condition_codes.py +13 -0
- chia/_tests/clvm/test_curry_and_treehash.py +55 -0
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_program.py +150 -0
- chia/_tests/clvm/test_puzzle_compression.py +143 -0
- chia/_tests/clvm/test_puzzle_drivers.py +45 -0
- chia/_tests/clvm/test_puzzles.py +242 -0
- chia/_tests/clvm/test_singletons.py +540 -0
- chia/_tests/clvm/test_spend_sim.py +181 -0
- chia/_tests/cmds/__init__.py +0 -0
- chia/_tests/cmds/cmd_test_utils.py +469 -0
- chia/_tests/cmds/config.py +3 -0
- chia/_tests/cmds/conftest.py +23 -0
- chia/_tests/cmds/test_click_types.py +200 -0
- chia/_tests/cmds/test_cmd_framework.py +620 -0
- chia/_tests/cmds/test_cmds_util.py +97 -0
- chia/_tests/cmds/test_daemon.py +92 -0
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +66 -0
- chia/_tests/cmds/test_show.py +116 -0
- chia/_tests/cmds/test_sim.py +207 -0
- chia/_tests/cmds/test_timelock_args.py +75 -0
- chia/_tests/cmds/test_tx_config_args.py +154 -0
- chia/_tests/cmds/testing_classes.py +59 -0
- chia/_tests/cmds/wallet/__init__.py +0 -0
- chia/_tests/cmds/wallet/test_consts.py +47 -0
- chia/_tests/cmds/wallet/test_dao.py +565 -0
- chia/_tests/cmds/wallet/test_did.py +403 -0
- chia/_tests/cmds/wallet/test_nft.py +471 -0
- chia/_tests/cmds/wallet/test_notifications.py +124 -0
- chia/_tests/cmds/wallet/test_offer.toffer +1 -0
- chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
- chia/_tests/cmds/wallet/test_vcs.py +400 -0
- chia/_tests/cmds/wallet/test_wallet.py +1125 -0
- chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
- chia/_tests/conftest.py +1419 -0
- chia/_tests/connection_utils.py +125 -0
- chia/_tests/core/__init__.py +0 -0
- chia/_tests/core/cmds/__init__.py +0 -0
- chia/_tests/core/cmds/test_beta.py +382 -0
- chia/_tests/core/cmds/test_keys.py +1734 -0
- chia/_tests/core/cmds/test_wallet.py +126 -0
- chia/_tests/core/config.py +3 -0
- chia/_tests/core/consensus/__init__.py +0 -0
- chia/_tests/core/consensus/test_block_creation.py +54 -0
- chia/_tests/core/consensus/test_pot_iterations.py +117 -0
- chia/_tests/core/custom_types/__init__.py +0 -0
- chia/_tests/core/custom_types/test_coin.py +107 -0
- chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
- chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
- chia/_tests/core/daemon/__init__.py +0 -0
- chia/_tests/core/daemon/config.py +4 -0
- chia/_tests/core/daemon/test_daemon.py +2128 -0
- chia/_tests/core/daemon/test_daemon_register.py +109 -0
- chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
- chia/_tests/core/data_layer/__init__.py +0 -0
- chia/_tests/core/data_layer/config.py +5 -0
- chia/_tests/core/data_layer/conftest.py +106 -0
- chia/_tests/core/data_layer/test_data_cli.py +56 -0
- chia/_tests/core/data_layer/test_data_layer.py +83 -0
- chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
- chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
- chia/_tests/core/data_layer/test_data_store.py +2424 -0
- chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
- chia/_tests/core/data_layer/test_plugin.py +91 -0
- chia/_tests/core/data_layer/util.py +233 -0
- chia/_tests/core/farmer/__init__.py +0 -0
- chia/_tests/core/farmer/config.py +3 -0
- chia/_tests/core/farmer/test_farmer_api.py +103 -0
- chia/_tests/core/full_node/__init__.py +0 -0
- chia/_tests/core/full_node/config.py +4 -0
- chia/_tests/core/full_node/dos/__init__.py +0 -0
- chia/_tests/core/full_node/dos/config.py +3 -0
- chia/_tests/core/full_node/full_sync/__init__.py +0 -0
- chia/_tests/core/full_node/full_sync/config.py +4 -0
- chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
- chia/_tests/core/full_node/ram_db.py +27 -0
- chia/_tests/core/full_node/stores/__init__.py +0 -0
- chia/_tests/core/full_node/stores/config.py +4 -0
- chia/_tests/core/full_node/stores/test_block_store.py +590 -0
- chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
- chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
- chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
- chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
- chia/_tests/core/full_node/test_address_manager.py +588 -0
- chia/_tests/core/full_node/test_block_height_map.py +556 -0
- chia/_tests/core/full_node/test_conditions.py +556 -0
- chia/_tests/core/full_node/test_full_node.py +2700 -0
- chia/_tests/core/full_node/test_generator_tools.py +82 -0
- chia/_tests/core/full_node/test_hint_management.py +104 -0
- chia/_tests/core/full_node/test_node_load.py +34 -0
- chia/_tests/core/full_node/test_performance.py +179 -0
- chia/_tests/core/full_node/test_subscriptions.py +492 -0
- chia/_tests/core/full_node/test_transactions.py +203 -0
- chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
- chia/_tests/core/large_block.py +2388 -0
- chia/_tests/core/make_block_generator.py +70 -0
- chia/_tests/core/mempool/__init__.py +0 -0
- chia/_tests/core/mempool/config.py +4 -0
- chia/_tests/core/mempool/test_mempool.py +3255 -0
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
- chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
- chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
- chia/_tests/core/mempool/test_mempool_performance.py +64 -0
- chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
- chia/_tests/core/node_height.py +28 -0
- chia/_tests/core/server/__init__.py +0 -0
- chia/_tests/core/server/config.py +3 -0
- chia/_tests/core/server/flood.py +84 -0
- chia/_tests/core/server/serve.py +135 -0
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +66 -0
- chia/_tests/core/server/test_dos.py +319 -0
- chia/_tests/core/server/test_event_loop.py +109 -0
- chia/_tests/core/server/test_loop.py +294 -0
- chia/_tests/core/server/test_node_discovery.py +73 -0
- chia/_tests/core/server/test_rate_limits.py +482 -0
- chia/_tests/core/server/test_server.py +226 -0
- chia/_tests/core/server/test_upnp.py +8 -0
- chia/_tests/core/services/__init__.py +0 -0
- chia/_tests/core/services/config.py +3 -0
- chia/_tests/core/services/test_services.py +188 -0
- chia/_tests/core/ssl/__init__.py +0 -0
- chia/_tests/core/ssl/config.py +3 -0
- chia/_tests/core/ssl/test_ssl.py +202 -0
- chia/_tests/core/test_coins.py +33 -0
- chia/_tests/core/test_cost_calculation.py +313 -0
- chia/_tests/core/test_crawler.py +175 -0
- chia/_tests/core/test_crawler_rpc.py +53 -0
- chia/_tests/core/test_daemon_rpc.py +24 -0
- chia/_tests/core/test_db_conversion.py +130 -0
- chia/_tests/core/test_db_validation.py +162 -0
- chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
- chia/_tests/core/test_filter.py +35 -0
- chia/_tests/core/test_full_node_rpc.py +768 -0
- chia/_tests/core/test_merkle_set.py +343 -0
- chia/_tests/core/test_program.py +47 -0
- chia/_tests/core/test_rpc_util.py +86 -0
- chia/_tests/core/test_seeder.py +420 -0
- chia/_tests/core/test_setproctitle.py +13 -0
- chia/_tests/core/util/__init__.py +0 -0
- chia/_tests/core/util/config.py +4 -0
- chia/_tests/core/util/test_block_cache.py +44 -0
- chia/_tests/core/util/test_cached_bls.py +57 -0
- chia/_tests/core/util/test_config.py +337 -0
- chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
- chia/_tests/core/util/test_files.py +391 -0
- chia/_tests/core/util/test_jsonify.py +146 -0
- chia/_tests/core/util/test_keychain.py +522 -0
- chia/_tests/core/util/test_keyring_wrapper.py +491 -0
- chia/_tests/core/util/test_lockfile.py +380 -0
- chia/_tests/core/util/test_log_exceptions.py +187 -0
- chia/_tests/core/util/test_lru_cache.py +56 -0
- chia/_tests/core/util/test_significant_bits.py +40 -0
- chia/_tests/core/util/test_streamable.py +883 -0
- chia/_tests/db/__init__.py +0 -0
- chia/_tests/db/test_db_wrapper.py +566 -0
- chia/_tests/environments/__init__.py +0 -0
- chia/_tests/environments/common.py +35 -0
- chia/_tests/environments/full_node.py +47 -0
- chia/_tests/environments/wallet.py +429 -0
- chia/_tests/ether.py +19 -0
- chia/_tests/farmer_harvester/__init__.py +0 -0
- chia/_tests/farmer_harvester/config.py +3 -0
- chia/_tests/farmer_harvester/test_farmer.py +1264 -0
- chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
- chia/_tests/fee_estimation/__init__.py +0 -0
- chia/_tests/fee_estimation/config.py +3 -0
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
- chia/_tests/generator/__init__.py +0 -0
- chia/_tests/generator/puzzles/__init__.py +0 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
- chia/_tests/generator/test_compression.py +201 -0
- chia/_tests/generator/test_generator_types.py +44 -0
- chia/_tests/generator/test_rom.py +180 -0
- chia/_tests/plot_sync/__init__.py +0 -0
- chia/_tests/plot_sync/config.py +3 -0
- chia/_tests/plot_sync/test_delta.py +101 -0
- chia/_tests/plot_sync/test_plot_sync.py +618 -0
- chia/_tests/plot_sync/test_receiver.py +451 -0
- chia/_tests/plot_sync/test_sender.py +116 -0
- chia/_tests/plot_sync/test_sync_simulated.py +451 -0
- chia/_tests/plot_sync/util.py +68 -0
- chia/_tests/plotting/__init__.py +0 -0
- chia/_tests/plotting/config.py +3 -0
- chia/_tests/plotting/test_plot_manager.py +781 -0
- chia/_tests/plotting/util.py +12 -0
- chia/_tests/pools/__init__.py +0 -0
- chia/_tests/pools/config.py +5 -0
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +1001 -0
- chia/_tests/pools/test_pool_config.py +42 -0
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
- chia/_tests/pools/test_pool_rpc.py +1123 -0
- chia/_tests/pools/test_pool_wallet.py +205 -0
- chia/_tests/pools/test_wallet_pool_store.py +161 -0
- chia/_tests/process_junit.py +348 -0
- chia/_tests/rpc/__init__.py +0 -0
- chia/_tests/rpc/test_rpc_client.py +138 -0
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/__init__.py +0 -0
- chia/_tests/simulation/config.py +6 -0
- chia/_tests/simulation/test_simulation.py +501 -0
- chia/_tests/simulation/test_simulator.py +232 -0
- chia/_tests/simulation/test_start_simulator.py +107 -0
- chia/_tests/testconfig.py +13 -0
- chia/_tests/timelord/__init__.py +0 -0
- chia/_tests/timelord/config.py +3 -0
- chia/_tests/timelord/test_new_peak.py +437 -0
- chia/_tests/timelord/test_timelord.py +11 -0
- chia/_tests/tools/1315537.json +170 -0
- chia/_tests/tools/1315544.json +160 -0
- chia/_tests/tools/1315630.json +150 -0
- chia/_tests/tools/300000.json +105 -0
- chia/_tests/tools/442734.json +140 -0
- chia/_tests/tools/466212.json +130 -0
- chia/_tests/tools/__init__.py +0 -0
- chia/_tests/tools/config.py +5 -0
- chia/_tests/tools/test-blockchain-db.sqlite +0 -0
- chia/_tests/tools/test_full_sync.py +30 -0
- chia/_tests/tools/test_legacy_keyring.py +82 -0
- chia/_tests/tools/test_run_block.py +128 -0
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/__init__.py +0 -0
- chia/_tests/util/benchmark_cost.py +170 -0
- chia/_tests/util/benchmarks.py +153 -0
- chia/_tests/util/bip39_test_vectors.json +148 -0
- chia/_tests/util/blockchain.py +134 -0
- chia/_tests/util/blockchain_mock.py +132 -0
- chia/_tests/util/build_network_protocol_files.py +302 -0
- chia/_tests/util/clvm_generator.bin +0 -0
- chia/_tests/util/config.py +3 -0
- chia/_tests/util/constants.py +20 -0
- chia/_tests/util/db_connection.py +37 -0
- chia/_tests/util/full_sync.py +253 -0
- chia/_tests/util/gen_ssl_certs.py +114 -0
- chia/_tests/util/generator_tools_testing.py +45 -0
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +36 -0
- chia/_tests/util/misc.py +675 -0
- chia/_tests/util/network_protocol_data.py +1072 -0
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +2701 -0
- chia/_tests/util/rpc.py +26 -0
- chia/_tests/util/run_block.py +163 -0
- chia/_tests/util/setup_nodes.py +481 -0
- chia/_tests/util/spend_sim.py +492 -0
- chia/_tests/util/split_managers.py +102 -0
- chia/_tests/util/temp_file.py +14 -0
- chia/_tests/util/test_action_scope.py +144 -0
- chia/_tests/util/test_async_pool.py +366 -0
- chia/_tests/util/test_build_job_matrix.py +42 -0
- chia/_tests/util/test_build_network_protocol_files.py +7 -0
- chia/_tests/util/test_chia_version.py +50 -0
- chia/_tests/util/test_collection.py +11 -0
- chia/_tests/util/test_condition_tools.py +229 -0
- chia/_tests/util/test_config.py +426 -0
- chia/_tests/util/test_dump_keyring.py +60 -0
- chia/_tests/util/test_errors.py +10 -0
- chia/_tests/util/test_full_block_utils.py +279 -0
- chia/_tests/util/test_installed.py +20 -0
- chia/_tests/util/test_limited_semaphore.py +53 -0
- chia/_tests/util/test_logging_filter.py +42 -0
- chia/_tests/util/test_misc.py +445 -0
- chia/_tests/util/test_network.py +73 -0
- chia/_tests/util/test_network_protocol_files.py +578 -0
- chia/_tests/util/test_network_protocol_json.py +267 -0
- chia/_tests/util/test_network_protocol_test.py +256 -0
- chia/_tests/util/test_paginator.py +71 -0
- chia/_tests/util/test_pprint.py +17 -0
- chia/_tests/util/test_priority_mutex.py +488 -0
- chia/_tests/util/test_recursive_replace.py +116 -0
- chia/_tests/util/test_replace_str_to_bytes.py +137 -0
- chia/_tests/util/test_service_groups.py +15 -0
- chia/_tests/util/test_ssl_check.py +31 -0
- chia/_tests/util/test_testnet_overrides.py +19 -0
- chia/_tests/util/test_tests_misc.py +38 -0
- chia/_tests/util/test_timing.py +37 -0
- chia/_tests/util/test_trusted_peer.py +51 -0
- chia/_tests/util/time_out_assert.py +191 -0
- chia/_tests/wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/config.py +4 -0
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
- chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
- chia/_tests/wallet/clawback/__init__.py +0 -0
- chia/_tests/wallet/clawback/config.py +3 -0
- chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
- chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
- chia/_tests/wallet/config.py +4 -0
- chia/_tests/wallet/conftest.py +278 -0
- chia/_tests/wallet/dao_wallet/__init__.py +0 -0
- chia/_tests/wallet/dao_wallet/config.py +3 -0
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
- chia/_tests/wallet/db_wallet/__init__.py +0 -0
- chia/_tests/wallet/db_wallet/config.py +3 -0
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
- chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
- chia/_tests/wallet/did_wallet/__init__.py +0 -0
- chia/_tests/wallet/did_wallet/config.py +4 -0
- chia/_tests/wallet/did_wallet/test_did.py +2284 -0
- chia/_tests/wallet/nft_wallet/__init__.py +0 -0
- chia/_tests/wallet/nft_wallet/config.py +4 -0
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
- chia/_tests/wallet/rpc/__init__.py +0 -0
- chia/_tests/wallet/rpc/config.py +4 -0
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
- chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
- chia/_tests/wallet/simple_sync/__init__.py +0 -0
- chia/_tests/wallet/simple_sync/config.py +3 -0
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
- chia/_tests/wallet/sync/__init__.py +0 -0
- chia/_tests/wallet/sync/config.py +4 -0
- chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
- chia/_tests/wallet/test_address_type.py +189 -0
- chia/_tests/wallet/test_bech32m.py +45 -0
- chia/_tests/wallet/test_clvm_streamable.py +244 -0
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +588 -0
- chia/_tests/wallet/test_conditions.py +400 -0
- chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
- chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
- chia/_tests/wallet/test_nft_store.py +192 -0
- chia/_tests/wallet/test_notifications.py +196 -0
- chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
- chia/_tests/wallet/test_puzzle_store.py +132 -0
- chia/_tests/wallet/test_sign_coin_spends.py +159 -0
- chia/_tests/wallet/test_signer_protocol.py +947 -0
- chia/_tests/wallet/test_singleton.py +122 -0
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
- chia/_tests/wallet/test_singleton_store.py +152 -0
- chia/_tests/wallet/test_taproot.py +19 -0
- chia/_tests/wallet/test_transaction_store.py +945 -0
- chia/_tests/wallet/test_util.py +185 -0
- chia/_tests/wallet/test_wallet.py +2139 -0
- chia/_tests/wallet/test_wallet_action_scope.py +85 -0
- chia/_tests/wallet/test_wallet_blockchain.py +111 -0
- chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
- chia/_tests/wallet/test_wallet_interested_store.py +43 -0
- chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
- chia/_tests/wallet/test_wallet_node.py +780 -0
- chia/_tests/wallet/test_wallet_retry.py +95 -0
- chia/_tests/wallet/test_wallet_state_manager.py +259 -0
- chia/_tests/wallet/test_wallet_test_framework.py +275 -0
- chia/_tests/wallet/test_wallet_trade_store.py +218 -0
- chia/_tests/wallet/test_wallet_user_store.py +34 -0
- chia/_tests/wallet/test_wallet_utils.py +156 -0
- chia/_tests/wallet/vc_wallet/__init__.py +0 -0
- chia/_tests/wallet/vc_wallet/config.py +3 -0
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
- chia/_tests/wallet/wallet_block_tools.py +327 -0
- chia/_tests/weight_proof/__init__.py +0 -0
- chia/_tests/weight_proof/config.py +3 -0
- chia/_tests/weight_proof/test_weight_proof.py +528 -0
- chia/apis.py +19 -0
- chia/clvm/__init__.py +0 -0
- chia/cmds/__init__.py +0 -0
- chia/cmds/beta.py +184 -0
- chia/cmds/beta_funcs.py +137 -0
- chia/cmds/check_wallet_db.py +420 -0
- chia/cmds/chia.py +151 -0
- chia/cmds/cmd_classes.py +323 -0
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +488 -0
- chia/cmds/coin_funcs.py +275 -0
- chia/cmds/coins.py +182 -0
- chia/cmds/completion.py +49 -0
- chia/cmds/configure.py +332 -0
- chia/cmds/dao.py +1064 -0
- chia/cmds/dao_funcs.py +598 -0
- chia/cmds/data.py +708 -0
- chia/cmds/data_funcs.py +385 -0
- chia/cmds/db.py +87 -0
- chia/cmds/db_backup_func.py +77 -0
- chia/cmds/db_upgrade_func.py +452 -0
- chia/cmds/db_validate_func.py +184 -0
- chia/cmds/dev.py +18 -0
- chia/cmds/farm.py +100 -0
- chia/cmds/farm_funcs.py +200 -0
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +63 -0
- chia/cmds/init_funcs.py +367 -0
- chia/cmds/installers.py +131 -0
- chia/cmds/keys.py +527 -0
- chia/cmds/keys_funcs.py +863 -0
- chia/cmds/netspace.py +50 -0
- chia/cmds/netspace_funcs.py +54 -0
- chia/cmds/options.py +32 -0
- chia/cmds/param_types.py +238 -0
- chia/cmds/passphrase.py +131 -0
- chia/cmds/passphrase_funcs.py +292 -0
- chia/cmds/peer.py +51 -0
- chia/cmds/peer_funcs.py +129 -0
- chia/cmds/plotnft.py +260 -0
- chia/cmds/plotnft_funcs.py +405 -0
- chia/cmds/plots.py +230 -0
- chia/cmds/plotters.py +18 -0
- chia/cmds/rpc.py +208 -0
- chia/cmds/show.py +72 -0
- chia/cmds/show_funcs.py +215 -0
- chia/cmds/signer.py +296 -0
- chia/cmds/sim.py +225 -0
- chia/cmds/sim_funcs.py +509 -0
- chia/cmds/start.py +24 -0
- chia/cmds/start_funcs.py +109 -0
- chia/cmds/stop.py +62 -0
- chia/cmds/units.py +9 -0
- chia/cmds/wallet.py +1901 -0
- chia/cmds/wallet_funcs.py +1874 -0
- chia/consensus/__init__.py +0 -0
- chia/consensus/block_body_validation.py +562 -0
- chia/consensus/block_creation.py +546 -0
- chia/consensus/block_header_validation.py +1059 -0
- chia/consensus/block_record.py +31 -0
- chia/consensus/block_rewards.py +53 -0
- chia/consensus/blockchain.py +1087 -0
- chia/consensus/blockchain_interface.py +56 -0
- chia/consensus/coinbase.py +30 -0
- chia/consensus/condition_costs.py +9 -0
- chia/consensus/constants.py +49 -0
- chia/consensus/cost_calculator.py +15 -0
- chia/consensus/default_constants.py +89 -0
- chia/consensus/deficit.py +55 -0
- chia/consensus/difficulty_adjustment.py +412 -0
- chia/consensus/find_fork_point.py +111 -0
- chia/consensus/full_block_to_block_record.py +167 -0
- chia/consensus/get_block_challenge.py +106 -0
- chia/consensus/get_block_generator.py +27 -0
- chia/consensus/make_sub_epoch_summary.py +210 -0
- chia/consensus/multiprocess_validation.py +268 -0
- chia/consensus/pos_quality.py +19 -0
- chia/consensus/pot_iterations.py +67 -0
- chia/consensus/puzzles/__init__.py +0 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
- chia/consensus/vdf_info_computation.py +156 -0
- chia/daemon/__init__.py +0 -0
- chia/daemon/client.py +252 -0
- chia/daemon/keychain_proxy.py +502 -0
- chia/daemon/keychain_server.py +365 -0
- chia/daemon/server.py +1606 -0
- chia/daemon/windows_signal.py +56 -0
- chia/data_layer/__init__.py +0 -0
- chia/data_layer/data_layer.py +1291 -0
- chia/data_layer/data_layer_api.py +33 -0
- chia/data_layer/data_layer_errors.py +50 -0
- chia/data_layer/data_layer_server.py +170 -0
- chia/data_layer/data_layer_util.py +985 -0
- chia/data_layer/data_layer_wallet.py +1311 -0
- chia/data_layer/data_store.py +2267 -0
- chia/data_layer/dl_wallet_store.py +407 -0
- chia/data_layer/download_data.py +389 -0
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
- chia/data_layer/s3_plugin_config.yml +33 -0
- chia/data_layer/s3_plugin_service.py +468 -0
- chia/data_layer/util/__init__.py +0 -0
- chia/data_layer/util/benchmark.py +107 -0
- chia/data_layer/util/plugin.py +40 -0
- chia/farmer/__init__.py +0 -0
- chia/farmer/farmer.py +923 -0
- chia/farmer/farmer_api.py +820 -0
- chia/full_node/__init__.py +0 -0
- chia/full_node/bitcoin_fee_estimator.py +85 -0
- chia/full_node/block_height_map.py +271 -0
- chia/full_node/block_store.py +576 -0
- chia/full_node/bundle_tools.py +19 -0
- chia/full_node/coin_store.py +647 -0
- chia/full_node/fee_estimate.py +54 -0
- chia/full_node/fee_estimate_store.py +24 -0
- chia/full_node/fee_estimation.py +92 -0
- chia/full_node/fee_estimator.py +90 -0
- chia/full_node/fee_estimator_constants.py +38 -0
- chia/full_node/fee_estimator_interface.py +42 -0
- chia/full_node/fee_history.py +25 -0
- chia/full_node/fee_tracker.py +564 -0
- chia/full_node/full_node.py +3327 -0
- chia/full_node/full_node_api.py +2025 -0
- chia/full_node/full_node_store.py +1033 -0
- chia/full_node/hint_management.py +56 -0
- chia/full_node/hint_store.py +93 -0
- chia/full_node/mempool.py +589 -0
- chia/full_node/mempool_check_conditions.py +146 -0
- chia/full_node/mempool_manager.py +853 -0
- chia/full_node/pending_tx_cache.py +112 -0
- chia/full_node/puzzles/__init__.py +0 -0
- chia/full_node/puzzles/block_program_zero.clsp +14 -0
- chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
- chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
- chia/full_node/signage_point.py +16 -0
- chia/full_node/subscriptions.py +247 -0
- chia/full_node/sync_store.py +146 -0
- chia/full_node/tx_processing_queue.py +78 -0
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +1720 -0
- chia/harvester/__init__.py +0 -0
- chia/harvester/harvester.py +272 -0
- chia/harvester/harvester_api.py +380 -0
- chia/introducer/__init__.py +0 -0
- chia/introducer/introducer.py +122 -0
- chia/introducer/introducer_api.py +70 -0
- chia/legacy/__init__.py +0 -0
- chia/legacy/keyring.py +155 -0
- chia/plot_sync/__init__.py +0 -0
- chia/plot_sync/delta.py +61 -0
- chia/plot_sync/exceptions.py +56 -0
- chia/plot_sync/receiver.py +386 -0
- chia/plot_sync/sender.py +340 -0
- chia/plot_sync/util.py +43 -0
- chia/plotters/__init__.py +0 -0
- chia/plotters/bladebit.py +388 -0
- chia/plotters/chiapos.py +63 -0
- chia/plotters/madmax.py +224 -0
- chia/plotters/plotters.py +577 -0
- chia/plotters/plotters_util.py +133 -0
- chia/plotting/__init__.py +0 -0
- chia/plotting/cache.py +213 -0
- chia/plotting/check_plots.py +283 -0
- chia/plotting/create_plots.py +278 -0
- chia/plotting/manager.py +436 -0
- chia/plotting/util.py +336 -0
- chia/pools/__init__.py +0 -0
- chia/pools/pool_config.py +110 -0
- chia/pools/pool_puzzles.py +459 -0
- chia/pools/pool_wallet.py +933 -0
- chia/pools/pool_wallet_info.py +118 -0
- chia/pools/puzzles/__init__.py +0 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
- chia/protocols/__init__.py +0 -0
- chia/protocols/farmer_protocol.py +102 -0
- chia/protocols/full_node_protocol.py +219 -0
- chia/protocols/harvester_protocol.py +216 -0
- chia/protocols/introducer_protocol.py +25 -0
- chia/protocols/pool_protocol.py +177 -0
- chia/protocols/protocol_message_types.py +139 -0
- chia/protocols/protocol_state_machine.py +87 -0
- chia/protocols/protocol_timing.py +8 -0
- chia/protocols/shared_protocol.py +86 -0
- chia/protocols/timelord_protocol.py +93 -0
- chia/protocols/wallet_protocol.py +401 -0
- chia/py.typed +0 -0
- chia/rpc/__init__.py +0 -0
- chia/rpc/crawler_rpc_api.py +80 -0
- chia/rpc/data_layer_rpc_api.py +644 -0
- chia/rpc/data_layer_rpc_client.py +188 -0
- chia/rpc/data_layer_rpc_util.py +58 -0
- chia/rpc/farmer_rpc_api.py +365 -0
- chia/rpc/farmer_rpc_client.py +86 -0
- chia/rpc/full_node_rpc_api.py +959 -0
- chia/rpc/full_node_rpc_client.py +292 -0
- chia/rpc/harvester_rpc_api.py +141 -0
- chia/rpc/harvester_rpc_client.py +54 -0
- chia/rpc/rpc_client.py +164 -0
- chia/rpc/rpc_server.py +521 -0
- chia/rpc/timelord_rpc_api.py +32 -0
- chia/rpc/util.py +93 -0
- chia/rpc/wallet_request_types.py +904 -0
- chia/rpc/wallet_rpc_api.py +4943 -0
- chia/rpc/wallet_rpc_client.py +1814 -0
- chia/seeder/__init__.py +0 -0
- chia/seeder/crawl_store.py +425 -0
- chia/seeder/crawler.py +410 -0
- chia/seeder/crawler_api.py +135 -0
- chia/seeder/dns_server.py +593 -0
- chia/seeder/peer_record.py +146 -0
- chia/seeder/start_crawler.py +92 -0
- chia/server/__init__.py +0 -0
- chia/server/address_manager.py +658 -0
- chia/server/address_manager_store.py +237 -0
- chia/server/api_protocol.py +116 -0
- chia/server/capabilities.py +24 -0
- chia/server/chia_policy.py +346 -0
- chia/server/introducer_peers.py +76 -0
- chia/server/node_discovery.py +714 -0
- chia/server/outbound_message.py +33 -0
- chia/server/rate_limit_numbers.py +214 -0
- chia/server/rate_limits.py +153 -0
- chia/server/server.py +741 -0
- chia/server/signal_handlers.py +120 -0
- chia/server/ssl_context.py +32 -0
- chia/server/start_data_layer.py +151 -0
- chia/server/start_farmer.py +98 -0
- chia/server/start_full_node.py +112 -0
- chia/server/start_harvester.py +93 -0
- chia/server/start_introducer.py +81 -0
- chia/server/start_service.py +316 -0
- chia/server/start_timelord.py +89 -0
- chia/server/start_wallet.py +113 -0
- chia/server/upnp.py +118 -0
- chia/server/ws_connection.py +766 -0
- chia/simulator/__init__.py +0 -0
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +2054 -0
- chia/simulator/full_node_simulator.py +794 -0
- chia/simulator/keyring.py +128 -0
- chia/simulator/setup_services.py +506 -0
- chia/simulator/simulator_constants.py +13 -0
- chia/simulator/simulator_full_node_rpc_api.py +99 -0
- chia/simulator/simulator_full_node_rpc_client.py +60 -0
- chia/simulator/simulator_protocol.py +29 -0
- chia/simulator/simulator_test_tools.py +164 -0
- chia/simulator/socket.py +24 -0
- chia/simulator/ssl_certs.py +114 -0
- chia/simulator/ssl_certs_1.py +697 -0
- chia/simulator/ssl_certs_10.py +697 -0
- chia/simulator/ssl_certs_2.py +697 -0
- chia/simulator/ssl_certs_3.py +697 -0
- chia/simulator/ssl_certs_4.py +697 -0
- chia/simulator/ssl_certs_5.py +697 -0
- chia/simulator/ssl_certs_6.py +697 -0
- chia/simulator/ssl_certs_7.py +697 -0
- chia/simulator/ssl_certs_8.py +697 -0
- chia/simulator/ssl_certs_9.py +697 -0
- chia/simulator/start_simulator.py +143 -0
- chia/simulator/wallet_tools.py +246 -0
- chia/ssl/__init__.py +0 -0
- chia/ssl/chia_ca.crt +19 -0
- chia/ssl/chia_ca.key +28 -0
- chia/ssl/create_ssl.py +249 -0
- chia/ssl/dst_root_ca.pem +20 -0
- chia/timelord/__init__.py +0 -0
- chia/timelord/iters_from_block.py +50 -0
- chia/timelord/timelord.py +1226 -0
- chia/timelord/timelord_api.py +138 -0
- chia/timelord/timelord_launcher.py +190 -0
- chia/timelord/timelord_state.py +244 -0
- chia/timelord/types.py +22 -0
- chia/types/__init__.py +0 -0
- chia/types/aliases.py +35 -0
- chia/types/block_protocol.py +20 -0
- chia/types/blockchain_format/__init__.py +0 -0
- chia/types/blockchain_format/classgroup.py +5 -0
- chia/types/blockchain_format/coin.py +28 -0
- chia/types/blockchain_format/foliage.py +8 -0
- chia/types/blockchain_format/pool_target.py +5 -0
- chia/types/blockchain_format/program.py +269 -0
- chia/types/blockchain_format/proof_of_space.py +135 -0
- chia/types/blockchain_format/reward_chain_block.py +6 -0
- chia/types/blockchain_format/serialized_program.py +5 -0
- chia/types/blockchain_format/sized_bytes.py +11 -0
- chia/types/blockchain_format/slots.py +9 -0
- chia/types/blockchain_format/sub_epoch_summary.py +5 -0
- chia/types/blockchain_format/tree_hash.py +72 -0
- chia/types/blockchain_format/vdf.py +86 -0
- chia/types/clvm_cost.py +13 -0
- chia/types/coin_record.py +43 -0
- chia/types/coin_spend.py +115 -0
- chia/types/condition_opcodes.py +73 -0
- chia/types/condition_with_args.py +16 -0
- chia/types/eligible_coin_spends.py +365 -0
- chia/types/end_of_slot_bundle.py +5 -0
- chia/types/fee_rate.py +38 -0
- chia/types/full_block.py +5 -0
- chia/types/generator_types.py +13 -0
- chia/types/header_block.py +5 -0
- chia/types/internal_mempool_item.py +18 -0
- chia/types/mempool_inclusion_status.py +9 -0
- chia/types/mempool_item.py +85 -0
- chia/types/mempool_submission_status.py +30 -0
- chia/types/mojos.py +7 -0
- chia/types/peer_info.py +64 -0
- chia/types/signing_mode.py +29 -0
- chia/types/spend_bundle.py +30 -0
- chia/types/spend_bundle_conditions.py +7 -0
- chia/types/transaction_queue_entry.py +55 -0
- chia/types/unfinished_block.py +5 -0
- chia/types/unfinished_header_block.py +37 -0
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +49 -0
- chia/util/__init__.py +0 -0
- chia/util/action_scope.py +168 -0
- chia/util/async_pool.py +226 -0
- chia/util/augmented_chain.py +134 -0
- chia/util/batches.py +42 -0
- chia/util/bech32m.py +126 -0
- chia/util/beta_metrics.py +119 -0
- chia/util/block_cache.py +56 -0
- chia/util/byte_types.py +12 -0
- chia/util/check_fork_next_block.py +33 -0
- chia/util/chia_logging.py +144 -0
- chia/util/chia_version.py +33 -0
- chia/util/collection.py +17 -0
- chia/util/condition_tools.py +201 -0
- chia/util/config.py +367 -0
- chia/util/cpu.py +22 -0
- chia/util/db_synchronous.py +23 -0
- chia/util/db_version.py +32 -0
- chia/util/db_wrapper.py +430 -0
- chia/util/default_root.py +27 -0
- chia/util/dump_keyring.py +93 -0
- chia/util/english.txt +2048 -0
- chia/util/errors.py +353 -0
- chia/util/file_keyring.py +469 -0
- chia/util/files.py +97 -0
- chia/util/full_block_utils.py +345 -0
- chia/util/generator_tools.py +72 -0
- chia/util/hash.py +31 -0
- chia/util/initial-config.yaml +694 -0
- chia/util/inline_executor.py +26 -0
- chia/util/ints.py +19 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +37 -0
- chia/util/keychain.py +676 -0
- chia/util/keyring_wrapper.py +327 -0
- chia/util/limited_semaphore.py +41 -0
- chia/util/lock.py +49 -0
- chia/util/log_exceptions.py +32 -0
- chia/util/logging.py +36 -0
- chia/util/lru_cache.py +31 -0
- chia/util/math.py +20 -0
- chia/util/network.py +182 -0
- chia/util/paginator.py +48 -0
- chia/util/path.py +31 -0
- chia/util/permissions.py +20 -0
- chia/util/prev_transaction_block.py +21 -0
- chia/util/priority_mutex.py +95 -0
- chia/util/profiler.py +197 -0
- chia/util/recursive_replace.py +24 -0
- chia/util/safe_cancel_task.py +16 -0
- chia/util/service_groups.py +47 -0
- chia/util/setproctitle.py +22 -0
- chia/util/significant_bits.py +32 -0
- chia/util/ssl_check.py +213 -0
- chia/util/streamable.py +642 -0
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +382 -0
- chia/util/timing.py +67 -0
- chia/util/vdf_prover.py +30 -0
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +66 -0
- chia/wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/cat_constants.py +75 -0
- chia/wallet/cat_wallet/cat_info.py +47 -0
- chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
- chia/wallet/cat_wallet/cat_utils.py +164 -0
- chia/wallet/cat_wallet/cat_wallet.py +855 -0
- chia/wallet/cat_wallet/dao_cat_info.py +28 -0
- chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
- chia/wallet/cat_wallet/lineage_store.py +74 -0
- chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
- chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
- chia/wallet/coin_selection.py +188 -0
- chia/wallet/conditions.py +1512 -0
- chia/wallet/dao_wallet/__init__.py +0 -0
- chia/wallet/dao_wallet/dao_info.py +61 -0
- chia/wallet/dao_wallet/dao_utils.py +811 -0
- chia/wallet/dao_wallet/dao_wallet.py +2119 -0
- chia/wallet/db_wallet/__init__.py +0 -0
- chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
- chia/wallet/derivation_record.py +30 -0
- chia/wallet/derive_keys.py +146 -0
- chia/wallet/did_wallet/__init__.py +0 -0
- chia/wallet/did_wallet/did_info.py +39 -0
- chia/wallet/did_wallet/did_wallet.py +1494 -0
- chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
- chia/wallet/did_wallet/puzzles/__init__.py +0 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
- chia/wallet/driver_protocol.py +26 -0
- chia/wallet/key_val_store.py +55 -0
- chia/wallet/lineage_proof.py +58 -0
- chia/wallet/nft_wallet/__init__.py +0 -0
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
- chia/wallet/nft_wallet/nft_info.py +120 -0
- chia/wallet/nft_wallet/nft_puzzles.py +305 -0
- chia/wallet/nft_wallet/nft_wallet.py +1687 -0
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
- chia/wallet/nft_wallet/uncurry_nft.py +217 -0
- chia/wallet/notification_manager.py +117 -0
- chia/wallet/notification_store.py +178 -0
- chia/wallet/outer_puzzles.py +84 -0
- chia/wallet/payment.py +33 -0
- chia/wallet/puzzle_drivers.py +118 -0
- chia/wallet/puzzles/__init__.py +0 -0
- chia/wallet/puzzles/augmented_condition.clsp +13 -0
- chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
- chia/wallet/puzzles/clawback/__init__.py +0 -0
- chia/wallet/puzzles/clawback/drivers.py +188 -0
- chia/wallet/puzzles/clawback/metadata.py +38 -0
- chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
- chia/wallet/puzzles/condition_codes.clib +77 -0
- chia/wallet/puzzles/curry-and-treehash.clib +102 -0
- chia/wallet/puzzles/curry.clib +135 -0
- chia/wallet/puzzles/curry_by_index.clib +16 -0
- chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
- chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp +35 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_lockup.clsp +288 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal.clsp +377 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_treasury.clsp +115 -0
- chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
- chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
- chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
- chia/wallet/puzzles/json.clib +25 -0
- chia/wallet/puzzles/load_clvm.py +161 -0
- chia/wallet/puzzles/merkle_utils.clib +18 -0
- chia/wallet/puzzles/notification.clsp +7 -0
- chia/wallet/puzzles/notification.clsp.hex +1 -0
- chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
- chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.clsp +3 -0
- chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.py +26 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
- chia/wallet/puzzles/p2_parent.clsp +19 -0
- chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
- chia/wallet/puzzles/p2_singleton.clsp +30 -0
- chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/puzzle_utils.py +34 -0
- chia/wallet/puzzles/settlement_payments.clsp +49 -0
- chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
- chia/wallet/puzzles/sha256tree.clib +11 -0
- chia/wallet/puzzles/singleton_launcher.clsp +16 -0
- chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
- chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.py +296 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
- chia/wallet/puzzles/singleton_truths.clib +21 -0
- chia/wallet/puzzles/tails.py +348 -0
- chia/wallet/puzzles/utility_macros.clib +48 -0
- chia/wallet/signer_protocol.py +125 -0
- chia/wallet/singleton.py +106 -0
- chia/wallet/singleton_record.py +30 -0
- chia/wallet/trade_manager.py +1102 -0
- chia/wallet/trade_record.py +67 -0
- chia/wallet/trading/__init__.py +0 -0
- chia/wallet/trading/offer.py +702 -0
- chia/wallet/trading/trade_status.py +13 -0
- chia/wallet/trading/trade_store.py +526 -0
- chia/wallet/transaction_record.py +158 -0
- chia/wallet/transaction_sorting.py +14 -0
- chia/wallet/uncurried_puzzle.py +17 -0
- chia/wallet/util/__init__.py +0 -0
- chia/wallet/util/address_type.py +55 -0
- chia/wallet/util/blind_signer_tl.py +164 -0
- chia/wallet/util/clvm_streamable.py +203 -0
- chia/wallet/util/compute_hints.py +66 -0
- chia/wallet/util/compute_memos.py +43 -0
- chia/wallet/util/curry_and_treehash.py +91 -0
- chia/wallet/util/debug_spend_bundle.py +232 -0
- chia/wallet/util/merkle_tree.py +100 -0
- chia/wallet/util/merkle_utils.py +102 -0
- chia/wallet/util/new_peak_queue.py +82 -0
- chia/wallet/util/notifications.py +12 -0
- chia/wallet/util/peer_request_cache.py +174 -0
- chia/wallet/util/pprint.py +39 -0
- chia/wallet/util/puzzle_compression.py +95 -0
- chia/wallet/util/puzzle_decorator.py +100 -0
- chia/wallet/util/puzzle_decorator_type.py +7 -0
- chia/wallet/util/query_filter.py +59 -0
- chia/wallet/util/transaction_type.py +23 -0
- chia/wallet/util/tx_config.py +158 -0
- chia/wallet/util/wallet_sync_utils.py +351 -0
- chia/wallet/util/wallet_types.py +72 -0
- chia/wallet/vc_wallet/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
- chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
- chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
- chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_drivers.py +838 -0
- chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_store.py +263 -0
- chia/wallet/vc_wallet/vc_wallet.py +638 -0
- chia/wallet/wallet.py +698 -0
- chia/wallet/wallet_action_scope.py +96 -0
- chia/wallet/wallet_blockchain.py +244 -0
- chia/wallet/wallet_coin_record.py +72 -0
- chia/wallet/wallet_coin_store.py +351 -0
- chia/wallet/wallet_info.py +35 -0
- chia/wallet/wallet_interested_store.py +188 -0
- chia/wallet/wallet_nft_store.py +279 -0
- chia/wallet/wallet_node.py +1765 -0
- chia/wallet/wallet_node_api.py +207 -0
- chia/wallet/wallet_pool_store.py +119 -0
- chia/wallet/wallet_protocol.py +90 -0
- chia/wallet/wallet_puzzle_store.py +396 -0
- chia/wallet/wallet_retry_store.py +70 -0
- chia/wallet/wallet_singleton_store.py +259 -0
- chia/wallet/wallet_spend_bundle.py +25 -0
- chia/wallet/wallet_state_manager.py +2819 -0
- chia/wallet/wallet_transaction_store.py +496 -0
- chia/wallet/wallet_user_store.py +110 -0
- chia/wallet/wallet_weight_proof_handler.py +126 -0
- chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
- chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
- chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
- chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
- chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
- mozilla-ca/cacert.pem +3611 -0
|
File without changes
|
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import TYPE_CHECKING, Callable, Optional
|
|
7
|
+
|
|
8
|
+
import aiosqlite
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
# TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469
|
|
12
|
+
from _pytest.fixtures import SubRequest
|
|
13
|
+
|
|
14
|
+
from chia._tests.util.db_connection import DBConnection, PathDBConnection
|
|
15
|
+
from chia._tests.util.misc import Marks, boolean_datacases, datacases
|
|
16
|
+
from chia.util.db_wrapper import DBWrapper2, ForeignKeyError, InternalError, NestedForeignKeyDelayedRequestError
|
|
17
|
+
from chia.util.task_referencer import create_referenced_task
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
ConnectionContextManager = contextlib.AbstractAsyncContextManager[aiosqlite.core.Connection]
|
|
21
|
+
GetReaderMethod = Callable[[DBWrapper2], Callable[[], ConnectionContextManager]]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class UniqueError(Exception):
|
|
25
|
+
"""Used to uniquely trigger the exception path out of the context managers."""
|
|
26
|
+
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def increment_counter(db_wrapper: DBWrapper2) -> None:
|
|
31
|
+
async with db_wrapper.writer_maybe_transaction() as connection:
|
|
32
|
+
async with connection.execute("SELECT value FROM counter") as cursor:
|
|
33
|
+
row = await cursor.fetchone()
|
|
34
|
+
|
|
35
|
+
assert row is not None
|
|
36
|
+
[old_value] = row
|
|
37
|
+
|
|
38
|
+
await asyncio.sleep(0)
|
|
39
|
+
|
|
40
|
+
new_value = old_value + 1
|
|
41
|
+
await connection.execute("UPDATE counter SET value = :value", {"value": new_value})
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def decrement_counter(db_wrapper: DBWrapper2) -> None:
|
|
45
|
+
async with db_wrapper.writer_maybe_transaction() as connection:
|
|
46
|
+
async with connection.execute("SELECT value FROM counter") as cursor:
|
|
47
|
+
row = await cursor.fetchone()
|
|
48
|
+
|
|
49
|
+
assert row is not None
|
|
50
|
+
[old_value] = row
|
|
51
|
+
|
|
52
|
+
await asyncio.sleep(0)
|
|
53
|
+
|
|
54
|
+
new_value = old_value - 1
|
|
55
|
+
await connection.execute("UPDATE counter SET value = :value", {"value": new_value})
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
async def sum_counter(db_wrapper: DBWrapper2, output: list[int]) -> None:
|
|
59
|
+
async with db_wrapper.reader_no_transaction() as connection:
|
|
60
|
+
async with connection.execute("SELECT value FROM counter") as cursor:
|
|
61
|
+
row = await cursor.fetchone()
|
|
62
|
+
|
|
63
|
+
assert row is not None
|
|
64
|
+
[value] = row
|
|
65
|
+
|
|
66
|
+
output.append(value)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
async def setup_table(db: DBWrapper2) -> None:
|
|
70
|
+
async with db.writer_maybe_transaction() as conn:
|
|
71
|
+
await conn.execute("CREATE TABLE counter(value INTEGER NOT NULL)")
|
|
72
|
+
await conn.execute("INSERT INTO counter(value) VALUES(0)")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
async def get_value(cursor: aiosqlite.Cursor) -> int:
|
|
76
|
+
row = await cursor.fetchone()
|
|
77
|
+
assert row
|
|
78
|
+
return int(row[0])
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
async def query_value(connection: aiosqlite.Connection) -> int:
|
|
82
|
+
async with connection.execute("SELECT value FROM counter") as cursor:
|
|
83
|
+
return await get_value(cursor=cursor)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _get_reader_no_transaction_method(db_wrapper: DBWrapper2) -> Callable[[], ConnectionContextManager]:
|
|
87
|
+
return db_wrapper.reader_no_transaction
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _get_regular_reader_method(db_wrapper: DBWrapper2) -> Callable[[], ConnectionContextManager]:
|
|
91
|
+
return db_wrapper.reader
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@pytest.fixture(
|
|
95
|
+
name="get_reader_method",
|
|
96
|
+
params=[
|
|
97
|
+
pytest.param(_get_reader_no_transaction_method, id="reader_no_transaction"),
|
|
98
|
+
pytest.param(_get_regular_reader_method, id="reader"),
|
|
99
|
+
],
|
|
100
|
+
)
|
|
101
|
+
def get_reader_method_fixture(request: SubRequest) -> Callable[[], ConnectionContextManager]:
|
|
102
|
+
# https://github.com/pytest-dev/pytest/issues/8763
|
|
103
|
+
return request.param # type: ignore[no-any-return]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@pytest.mark.anyio
|
|
107
|
+
@pytest.mark.parametrize(
|
|
108
|
+
argnames="acquire_outside",
|
|
109
|
+
argvalues=[pytest.param(False, id="not acquired outside"), pytest.param(True, id="acquired outside")],
|
|
110
|
+
)
|
|
111
|
+
async def test_concurrent_writers(acquire_outside: bool, get_reader_method: GetReaderMethod) -> None:
|
|
112
|
+
async with DBConnection(2) as db_wrapper:
|
|
113
|
+
await setup_table(db_wrapper)
|
|
114
|
+
|
|
115
|
+
concurrent_task_count = 200
|
|
116
|
+
|
|
117
|
+
async with contextlib.AsyncExitStack() as exit_stack:
|
|
118
|
+
if acquire_outside:
|
|
119
|
+
await exit_stack.enter_async_context(db_wrapper.writer_maybe_transaction())
|
|
120
|
+
|
|
121
|
+
tasks = []
|
|
122
|
+
for index in range(concurrent_task_count):
|
|
123
|
+
task = create_referenced_task(increment_counter(db_wrapper))
|
|
124
|
+
tasks.append(task)
|
|
125
|
+
|
|
126
|
+
await asyncio.wait_for(asyncio.gather(*tasks), timeout=None)
|
|
127
|
+
|
|
128
|
+
async with get_reader_method(db_wrapper)() as connection:
|
|
129
|
+
async with connection.execute("SELECT value FROM counter") as cursor:
|
|
130
|
+
row = await cursor.fetchone()
|
|
131
|
+
|
|
132
|
+
assert row is not None
|
|
133
|
+
[value] = row
|
|
134
|
+
|
|
135
|
+
assert value == concurrent_task_count
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
@pytest.mark.anyio
|
|
139
|
+
async def test_writers_nests() -> None:
|
|
140
|
+
async with DBConnection(2) as db_wrapper:
|
|
141
|
+
await setup_table(db_wrapper)
|
|
142
|
+
async with db_wrapper.writer_maybe_transaction() as conn1:
|
|
143
|
+
async with conn1.execute("SELECT value FROM counter") as cursor:
|
|
144
|
+
value = await get_value(cursor)
|
|
145
|
+
async with db_wrapper.writer_maybe_transaction() as conn2:
|
|
146
|
+
assert conn1 == conn2
|
|
147
|
+
value += 1
|
|
148
|
+
await conn2.execute("UPDATE counter SET value = :value", {"value": value})
|
|
149
|
+
async with db_wrapper.writer_maybe_transaction() as conn3:
|
|
150
|
+
assert conn1 == conn3
|
|
151
|
+
async with conn3.execute("SELECT value FROM counter") as cursor:
|
|
152
|
+
value = await get_value(cursor)
|
|
153
|
+
|
|
154
|
+
assert value == 1
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@pytest.mark.anyio
|
|
158
|
+
async def test_writer_journal_mode_wal() -> None:
|
|
159
|
+
async with PathDBConnection(2) as db_wrapper:
|
|
160
|
+
async with db_wrapper.writer() as connection:
|
|
161
|
+
async with connection.execute("PRAGMA journal_mode") as cursor:
|
|
162
|
+
result = await cursor.fetchone()
|
|
163
|
+
assert result == ("wal",)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@pytest.mark.anyio
|
|
167
|
+
async def test_reader_journal_mode_wal() -> None:
|
|
168
|
+
async with PathDBConnection(2) as db_wrapper:
|
|
169
|
+
async with db_wrapper.reader_no_transaction() as connection:
|
|
170
|
+
async with connection.execute("PRAGMA journal_mode") as cursor:
|
|
171
|
+
result = await cursor.fetchone()
|
|
172
|
+
assert result == ("wal",)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
@pytest.mark.anyio
|
|
176
|
+
async def test_partial_failure() -> None:
|
|
177
|
+
values = []
|
|
178
|
+
async with DBConnection(2) as db_wrapper:
|
|
179
|
+
await setup_table(db_wrapper)
|
|
180
|
+
async with db_wrapper.writer() as conn1:
|
|
181
|
+
await conn1.execute("UPDATE counter SET value = 42")
|
|
182
|
+
async with conn1.execute("SELECT value FROM counter") as cursor:
|
|
183
|
+
values.append(await get_value(cursor))
|
|
184
|
+
try:
|
|
185
|
+
async with db_wrapper.writer() as conn2:
|
|
186
|
+
await conn2.execute("UPDATE counter SET value = 1337")
|
|
187
|
+
async with conn1.execute("SELECT value FROM counter") as cursor:
|
|
188
|
+
values.append(await get_value(cursor))
|
|
189
|
+
# this simulates a failure, which will cause a rollback of the
|
|
190
|
+
# write we just made, back to 42
|
|
191
|
+
raise RuntimeError("failure within a sub-transaction")
|
|
192
|
+
except RuntimeError:
|
|
193
|
+
# we expect to get here
|
|
194
|
+
values.append(1)
|
|
195
|
+
async with conn1.execute("SELECT value FROM counter") as cursor:
|
|
196
|
+
values.append(await get_value(cursor))
|
|
197
|
+
|
|
198
|
+
# the write of 1337 failed, and was restored to 42
|
|
199
|
+
assert values == [42, 1337, 1, 42]
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@pytest.mark.anyio
|
|
203
|
+
async def test_readers_nests(get_reader_method: GetReaderMethod) -> None:
|
|
204
|
+
async with DBConnection(2) as db_wrapper:
|
|
205
|
+
await setup_table(db_wrapper)
|
|
206
|
+
|
|
207
|
+
async with get_reader_method(db_wrapper)() as conn1:
|
|
208
|
+
async with get_reader_method(db_wrapper)() as conn2:
|
|
209
|
+
assert conn1 == conn2
|
|
210
|
+
async with get_reader_method(db_wrapper)() as conn3:
|
|
211
|
+
assert conn1 == conn3
|
|
212
|
+
async with conn3.execute("SELECT value FROM counter") as cursor:
|
|
213
|
+
value = await get_value(cursor)
|
|
214
|
+
|
|
215
|
+
assert value == 0
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
@pytest.mark.anyio
|
|
219
|
+
async def test_readers_nests_writer(get_reader_method: GetReaderMethod) -> None:
|
|
220
|
+
async with DBConnection(2) as db_wrapper:
|
|
221
|
+
await setup_table(db_wrapper)
|
|
222
|
+
|
|
223
|
+
async with db_wrapper.writer_maybe_transaction() as conn1:
|
|
224
|
+
async with get_reader_method(db_wrapper)() as conn2:
|
|
225
|
+
assert conn1 == conn2
|
|
226
|
+
async with db_wrapper.writer_maybe_transaction() as conn3:
|
|
227
|
+
assert conn1 == conn3
|
|
228
|
+
async with conn3.execute("SELECT value FROM counter") as cursor:
|
|
229
|
+
value = await get_value(cursor)
|
|
230
|
+
|
|
231
|
+
assert value == 0
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
@pytest.mark.parametrize(
|
|
235
|
+
argnames="transactioned",
|
|
236
|
+
argvalues=[
|
|
237
|
+
pytest.param(True, id="transaction"),
|
|
238
|
+
pytest.param(False, id="no transaction"),
|
|
239
|
+
],
|
|
240
|
+
)
|
|
241
|
+
@pytest.mark.anyio
|
|
242
|
+
async def test_only_transactioned_reader_ignores_writer(transactioned: bool) -> None:
|
|
243
|
+
writer_committed = asyncio.Event()
|
|
244
|
+
reader_read = asyncio.Event()
|
|
245
|
+
|
|
246
|
+
async def write() -> None:
|
|
247
|
+
try:
|
|
248
|
+
async with db_wrapper.writer() as writer:
|
|
249
|
+
assert reader is not writer
|
|
250
|
+
|
|
251
|
+
await writer.execute("UPDATE counter SET value = 1")
|
|
252
|
+
finally:
|
|
253
|
+
writer_committed.set()
|
|
254
|
+
|
|
255
|
+
await reader_read.wait()
|
|
256
|
+
|
|
257
|
+
assert await query_value(connection=writer) == 1
|
|
258
|
+
|
|
259
|
+
async with PathDBConnection(2) as db_wrapper:
|
|
260
|
+
get_reader = db_wrapper.reader if transactioned else db_wrapper.reader_no_transaction
|
|
261
|
+
|
|
262
|
+
await setup_table(db_wrapper)
|
|
263
|
+
|
|
264
|
+
async with get_reader() as reader:
|
|
265
|
+
assert await query_value(connection=reader) == 0
|
|
266
|
+
|
|
267
|
+
task = create_referenced_task(write())
|
|
268
|
+
await writer_committed.wait()
|
|
269
|
+
|
|
270
|
+
assert await query_value(connection=reader) == 0 if transactioned else 1
|
|
271
|
+
reader_read.set()
|
|
272
|
+
|
|
273
|
+
await task
|
|
274
|
+
|
|
275
|
+
async with get_reader() as reader:
|
|
276
|
+
assert await query_value(connection=reader) == 1
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
@pytest.mark.anyio
|
|
280
|
+
async def test_reader_nests_and_ends_transaction() -> None:
|
|
281
|
+
async with DBConnection(2) as db_wrapper:
|
|
282
|
+
async with db_wrapper.reader() as reader:
|
|
283
|
+
assert reader.in_transaction
|
|
284
|
+
|
|
285
|
+
async with db_wrapper.reader() as inner_reader:
|
|
286
|
+
assert inner_reader is reader
|
|
287
|
+
assert reader.in_transaction
|
|
288
|
+
|
|
289
|
+
assert reader.in_transaction
|
|
290
|
+
|
|
291
|
+
assert not reader.in_transaction
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
@pytest.mark.anyio
|
|
295
|
+
async def test_writer_in_reader_works() -> None:
|
|
296
|
+
async with PathDBConnection(2) as db_wrapper:
|
|
297
|
+
await setup_table(db_wrapper)
|
|
298
|
+
|
|
299
|
+
async with db_wrapper.reader() as reader:
|
|
300
|
+
async with db_wrapper.writer() as writer:
|
|
301
|
+
assert writer is not reader
|
|
302
|
+
await writer.execute("UPDATE counter SET value = 1")
|
|
303
|
+
assert await query_value(connection=writer) == 1
|
|
304
|
+
assert await query_value(connection=reader) == 0
|
|
305
|
+
|
|
306
|
+
assert await query_value(connection=reader) == 0
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
@pytest.mark.anyio
|
|
310
|
+
async def test_reader_transaction_is_deferred() -> None:
|
|
311
|
+
async with DBConnection(2) as db_wrapper:
|
|
312
|
+
await setup_table(db_wrapper)
|
|
313
|
+
|
|
314
|
+
async with db_wrapper.reader() as reader:
|
|
315
|
+
async with db_wrapper.writer() as writer:
|
|
316
|
+
assert writer is not reader
|
|
317
|
+
await writer.execute("UPDATE counter SET value = 1")
|
|
318
|
+
assert await query_value(connection=writer) == 1
|
|
319
|
+
|
|
320
|
+
# The deferred transaction initiation results in the transaction starting
|
|
321
|
+
# here and thus reading the written value.
|
|
322
|
+
assert await query_value(connection=reader) == 1
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
@pytest.mark.anyio
|
|
326
|
+
@pytest.mark.parametrize(
|
|
327
|
+
argnames="acquire_outside",
|
|
328
|
+
argvalues=[pytest.param(False, id="not acquired outside"), pytest.param(True, id="acquired outside")],
|
|
329
|
+
)
|
|
330
|
+
async def test_concurrent_readers(acquire_outside: bool, get_reader_method: GetReaderMethod) -> None:
|
|
331
|
+
async with DBConnection(2) as db_wrapper:
|
|
332
|
+
await setup_table(db_wrapper)
|
|
333
|
+
|
|
334
|
+
async with db_wrapper.writer_maybe_transaction() as connection:
|
|
335
|
+
await connection.execute("UPDATE counter SET value = 1")
|
|
336
|
+
|
|
337
|
+
concurrent_task_count = 200
|
|
338
|
+
|
|
339
|
+
async with contextlib.AsyncExitStack() as exit_stack:
|
|
340
|
+
if acquire_outside:
|
|
341
|
+
await exit_stack.enter_async_context(get_reader_method(db_wrapper)())
|
|
342
|
+
|
|
343
|
+
tasks = []
|
|
344
|
+
values: list[int] = []
|
|
345
|
+
for index in range(concurrent_task_count):
|
|
346
|
+
task = create_referenced_task(sum_counter(db_wrapper, values))
|
|
347
|
+
tasks.append(task)
|
|
348
|
+
|
|
349
|
+
await asyncio.wait_for(asyncio.gather(*tasks), timeout=None)
|
|
350
|
+
|
|
351
|
+
assert values == [1] * concurrent_task_count
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
@pytest.mark.anyio
|
|
355
|
+
@pytest.mark.parametrize(
|
|
356
|
+
argnames="acquire_outside",
|
|
357
|
+
argvalues=[pytest.param(False, id="not acquired outside"), pytest.param(True, id="acquired outside")],
|
|
358
|
+
)
|
|
359
|
+
async def test_mixed_readers_writers(acquire_outside: bool, get_reader_method: GetReaderMethod) -> None:
|
|
360
|
+
async with PathDBConnection(2) as db_wrapper:
|
|
361
|
+
await setup_table(db_wrapper)
|
|
362
|
+
|
|
363
|
+
async with db_wrapper.writer_maybe_transaction() as connection:
|
|
364
|
+
await connection.execute("UPDATE counter SET value = 1")
|
|
365
|
+
|
|
366
|
+
concurrent_task_count = 200
|
|
367
|
+
|
|
368
|
+
async with contextlib.AsyncExitStack() as exit_stack:
|
|
369
|
+
if acquire_outside:
|
|
370
|
+
await exit_stack.enter_async_context(get_reader_method(db_wrapper)())
|
|
371
|
+
|
|
372
|
+
tasks = []
|
|
373
|
+
values: list[int] = []
|
|
374
|
+
for index in range(concurrent_task_count):
|
|
375
|
+
task = create_referenced_task(increment_counter(db_wrapper))
|
|
376
|
+
tasks.append(task)
|
|
377
|
+
task = create_referenced_task(decrement_counter(db_wrapper))
|
|
378
|
+
tasks.append(task)
|
|
379
|
+
task = create_referenced_task(sum_counter(db_wrapper, values))
|
|
380
|
+
tasks.append(task)
|
|
381
|
+
|
|
382
|
+
await asyncio.wait_for(asyncio.gather(*tasks), timeout=None)
|
|
383
|
+
|
|
384
|
+
# we increment and decrement the counter an equal number of times. It should
|
|
385
|
+
# end back at 1.
|
|
386
|
+
async with get_reader_method(db_wrapper)() as connection:
|
|
387
|
+
async with connection.execute("SELECT value FROM counter") as cursor:
|
|
388
|
+
row = await cursor.fetchone()
|
|
389
|
+
assert row is not None
|
|
390
|
+
assert row[0] == 1
|
|
391
|
+
|
|
392
|
+
# it's possible all increments or all decrements are run first
|
|
393
|
+
assert len(values) == concurrent_task_count
|
|
394
|
+
for v in values:
|
|
395
|
+
assert v > -99
|
|
396
|
+
assert v <= 100
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
@pytest.mark.parametrize(
|
|
400
|
+
argnames=["manager_method", "expected"],
|
|
401
|
+
argvalues=[
|
|
402
|
+
[DBWrapper2.writer, True],
|
|
403
|
+
[DBWrapper2.writer_maybe_transaction, True],
|
|
404
|
+
[DBWrapper2.reader, True],
|
|
405
|
+
[DBWrapper2.reader_no_transaction, False],
|
|
406
|
+
],
|
|
407
|
+
)
|
|
408
|
+
@pytest.mark.anyio
|
|
409
|
+
async def test_in_transaction_as_expected(
|
|
410
|
+
manager_method: Callable[[DBWrapper2], ConnectionContextManager],
|
|
411
|
+
expected: bool,
|
|
412
|
+
) -> None:
|
|
413
|
+
async with DBConnection(2) as db_wrapper:
|
|
414
|
+
await setup_table(db_wrapper)
|
|
415
|
+
|
|
416
|
+
async with manager_method(db_wrapper) as connection:
|
|
417
|
+
assert connection.in_transaction == expected
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
@pytest.mark.anyio
|
|
421
|
+
async def test_cancelled_reader_does_not_cancel_writer() -> None:
|
|
422
|
+
async with DBConnection(2) as db_wrapper:
|
|
423
|
+
await setup_table(db_wrapper)
|
|
424
|
+
|
|
425
|
+
async with db_wrapper.writer() as writer:
|
|
426
|
+
await writer.execute("UPDATE counter SET value = 1")
|
|
427
|
+
|
|
428
|
+
with pytest.raises(UniqueError):
|
|
429
|
+
async with db_wrapper.reader() as _:
|
|
430
|
+
raise UniqueError()
|
|
431
|
+
|
|
432
|
+
assert await query_value(connection=writer) == 1
|
|
433
|
+
|
|
434
|
+
assert await query_value(connection=writer) == 1
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
@boolean_datacases(name="initial", false="initially disabled", true="initially enabled")
|
|
438
|
+
@boolean_datacases(name="forced", false="forced disabled", true="forced enabled")
|
|
439
|
+
@pytest.mark.anyio
|
|
440
|
+
async def test_foreign_key_pragma_controlled_by_writer(initial: bool, forced: bool) -> None:
|
|
441
|
+
async with DBConnection(2, foreign_keys=initial) as db_wrapper:
|
|
442
|
+
async with db_wrapper.writer(foreign_key_enforcement_enabled=forced) as writer:
|
|
443
|
+
async with writer.execute("PRAGMA foreign_keys") as cursor:
|
|
444
|
+
result = await cursor.fetchone()
|
|
445
|
+
assert result is not None
|
|
446
|
+
[actual] = result
|
|
447
|
+
|
|
448
|
+
assert actual == (1 if forced else 0)
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
@pytest.mark.anyio
|
|
452
|
+
async def test_foreign_key_pragma_rolls_back_on_foreign_key_error() -> None:
|
|
453
|
+
async with DBConnection(2, foreign_keys=True, row_factory=aiosqlite.Row) as db_wrapper:
|
|
454
|
+
async with db_wrapper.writer() as writer:
|
|
455
|
+
async with writer.execute(
|
|
456
|
+
"""
|
|
457
|
+
CREATE TABLE people(
|
|
458
|
+
id INTEGER NOT NULL,
|
|
459
|
+
friend INTEGER,
|
|
460
|
+
PRIMARY KEY (id),
|
|
461
|
+
FOREIGN KEY (friend) REFERENCES people
|
|
462
|
+
)
|
|
463
|
+
"""
|
|
464
|
+
):
|
|
465
|
+
pass
|
|
466
|
+
|
|
467
|
+
async with writer.execute(
|
|
468
|
+
"INSERT INTO people(id, friend) VALUES (:id, :friend)",
|
|
469
|
+
{"id": 1, "friend": None},
|
|
470
|
+
):
|
|
471
|
+
pass
|
|
472
|
+
|
|
473
|
+
async with writer.execute(
|
|
474
|
+
"INSERT INTO people(id, friend) VALUES (:id, :friend)",
|
|
475
|
+
{"id": 2, "friend": 1},
|
|
476
|
+
):
|
|
477
|
+
pass
|
|
478
|
+
|
|
479
|
+
# make sure the writer raises a foreign key error on exit
|
|
480
|
+
with pytest.raises(ForeignKeyError):
|
|
481
|
+
async with db_wrapper.writer(foreign_key_enforcement_enabled=False) as writer:
|
|
482
|
+
async with writer.execute("DELETE FROM people WHERE id = 1"):
|
|
483
|
+
pass
|
|
484
|
+
|
|
485
|
+
# make sure a foreign key error can be detected here
|
|
486
|
+
with pytest.raises(ForeignKeyError):
|
|
487
|
+
await db_wrapper._check_foreign_keys()
|
|
488
|
+
|
|
489
|
+
async with writer.execute("SELECT * FROM people WHERE id = 1") as cursor:
|
|
490
|
+
[person] = await cursor.fetchall()
|
|
491
|
+
|
|
492
|
+
# make sure the delete was rolled back
|
|
493
|
+
assert dict(person) == {"id": 1, "friend": None}
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
@dataclass
|
|
497
|
+
class RowFactoryCase:
|
|
498
|
+
id: str
|
|
499
|
+
factory: Optional[type[aiosqlite.Row]]
|
|
500
|
+
marks: Marks = ()
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
row_factory_cases: list[RowFactoryCase] = [
|
|
504
|
+
RowFactoryCase(id="default named tuple", factory=None),
|
|
505
|
+
RowFactoryCase(id="aiosqlite row", factory=aiosqlite.Row),
|
|
506
|
+
]
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
@datacases(*row_factory_cases)
|
|
510
|
+
@pytest.mark.anyio
|
|
511
|
+
async def test_foreign_key_check_failure_error_message(case: RowFactoryCase) -> None:
|
|
512
|
+
async with DBConnection(2, foreign_keys=True, row_factory=case.factory) as db_wrapper:
|
|
513
|
+
async with db_wrapper.writer() as writer:
|
|
514
|
+
async with writer.execute(
|
|
515
|
+
"""
|
|
516
|
+
CREATE TABLE people(
|
|
517
|
+
id INTEGER NOT NULL,
|
|
518
|
+
friend INTEGER,
|
|
519
|
+
PRIMARY KEY (id),
|
|
520
|
+
FOREIGN KEY (friend) REFERENCES people
|
|
521
|
+
)
|
|
522
|
+
"""
|
|
523
|
+
):
|
|
524
|
+
pass
|
|
525
|
+
|
|
526
|
+
async with writer.execute(
|
|
527
|
+
"INSERT INTO people(id, friend) VALUES (:id, :friend)",
|
|
528
|
+
{"id": 1, "friend": None},
|
|
529
|
+
):
|
|
530
|
+
pass
|
|
531
|
+
|
|
532
|
+
async with writer.execute(
|
|
533
|
+
"INSERT INTO people(id, friend) VALUES (:id, :friend)",
|
|
534
|
+
{"id": 2, "friend": 1},
|
|
535
|
+
):
|
|
536
|
+
pass
|
|
537
|
+
|
|
538
|
+
# make sure the writer raises a foreign key error on exit
|
|
539
|
+
with pytest.raises(ForeignKeyError) as error:
|
|
540
|
+
async with db_wrapper.writer(foreign_key_enforcement_enabled=False) as writer:
|
|
541
|
+
async with writer.execute("DELETE FROM people WHERE id = 1"):
|
|
542
|
+
pass
|
|
543
|
+
|
|
544
|
+
assert error.value.violations == [{"table": "people", "rowid": 2, "parent": "people", "fkid": 0}]
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
@pytest.mark.anyio
|
|
548
|
+
async def test_set_foreign_keys_fails_within_acquired_writer() -> None:
|
|
549
|
+
async with DBConnection(2, foreign_keys=True) as db_wrapper:
|
|
550
|
+
async with db_wrapper.writer():
|
|
551
|
+
with pytest.raises(
|
|
552
|
+
InternalError,
|
|
553
|
+
match="Unable to set foreign key enforcement state while a writer is held",
|
|
554
|
+
):
|
|
555
|
+
async with db_wrapper._set_foreign_key_enforcement(enabled=False):
|
|
556
|
+
pass # pragma: no cover
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
@boolean_datacases(name="initial", false="initially disabled", true="initially enabled")
|
|
560
|
+
@pytest.mark.anyio
|
|
561
|
+
async def test_delayed_foreign_key_request_fails_when_nested(initial: bool) -> None:
|
|
562
|
+
async with DBConnection(2, foreign_keys=initial) as db_wrapper:
|
|
563
|
+
async with db_wrapper.writer():
|
|
564
|
+
with pytest.raises(NestedForeignKeyDelayedRequestError):
|
|
565
|
+
async with db_wrapper.writer(foreign_key_enforcement_enabled=True):
|
|
566
|
+
pass # pragma: no cover
|
|
File without changes
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import ClassVar, Protocol, TypeVar
|
|
5
|
+
|
|
6
|
+
from chia.rpc.rpc_server import RpcApiProtocol, RpcServer, RpcServiceProtocol
|
|
7
|
+
from chia.server.api_protocol import ApiProtocol
|
|
8
|
+
from chia.server.server import ChiaServer
|
|
9
|
+
from chia.server.start_service import Service
|
|
10
|
+
|
|
11
|
+
T_Node = TypeVar("T_Node", bound=RpcServiceProtocol)
|
|
12
|
+
T_RpcApi = TypeVar("T_RpcApi", bound=RpcApiProtocol)
|
|
13
|
+
T_PeerApi = TypeVar("T_PeerApi", bound=ApiProtocol)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class ServiceEnvironment(Protocol[T_Node, T_RpcApi, T_PeerApi]):
|
|
18
|
+
service: Service[T_Node, T_PeerApi, T_RpcApi]
|
|
19
|
+
|
|
20
|
+
__match_args__: ClassVar[tuple[str, ...]] = ()
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def node(self) -> T_Node: ...
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def rpc_api(self) -> T_RpcApi: ...
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def rpc_server(self) -> RpcServer[T_RpcApi]: ...
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def peer_api(self) -> T_PeerApi: ...
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def peer_server(self) -> ChiaServer: ...
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import TYPE_CHECKING, ClassVar, cast
|
|
5
|
+
|
|
6
|
+
from chia._tests.environments.common import ServiceEnvironment
|
|
7
|
+
from chia.full_node.full_node import FullNode
|
|
8
|
+
from chia.rpc.rpc_server import RpcServer
|
|
9
|
+
from chia.server.server import ChiaServer
|
|
10
|
+
from chia.server.start_service import Service
|
|
11
|
+
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
12
|
+
from chia.simulator.simulator_full_node_rpc_api import SimulatorFullNodeRpcApi
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class FullNodeEnvironment:
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
_protocol_check: ClassVar[ServiceEnvironment[FullNode, SimulatorFullNodeRpcApi, FullNodeSimulator]] = cast(
|
|
19
|
+
"FullNodeEnvironment",
|
|
20
|
+
None,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
__match_args__: ClassVar[tuple[str, ...]] = ()
|
|
24
|
+
|
|
25
|
+
service: Service[FullNode, FullNodeSimulator, SimulatorFullNodeRpcApi]
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def node(self) -> FullNode:
|
|
29
|
+
return self.service._node
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def rpc_api(self) -> SimulatorFullNodeRpcApi:
|
|
33
|
+
assert self.service.rpc_server is not None
|
|
34
|
+
return self.service.rpc_server.rpc_api
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def rpc_server(self) -> RpcServer[SimulatorFullNodeRpcApi]:
|
|
38
|
+
assert self.service.rpc_server is not None
|
|
39
|
+
return self.service.rpc_server
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def peer_api(self) -> FullNodeSimulator:
|
|
43
|
+
return self.service._api
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def peer_server(self) -> ChiaServer:
|
|
47
|
+
return self.service._server
|