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
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import time
|
|
6
|
+
from multiprocessing import Pool, TimeoutError
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from sys import platform
|
|
9
|
+
from time import sleep
|
|
10
|
+
from typing import Any, Callable
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
from chia.util.lock import Lockfile, LockfileError
|
|
15
|
+
|
|
16
|
+
log = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
DUMMY_SLEEP_VALUE = 2
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def dummy_fn_requiring_lock(*args: object, **kwargs: object) -> str:
|
|
23
|
+
return "A winner is you!"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def dummy_sleep_fn(*args: object, **kwargs: object) -> str:
|
|
27
|
+
sleep(DUMMY_SLEEP_VALUE)
|
|
28
|
+
return "I'm awake!"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def dummy_abort_fn(*args: object, **kwargs: object) -> None:
|
|
32
|
+
sleep(0.25)
|
|
33
|
+
os.abort()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def child_writer_dispatch(func: Callable[..., Any], path: Path, timeout: int, attempts: int) -> Any:
|
|
37
|
+
while attempts > 0:
|
|
38
|
+
attempts -= 1
|
|
39
|
+
try:
|
|
40
|
+
with Lockfile.create(path, timeout):
|
|
41
|
+
result = func()
|
|
42
|
+
return result
|
|
43
|
+
except LockfileError as e:
|
|
44
|
+
log.warning(f"[pid:{os.getpid()}] caught exception in child_writer_dispatch: LockfileError {e}")
|
|
45
|
+
raise e
|
|
46
|
+
except Exception as e:
|
|
47
|
+
log.warning(f"[pid:{os.getpid()}] caught exception in child_writer_dispatch: type: {type(e)}, {e}")
|
|
48
|
+
raise e
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def child_writer_dispatch_with_readiness_check(
|
|
52
|
+
func: Callable[..., Any], path: Path, timeout: int, attempts: int, ready_dir: Path, finished_dir: Path
|
|
53
|
+
) -> Any:
|
|
54
|
+
# Write out a file indicating this process is ready to begin
|
|
55
|
+
ready_file_path: Path = ready_dir / f"{os.getpid()}.ready"
|
|
56
|
+
with open(ready_file_path, "w") as f:
|
|
57
|
+
f.write(f"{os.getpid()}\n")
|
|
58
|
+
|
|
59
|
+
# Wait for all processes to indicate readiness
|
|
60
|
+
start_file_path: Path = ready_dir / "start"
|
|
61
|
+
end = time.monotonic() + 120
|
|
62
|
+
started = False
|
|
63
|
+
while not started and time.monotonic() < end:
|
|
64
|
+
started = start_file_path.exists()
|
|
65
|
+
sleep(0.1)
|
|
66
|
+
assert started
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
while attempts > 0:
|
|
70
|
+
log.warning(f"{path}, attempts {attempts}")
|
|
71
|
+
try:
|
|
72
|
+
with Lockfile.create(path, timeout):
|
|
73
|
+
result = func()
|
|
74
|
+
return result
|
|
75
|
+
except LockfileError:
|
|
76
|
+
attempts -= 1
|
|
77
|
+
if attempts == 0:
|
|
78
|
+
raise LockfileError()
|
|
79
|
+
except Exception as e:
|
|
80
|
+
log.warning(
|
|
81
|
+
f"[pid:{os.getpid()}] caught exception in child_writer_dispatch_with_readiness_check: "
|
|
82
|
+
f"type: {type(e)}, {e}"
|
|
83
|
+
)
|
|
84
|
+
raise e
|
|
85
|
+
finally:
|
|
86
|
+
# Write out a file indicating this process has completed its work
|
|
87
|
+
finished_file_path: Path = finished_dir / f"{os.getpid()}.finished"
|
|
88
|
+
with open(finished_file_path, "w") as f:
|
|
89
|
+
f.write(f"{os.getpid()}\n")
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def wait_for_enough_files_in_directory(dir: Path, expected_entries: int) -> bool:
|
|
93
|
+
found_all: bool = False
|
|
94
|
+
end = time.monotonic() + 120
|
|
95
|
+
while time.monotonic() < end:
|
|
96
|
+
entries = list(os.scandir(dir))
|
|
97
|
+
if len(entries) < expected_entries: # Expecting num_workers of dir entries
|
|
98
|
+
log.warning(f"Polling not complete: {len(entries)} of {expected_entries} entries found")
|
|
99
|
+
sleep(0.1)
|
|
100
|
+
else:
|
|
101
|
+
found_all = True
|
|
102
|
+
break
|
|
103
|
+
return found_all
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@pytest.fixture(scope="function")
|
|
107
|
+
def ready_dir(tmp_path: Path) -> Path:
|
|
108
|
+
ready_dir: Path = tmp_path / "ready"
|
|
109
|
+
ready_dir.mkdir(parents=True, exist_ok=True)
|
|
110
|
+
return ready_dir
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@pytest.fixture(scope="function")
|
|
114
|
+
def finished_dir(tmp_path: Path) -> Path:
|
|
115
|
+
finished_dir: Path = tmp_path / "finished"
|
|
116
|
+
finished_dir.mkdir(parents=True, exist_ok=True)
|
|
117
|
+
return finished_dir
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def test_timeout(tmp_path: Path, ready_dir: Path, finished_dir: Path) -> None:
|
|
121
|
+
"""
|
|
122
|
+
If the lock is already held, another process should not be able to acquire the same lock, failing after n attempts
|
|
123
|
+
"""
|
|
124
|
+
with Lockfile.create(tmp_path):
|
|
125
|
+
child_proc_fn = dummy_fn_requiring_lock
|
|
126
|
+
timeout = 0.25
|
|
127
|
+
attempts = 4
|
|
128
|
+
num_workers = 1
|
|
129
|
+
|
|
130
|
+
with Pool(processes=num_workers) as pool:
|
|
131
|
+
# When: a child process attempts to acquire the same writer lock, failing after 1 second
|
|
132
|
+
res = pool.starmap_async(
|
|
133
|
+
child_writer_dispatch_with_readiness_check,
|
|
134
|
+
[(child_proc_fn, tmp_path, timeout, attempts, ready_dir, finished_dir)],
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
assert wait_for_enough_files_in_directory(ready_dir, num_workers)
|
|
138
|
+
|
|
139
|
+
log.warning(f"Test setup complete: {num_workers} workers ready")
|
|
140
|
+
|
|
141
|
+
# Signal that testing should begin
|
|
142
|
+
start_file_path: Path = ready_dir / "start"
|
|
143
|
+
with open(start_file_path, "w") as f:
|
|
144
|
+
f.write(f"{os.getpid()}\n")
|
|
145
|
+
|
|
146
|
+
assert wait_for_enough_files_in_directory(finished_dir, num_workers)
|
|
147
|
+
|
|
148
|
+
log.warning(f"Finished: {num_workers} workers finished")
|
|
149
|
+
|
|
150
|
+
# Expect: the child to fail acquiring the writer lock (raises as LockfileError)
|
|
151
|
+
with pytest.raises(LockfileError):
|
|
152
|
+
# 10 second timeout to prevent a bad test from spoiling the fun (raises as LockfileError)
|
|
153
|
+
res.get(timeout=10)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def test_succeeds(tmp_path: Path, ready_dir: Path, finished_dir: Path) -> None:
|
|
157
|
+
"""
|
|
158
|
+
If the lock is already held, another process will be able to acquire the same lock once the lock is released by
|
|
159
|
+
the current holder
|
|
160
|
+
"""
|
|
161
|
+
# When: a lock is already acquired
|
|
162
|
+
with Lockfile.create(tmp_path) as lock:
|
|
163
|
+
child_proc_fn = dummy_fn_requiring_lock
|
|
164
|
+
timeout = 0.25
|
|
165
|
+
attempts = 8
|
|
166
|
+
num_workers = 1
|
|
167
|
+
|
|
168
|
+
with Pool(processes=num_workers) as pool:
|
|
169
|
+
# When: a child process attempts to acquire the same writer lock, failing after 1 second
|
|
170
|
+
res = pool.starmap_async(
|
|
171
|
+
child_writer_dispatch_with_readiness_check,
|
|
172
|
+
[(child_proc_fn, tmp_path, timeout, attempts, ready_dir, finished_dir)],
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
assert wait_for_enough_files_in_directory(ready_dir, num_workers)
|
|
176
|
+
|
|
177
|
+
log.warning(f"Test setup complete: {num_workers} workers ready")
|
|
178
|
+
|
|
179
|
+
# Signal that testing should begin
|
|
180
|
+
start_file_path: Path = ready_dir / "start"
|
|
181
|
+
with open(start_file_path, "w") as f:
|
|
182
|
+
f.write(f"{os.getpid()}\n")
|
|
183
|
+
|
|
184
|
+
# Brief delay to allow the child to timeout once
|
|
185
|
+
sleep(0.50)
|
|
186
|
+
|
|
187
|
+
# When: the writer lock is released
|
|
188
|
+
lock.release()
|
|
189
|
+
# Expect: the child to acquire the writer lock
|
|
190
|
+
result = res.get(timeout=10) # 10 second timeout to prevent a bad test from spoiling the fun
|
|
191
|
+
assert result[0] == "A winner is you!"
|
|
192
|
+
|
|
193
|
+
assert wait_for_enough_files_in_directory(finished_dir, num_workers)
|
|
194
|
+
|
|
195
|
+
log.warning(f"Finished: {num_workers} workers finished")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def test_reacquisition_failure(tmp_path: Path, ready_dir: Path, finished_dir: Path) -> None:
|
|
199
|
+
"""
|
|
200
|
+
After the child process acquires the lock (and sleeps), the previous holder should not be able to quickly reacquire
|
|
201
|
+
the lock
|
|
202
|
+
"""
|
|
203
|
+
# When: a lock is already acquired
|
|
204
|
+
with Lockfile.create(tmp_path) as lock:
|
|
205
|
+
child_proc_function = dummy_sleep_fn # Sleeps for DUMMY_SLEEP_VALUE seconds
|
|
206
|
+
timeout = 0.25
|
|
207
|
+
attempts = 8
|
|
208
|
+
num_workers = 1
|
|
209
|
+
|
|
210
|
+
with Pool(processes=num_workers) as pool:
|
|
211
|
+
# When: a child process attempts to acquire the same writer lock, failing after 1 second
|
|
212
|
+
pool.starmap_async(
|
|
213
|
+
child_writer_dispatch_with_readiness_check,
|
|
214
|
+
[(child_proc_function, tmp_path, timeout, attempts, ready_dir, finished_dir)],
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
assert wait_for_enough_files_in_directory(ready_dir, num_workers)
|
|
218
|
+
|
|
219
|
+
log.warning(f"Test setup complete: {num_workers} workers ready")
|
|
220
|
+
|
|
221
|
+
# Signal that testing should begin
|
|
222
|
+
start_file_path: Path = ready_dir / "start"
|
|
223
|
+
with open(start_file_path, "w") as f:
|
|
224
|
+
f.write(f"{os.getpid()}\n")
|
|
225
|
+
|
|
226
|
+
# When: the writer lock is released
|
|
227
|
+
lock.release()
|
|
228
|
+
# Brief delay to allow the child to acquire the lock
|
|
229
|
+
sleep(1)
|
|
230
|
+
|
|
231
|
+
# Expect: Reacquiring the lock should fail due to the child holding the lock and sleeping
|
|
232
|
+
with pytest.raises(LockfileError):
|
|
233
|
+
with Lockfile.create(tmp_path, timeout=0.25):
|
|
234
|
+
pass
|
|
235
|
+
|
|
236
|
+
assert wait_for_enough_files_in_directory(finished_dir, num_workers)
|
|
237
|
+
|
|
238
|
+
log.warning(f"Finished: {num_workers} workers finished")
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def test_reacquisition_success(tmp_path: Path, ready_dir: Path, finished_dir: Path) -> None:
|
|
242
|
+
"""
|
|
243
|
+
After the child process releases the lock, we should be able to acquire the lock
|
|
244
|
+
"""
|
|
245
|
+
# When: a writer lock is already acquired
|
|
246
|
+
with Lockfile.create(tmp_path) as lock:
|
|
247
|
+
child_proc_function = dummy_sleep_fn # Sleeps for DUMMY_SLEEP_VALUE seconds
|
|
248
|
+
timeout = 0.25
|
|
249
|
+
attempts = 4
|
|
250
|
+
num_workers = 1
|
|
251
|
+
|
|
252
|
+
with Pool(processes=num_workers) as pool:
|
|
253
|
+
# When: a child process attempts to acquire the same writer lock, failing after 1 second
|
|
254
|
+
pool.starmap_async(
|
|
255
|
+
child_writer_dispatch_with_readiness_check,
|
|
256
|
+
[(child_proc_function, tmp_path, timeout, attempts, ready_dir, finished_dir)],
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
assert wait_for_enough_files_in_directory(ready_dir, num_workers)
|
|
260
|
+
|
|
261
|
+
log.warning(f"Test setup complete: {num_workers} workers ready")
|
|
262
|
+
|
|
263
|
+
# Signal that testing should begin
|
|
264
|
+
start_file_path: Path = ready_dir / "start"
|
|
265
|
+
with open(start_file_path, "w") as f:
|
|
266
|
+
f.write(f"{os.getpid()}\n")
|
|
267
|
+
|
|
268
|
+
# When: the writer lock is released
|
|
269
|
+
lock.release()
|
|
270
|
+
assert wait_for_enough_files_in_directory(finished_dir, num_workers)
|
|
271
|
+
|
|
272
|
+
log.warning(f"Finished: {num_workers} workers finished")
|
|
273
|
+
|
|
274
|
+
# Expect: Reacquiring the lock should succeed after the child finishes and releases the lock
|
|
275
|
+
with Lockfile.create(tmp_path, timeout=(DUMMY_SLEEP_VALUE + 0.25)):
|
|
276
|
+
pass
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
@pytest.mark.skipif(platform == "darwin", reason="triggers the CrashReporter prompt")
|
|
280
|
+
def test_released_on_abort(tmp_path: Path) -> None:
|
|
281
|
+
"""
|
|
282
|
+
When a child process is holding the lock and aborts/crashes, we should be able to acquire the lock
|
|
283
|
+
"""
|
|
284
|
+
# When: a writer lock is already acquired
|
|
285
|
+
with Lockfile.create(tmp_path) as lock:
|
|
286
|
+
child_proc_function = dummy_abort_fn
|
|
287
|
+
timeout = 0.25
|
|
288
|
+
attempts = 4
|
|
289
|
+
|
|
290
|
+
with Pool(processes=1) as pool:
|
|
291
|
+
# When: a child process attempts to acquire the same writer lock, failing after 1 second
|
|
292
|
+
res = pool.starmap_async(child_writer_dispatch, [(child_proc_function, tmp_path, timeout, attempts)])
|
|
293
|
+
|
|
294
|
+
# When: the writer lock is released
|
|
295
|
+
lock.release()
|
|
296
|
+
# When: timing out waiting for the child process (because it aborted)
|
|
297
|
+
with pytest.raises(TimeoutError):
|
|
298
|
+
res.get(timeout=2)
|
|
299
|
+
|
|
300
|
+
# Expect: Reacquiring the lock should succeed after the child exits, automatically releasing the lock
|
|
301
|
+
with Lockfile.create(tmp_path, timeout=2):
|
|
302
|
+
pass
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def test_blocked_by_readers(tmp_path: Path, ready_dir: Path, finished_dir: Path) -> None:
|
|
306
|
+
"""
|
|
307
|
+
When a lock is already held, another thread/process should not be able to acquire the lock
|
|
308
|
+
"""
|
|
309
|
+
with Lockfile.create(tmp_path):
|
|
310
|
+
child_proc_function = dummy_fn_requiring_lock
|
|
311
|
+
timeout = 0.25
|
|
312
|
+
attempts = 4
|
|
313
|
+
num_workers = 1
|
|
314
|
+
|
|
315
|
+
with Pool(processes=num_workers) as pool:
|
|
316
|
+
# When: a child process attempts to acquire the same lock for writing, failing after 1 second
|
|
317
|
+
res = pool.starmap_async(
|
|
318
|
+
child_writer_dispatch_with_readiness_check,
|
|
319
|
+
[(child_proc_function, tmp_path, timeout, attempts, ready_dir, finished_dir)],
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
assert wait_for_enough_files_in_directory(ready_dir, num_workers)
|
|
323
|
+
|
|
324
|
+
log.warning(f"Test setup complete: {num_workers} workers ready")
|
|
325
|
+
|
|
326
|
+
# Signal that testing should begin
|
|
327
|
+
start_file_path: Path = ready_dir / "start"
|
|
328
|
+
with open(start_file_path, "w") as f:
|
|
329
|
+
f.write(f"{os.getpid()}\n")
|
|
330
|
+
|
|
331
|
+
assert wait_for_enough_files_in_directory(finished_dir, num_workers)
|
|
332
|
+
|
|
333
|
+
log.warning(f"Finished: {num_workers} workers finished")
|
|
334
|
+
|
|
335
|
+
# Expect: lock acquisition times out (raises as LockfileError)
|
|
336
|
+
with pytest.raises(LockfileError):
|
|
337
|
+
res.get(timeout=30)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def test_initially_blocked_by_readers(tmp_path: Path, ready_dir: Path, finished_dir: Path) -> None:
|
|
341
|
+
"""
|
|
342
|
+
When a lock is already held, another thread/process should not be able to acquire the lock until the process
|
|
343
|
+
currently holding the lock releases it
|
|
344
|
+
"""
|
|
345
|
+
# When: the lock is already acquired
|
|
346
|
+
with Lockfile.create(tmp_path) as lock:
|
|
347
|
+
child_proc_function = dummy_fn_requiring_lock
|
|
348
|
+
timeout = 1
|
|
349
|
+
attempts = 10
|
|
350
|
+
num_workers = 1
|
|
351
|
+
|
|
352
|
+
with Pool(processes=num_workers) as pool:
|
|
353
|
+
# When: a child process attempts to acquire the same lock for writing, failing after 4 seconds
|
|
354
|
+
res = pool.starmap_async(
|
|
355
|
+
child_writer_dispatch_with_readiness_check,
|
|
356
|
+
[(child_proc_function, tmp_path, timeout, attempts, ready_dir, finished_dir)],
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
assert wait_for_enough_files_in_directory(ready_dir, num_workers)
|
|
360
|
+
|
|
361
|
+
log.warning(f"Test setup complete: {num_workers} workers ready")
|
|
362
|
+
|
|
363
|
+
# Signal that testing should begin
|
|
364
|
+
start_file_path: Path = ready_dir / "start"
|
|
365
|
+
with open(start_file_path, "w") as f:
|
|
366
|
+
f.write(f"{os.getpid()}\n")
|
|
367
|
+
|
|
368
|
+
# When: we verify that the writer lock is not immediately acquired
|
|
369
|
+
with pytest.raises(TimeoutError):
|
|
370
|
+
res.get(timeout=5)
|
|
371
|
+
|
|
372
|
+
# When: the reader releases its lock
|
|
373
|
+
lock.release()
|
|
374
|
+
assert wait_for_enough_files_in_directory(finished_dir, num_workers)
|
|
375
|
+
|
|
376
|
+
log.warning(f"Finished: {num_workers} workers finished")
|
|
377
|
+
|
|
378
|
+
# Expect: the child process to acquire the writer lock
|
|
379
|
+
result = res.get(timeout=10) # 10 second timeout to prevent a bad test from spoiling the fun
|
|
380
|
+
assert result[0] == "A winner is you!"
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import contextlib
|
|
4
|
+
import dataclasses
|
|
5
|
+
import logging
|
|
6
|
+
import re
|
|
7
|
+
from typing import Union
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
from chia.util.log_exceptions import log_exceptions
|
|
12
|
+
|
|
13
|
+
log_message = "Some message that probably, hopefully, won't accidentally come from somewhere else"
|
|
14
|
+
exception_message = "A message tied to the exception"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.fixture(name="logger")
|
|
18
|
+
def logger_fixture() -> logging.Logger:
|
|
19
|
+
return logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclasses.dataclass
|
|
23
|
+
class ErrorCase:
|
|
24
|
+
type_to_raise: type[BaseException]
|
|
25
|
+
type_to_catch: Union[type[BaseException], tuple[type[BaseException], ...]]
|
|
26
|
+
should_match: bool
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
all_level_values = [
|
|
30
|
+
logging.CRITICAL,
|
|
31
|
+
logging.ERROR,
|
|
32
|
+
logging.WARNING,
|
|
33
|
+
logging.INFO,
|
|
34
|
+
logging.DEBUG,
|
|
35
|
+
]
|
|
36
|
+
all_levels = {logging.getLevelName(value): value for value in all_level_values}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_consumes_exception(
|
|
40
|
+
logger: logging.Logger,
|
|
41
|
+
caplog: pytest.LogCaptureFixture,
|
|
42
|
+
) -> None:
|
|
43
|
+
with log_exceptions(log=logger, consume=True):
|
|
44
|
+
raise Exception()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_propagates_exception(
|
|
48
|
+
logger: logging.Logger,
|
|
49
|
+
caplog: pytest.LogCaptureFixture,
|
|
50
|
+
) -> None:
|
|
51
|
+
with pytest.raises(Exception, match=re.escape(exception_message)):
|
|
52
|
+
with log_exceptions(log=logger, consume=False):
|
|
53
|
+
raise Exception(exception_message)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def test_propagates_exception_by_default(
|
|
57
|
+
logger: logging.Logger,
|
|
58
|
+
caplog: pytest.LogCaptureFixture,
|
|
59
|
+
) -> None:
|
|
60
|
+
with pytest.raises(Exception, match=re.escape(exception_message)):
|
|
61
|
+
with log_exceptions(log=logger):
|
|
62
|
+
raise Exception(exception_message)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_passed_message_is_used(
|
|
66
|
+
logger: logging.Logger,
|
|
67
|
+
caplog: pytest.LogCaptureFixture,
|
|
68
|
+
) -> None:
|
|
69
|
+
with log_exceptions(log=logger, consume=True, message=log_message):
|
|
70
|
+
raise Exception()
|
|
71
|
+
|
|
72
|
+
assert len(caplog.records) == 1, caplog.records
|
|
73
|
+
|
|
74
|
+
[record] = caplog.records
|
|
75
|
+
assert record.msg.startswith(f"{log_message}: ")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@pytest.mark.parametrize(
|
|
79
|
+
argnames="level",
|
|
80
|
+
argvalues=all_levels.values(),
|
|
81
|
+
ids=all_levels.keys(),
|
|
82
|
+
)
|
|
83
|
+
def test_specified_level_is_used(
|
|
84
|
+
logger: logging.Logger,
|
|
85
|
+
caplog: pytest.LogCaptureFixture,
|
|
86
|
+
level: int,
|
|
87
|
+
) -> None:
|
|
88
|
+
caplog.set_level(min(all_levels.values()))
|
|
89
|
+
with log_exceptions(level=level, log=logger, consume=True):
|
|
90
|
+
raise Exception()
|
|
91
|
+
|
|
92
|
+
assert len(caplog.records) == 1, caplog.records
|
|
93
|
+
|
|
94
|
+
[record] = caplog.records
|
|
95
|
+
assert record.levelno == level
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_traceback_is_logged(
|
|
99
|
+
logger: logging.Logger,
|
|
100
|
+
caplog: pytest.LogCaptureFixture,
|
|
101
|
+
) -> None:
|
|
102
|
+
with log_exceptions(log=logger, consume=True, show_traceback=True):
|
|
103
|
+
raise Exception()
|
|
104
|
+
|
|
105
|
+
assert len(caplog.records) == 1, caplog.records
|
|
106
|
+
|
|
107
|
+
[record] = caplog.records
|
|
108
|
+
assert "\nTraceback " in record.msg
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def test_traceback_is_not_logged(
|
|
112
|
+
logger: logging.Logger,
|
|
113
|
+
caplog: pytest.LogCaptureFixture,
|
|
114
|
+
) -> None:
|
|
115
|
+
with log_exceptions(log=logger, consume=True, show_traceback=False):
|
|
116
|
+
raise Exception()
|
|
117
|
+
|
|
118
|
+
assert len(caplog.records) == 1, caplog.records
|
|
119
|
+
|
|
120
|
+
[record] = caplog.records
|
|
121
|
+
assert "\nTraceback " not in record.msg
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@pytest.mark.parametrize(
|
|
125
|
+
argnames="case",
|
|
126
|
+
argvalues=[
|
|
127
|
+
# default exceptions to catch matching
|
|
128
|
+
ErrorCase(type_to_raise=Exception, type_to_catch=Exception, should_match=True),
|
|
129
|
+
ErrorCase(type_to_raise=OSError, type_to_catch=Exception, should_match=True),
|
|
130
|
+
# default exceptions to catch not matching
|
|
131
|
+
ErrorCase(type_to_raise=BaseException, type_to_catch=Exception, should_match=False),
|
|
132
|
+
# raised type the same as specified to catch
|
|
133
|
+
ErrorCase(type_to_raise=Exception, type_to_catch=Exception, should_match=True),
|
|
134
|
+
ErrorCase(type_to_raise=BaseException, type_to_catch=BaseException, should_match=True),
|
|
135
|
+
ErrorCase(type_to_raise=OSError, type_to_catch=OSError, should_match=True),
|
|
136
|
+
# raised type is subclass of to catch
|
|
137
|
+
ErrorCase(type_to_raise=AttributeError, type_to_catch=Exception, should_match=True),
|
|
138
|
+
ErrorCase(type_to_raise=KeyboardInterrupt, type_to_catch=BaseException, should_match=True),
|
|
139
|
+
ErrorCase(type_to_raise=FileExistsError, type_to_catch=OSError, should_match=True),
|
|
140
|
+
# multiple to catch matching
|
|
141
|
+
ErrorCase(type_to_raise=OSError, type_to_catch=(KeyboardInterrupt, Exception), should_match=True),
|
|
142
|
+
ErrorCase(type_to_raise=SystemExit, type_to_catch=(SystemExit, OSError), should_match=True),
|
|
143
|
+
# multiple to catch not matching
|
|
144
|
+
ErrorCase(type_to_raise=AttributeError, type_to_catch=(KeyError, TimeoutError), should_match=False),
|
|
145
|
+
ErrorCase(type_to_raise=KeyboardInterrupt, type_to_catch=(KeyError, TimeoutError), should_match=False),
|
|
146
|
+
],
|
|
147
|
+
)
|
|
148
|
+
@pytest.mark.parametrize(argnames="consume", argvalues=[False, True], ids=["propagates", "consumes"])
|
|
149
|
+
@pytest.mark.parametrize(argnames="show_traceback", argvalues=[False, True], ids=["no traceback", "with traceback"])
|
|
150
|
+
def test_well_everything(
|
|
151
|
+
logger: logging.Logger,
|
|
152
|
+
caplog: pytest.LogCaptureFixture,
|
|
153
|
+
consume: bool,
|
|
154
|
+
case: ErrorCase,
|
|
155
|
+
show_traceback: bool,
|
|
156
|
+
) -> None:
|
|
157
|
+
with contextlib.ExitStack() as exit_stack:
|
|
158
|
+
if not consume or not case.should_match:
|
|
159
|
+
# verify that the exception propagates either when it should not match or should not be consumed
|
|
160
|
+
exit_stack.enter_context(pytest.raises(case.type_to_raise, match=re.escape(exception_message)))
|
|
161
|
+
|
|
162
|
+
with log_exceptions(
|
|
163
|
+
message=log_message,
|
|
164
|
+
log=logger,
|
|
165
|
+
consume=consume,
|
|
166
|
+
show_traceback=show_traceback,
|
|
167
|
+
exceptions_to_process=case.type_to_catch,
|
|
168
|
+
):
|
|
169
|
+
to_raise = case.type_to_raise(exception_message)
|
|
170
|
+
raise to_raise
|
|
171
|
+
|
|
172
|
+
if not case.should_match:
|
|
173
|
+
assert len(caplog.records) == 0, caplog.records
|
|
174
|
+
else:
|
|
175
|
+
# verify there is only a single log record
|
|
176
|
+
assert len(caplog.records) == 1, caplog.records
|
|
177
|
+
|
|
178
|
+
[record] = caplog.records
|
|
179
|
+
expected = f"{log_message}: {case.type_to_raise.__name__}: {exception_message}"
|
|
180
|
+
|
|
181
|
+
if show_traceback:
|
|
182
|
+
expected += "\nTraceback "
|
|
183
|
+
# verify the beginning of the log message, the traceback is not fully verified
|
|
184
|
+
assert record.msg.startswith(expected)
|
|
185
|
+
else:
|
|
186
|
+
# verify the complete log message
|
|
187
|
+
assert record.msg == expected
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import unittest
|
|
4
|
+
|
|
5
|
+
from chia.util.lru_cache import LRUCache
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TestLRUCache(unittest.TestCase):
|
|
9
|
+
def test_lru_cache(self):
|
|
10
|
+
cache = LRUCache(5)
|
|
11
|
+
|
|
12
|
+
assert cache.get(b"0") is None
|
|
13
|
+
|
|
14
|
+
assert len(cache.cache) == 0
|
|
15
|
+
cache.put(b"0", 1)
|
|
16
|
+
assert len(cache.cache) == 1
|
|
17
|
+
assert cache.get(b"0") == 1
|
|
18
|
+
cache.put(b"0", 2)
|
|
19
|
+
cache.put(b"0", 3)
|
|
20
|
+
cache.put(b"0", 4)
|
|
21
|
+
cache.put(b"0", 6)
|
|
22
|
+
assert cache.get(b"0") == 6
|
|
23
|
+
assert len(cache.cache) == 1
|
|
24
|
+
|
|
25
|
+
cache.put(b"1", 1)
|
|
26
|
+
assert len(cache.cache) == 2
|
|
27
|
+
assert cache.get(b"0") == 6
|
|
28
|
+
assert cache.get(b"1") == 1
|
|
29
|
+
cache.put(b"2", 2)
|
|
30
|
+
assert len(cache.cache) == 3
|
|
31
|
+
assert cache.get(b"0") == 6
|
|
32
|
+
assert cache.get(b"1") == 1
|
|
33
|
+
assert cache.get(b"2") == 2
|
|
34
|
+
cache.put(b"3", 3)
|
|
35
|
+
assert len(cache.cache) == 4
|
|
36
|
+
assert cache.get(b"0") == 6
|
|
37
|
+
assert cache.get(b"1") == 1
|
|
38
|
+
assert cache.get(b"2") == 2
|
|
39
|
+
assert cache.get(b"3") == 3
|
|
40
|
+
cache.put(b"4", 4)
|
|
41
|
+
assert len(cache.cache) == 5
|
|
42
|
+
assert cache.get(b"0") == 6
|
|
43
|
+
assert cache.get(b"1") == 1
|
|
44
|
+
assert cache.get(b"2") == 2
|
|
45
|
+
assert cache.get(b"4") == 4
|
|
46
|
+
cache.put(b"5", 5)
|
|
47
|
+
assert cache.get(b"5") == 5
|
|
48
|
+
assert len(cache.cache) == 5
|
|
49
|
+
print(cache.cache)
|
|
50
|
+
assert cache.get(b"3") is None # 3 is least recently used
|
|
51
|
+
assert cache.get(b"1") == 1
|
|
52
|
+
assert cache.get(b"2") == 2
|
|
53
|
+
cache.put(b"7", 7)
|
|
54
|
+
assert len(cache.cache) == 5
|
|
55
|
+
assert cache.get(b"0") is None
|
|
56
|
+
assert cache.get(b"1") == 1
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import unittest
|
|
4
|
+
|
|
5
|
+
from chia.util.significant_bits import count_significant_bits, truncate_to_significant_bits
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TestSignificantBits(unittest.TestCase):
|
|
9
|
+
def test_truncate_to_significant_bits(self):
|
|
10
|
+
a = -0b001101
|
|
11
|
+
assert truncate_to_significant_bits(a, 2) == -0b1100
|
|
12
|
+
a = -0b001111
|
|
13
|
+
assert truncate_to_significant_bits(a, 2) == -0b1100
|
|
14
|
+
a = 0b1111
|
|
15
|
+
assert truncate_to_significant_bits(a, 2) == 0b1100
|
|
16
|
+
a = 0b1000000111
|
|
17
|
+
assert truncate_to_significant_bits(a, 8) == 0b1000000100
|
|
18
|
+
a = 0b1000000111
|
|
19
|
+
assert truncate_to_significant_bits(a, 0) == 0b0
|
|
20
|
+
a = 0b1000000111
|
|
21
|
+
assert truncate_to_significant_bits(a, 500) == a
|
|
22
|
+
a = -0b1000000111
|
|
23
|
+
assert truncate_to_significant_bits(a, 500) == a
|
|
24
|
+
a = 0b10101
|
|
25
|
+
assert truncate_to_significant_bits(a, 5) == a
|
|
26
|
+
a = 0b10101
|
|
27
|
+
assert truncate_to_significant_bits(a, 4) == 0b10100
|
|
28
|
+
|
|
29
|
+
def test_count_significant_bits(self):
|
|
30
|
+
assert count_significant_bits(0b0001) == 1
|
|
31
|
+
assert count_significant_bits(0b00010) == 1
|
|
32
|
+
assert count_significant_bits(0b01010) == 3
|
|
33
|
+
assert count_significant_bits(-0b01010) == 3
|
|
34
|
+
assert count_significant_bits(0b0) == 0
|
|
35
|
+
assert count_significant_bits(0b1) == 1
|
|
36
|
+
assert count_significant_bits(0b1000010101010000) == 12
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
if __name__ == "__main__":
|
|
40
|
+
unittest.main()
|