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,780 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import sys
|
|
5
|
+
import time
|
|
6
|
+
import types
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any, Optional
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
from chia_rs import G1Element, PrivateKey
|
|
12
|
+
|
|
13
|
+
from chia._tests.util.misc import CoinGenerator, patch_request_handler
|
|
14
|
+
from chia._tests.util.setup_nodes import OldSimulatorsAndWallets
|
|
15
|
+
from chia._tests.util.time_out_assert import time_out_assert
|
|
16
|
+
from chia.protocols import wallet_protocol
|
|
17
|
+
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
18
|
+
from chia.protocols.wallet_protocol import CoinState
|
|
19
|
+
from chia.server.api_protocol import Self
|
|
20
|
+
from chia.server.outbound_message import Message, make_msg
|
|
21
|
+
from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
|
|
22
|
+
from chia.simulator.block_tools import test_constants
|
|
23
|
+
from chia.types.blockchain_format.coin import Coin
|
|
24
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
25
|
+
from chia.types.full_block import FullBlock
|
|
26
|
+
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
27
|
+
from chia.types.peer_info import PeerInfo
|
|
28
|
+
from chia.util.config import load_config
|
|
29
|
+
from chia.util.errors import Err
|
|
30
|
+
from chia.util.ints import uint8, uint32, uint64, uint128
|
|
31
|
+
from chia.util.keychain import Keychain, KeyData, generate_mnemonic
|
|
32
|
+
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
33
|
+
from chia.wallet.util.wallet_sync_utils import PeerRequestException
|
|
34
|
+
from chia.wallet.wallet_node import Balance, WalletNode
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@pytest.mark.anyio
|
|
38
|
+
async def test_get_private_key(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
|
|
39
|
+
root_path = root_path_populated_with_config
|
|
40
|
+
keychain = get_temp_keyring
|
|
41
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
42
|
+
node = WalletNode(config, root_path, test_constants, keychain)
|
|
43
|
+
sk = keychain.add_key(generate_mnemonic())
|
|
44
|
+
fingerprint = sk.get_g1().get_fingerprint()
|
|
45
|
+
|
|
46
|
+
key = await node.get_key(fingerprint)
|
|
47
|
+
|
|
48
|
+
assert key is not None
|
|
49
|
+
assert isinstance(key, PrivateKey)
|
|
50
|
+
assert key.get_g1().get_fingerprint() == fingerprint
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@pytest.mark.anyio
|
|
54
|
+
async def test_get_private_key_default_key(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
|
|
55
|
+
root_path = root_path_populated_with_config
|
|
56
|
+
keychain = get_temp_keyring
|
|
57
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
58
|
+
node = WalletNode(config, root_path, test_constants, keychain)
|
|
59
|
+
sk = keychain.add_key(generate_mnemonic())
|
|
60
|
+
fingerprint = sk.get_g1().get_fingerprint()
|
|
61
|
+
|
|
62
|
+
# Add a couple more keys
|
|
63
|
+
keychain.add_key(generate_mnemonic())
|
|
64
|
+
keychain.add_key(generate_mnemonic())
|
|
65
|
+
|
|
66
|
+
# When no fingerprint is provided, we should get the default (first) key
|
|
67
|
+
key = await node.get_key(None)
|
|
68
|
+
|
|
69
|
+
assert key is not None
|
|
70
|
+
assert isinstance(key, PrivateKey)
|
|
71
|
+
assert key.get_g1().get_fingerprint() == fingerprint
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@pytest.mark.anyio
|
|
75
|
+
@pytest.mark.parametrize("fingerprint", [None, 1234567890])
|
|
76
|
+
async def test_get_private_key_missing_key(
|
|
77
|
+
root_path_populated_with_config: Path, get_temp_keyring: Keychain, fingerprint: Optional[int]
|
|
78
|
+
) -> None:
|
|
79
|
+
root_path = root_path_populated_with_config
|
|
80
|
+
keychain = get_temp_keyring # empty keyring
|
|
81
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
82
|
+
node = WalletNode(config, root_path, test_constants, keychain)
|
|
83
|
+
|
|
84
|
+
# Keyring is empty, so requesting a key by fingerprint or None should return None
|
|
85
|
+
key = await node.get_key(fingerprint)
|
|
86
|
+
|
|
87
|
+
assert key is None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@pytest.mark.anyio
|
|
91
|
+
async def test_get_private_key_missing_key_use_default(
|
|
92
|
+
root_path_populated_with_config: Path, get_temp_keyring: Keychain
|
|
93
|
+
) -> None:
|
|
94
|
+
root_path = root_path_populated_with_config
|
|
95
|
+
keychain = get_temp_keyring
|
|
96
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
97
|
+
node = WalletNode(config, root_path, test_constants, keychain)
|
|
98
|
+
sk = keychain.add_key(generate_mnemonic())
|
|
99
|
+
fingerprint = sk.get_g1().get_fingerprint()
|
|
100
|
+
|
|
101
|
+
# Stupid sanity check that the fingerprint we're going to use isn't actually in the keychain
|
|
102
|
+
assert fingerprint != 1234567890
|
|
103
|
+
|
|
104
|
+
# When fingerprint is provided and the key is missing, we should get the default (first) key
|
|
105
|
+
key = await node.get_key(1234567890)
|
|
106
|
+
|
|
107
|
+
assert key is not None
|
|
108
|
+
assert isinstance(key, PrivateKey)
|
|
109
|
+
assert key.get_g1().get_fingerprint() == fingerprint
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@pytest.mark.anyio
|
|
113
|
+
async def test_get_public_key(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
|
|
114
|
+
root_path: Path = root_path_populated_with_config
|
|
115
|
+
keychain: Keychain = get_temp_keyring
|
|
116
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml", "wallet")
|
|
117
|
+
node: WalletNode = WalletNode(config, root_path, test_constants, keychain)
|
|
118
|
+
pk: G1Element = keychain.add_key(
|
|
119
|
+
"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
120
|
+
None,
|
|
121
|
+
private=False,
|
|
122
|
+
)
|
|
123
|
+
fingerprint: int = pk.get_fingerprint()
|
|
124
|
+
|
|
125
|
+
key = await node.get_key(fingerprint, private=False)
|
|
126
|
+
|
|
127
|
+
assert key is not None
|
|
128
|
+
assert isinstance(key, G1Element)
|
|
129
|
+
assert key.get_fingerprint() == fingerprint
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@pytest.mark.anyio
|
|
133
|
+
async def test_get_public_key_default_key(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
|
|
134
|
+
root_path: Path = root_path_populated_with_config
|
|
135
|
+
keychain: Keychain = get_temp_keyring
|
|
136
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml", "wallet")
|
|
137
|
+
node: WalletNode = WalletNode(config, root_path, test_constants, keychain)
|
|
138
|
+
pk: G1Element = keychain.add_key(
|
|
139
|
+
"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
140
|
+
None,
|
|
141
|
+
private=False,
|
|
142
|
+
)
|
|
143
|
+
fingerprint: int = pk.get_fingerprint()
|
|
144
|
+
|
|
145
|
+
# Add a couple more keys
|
|
146
|
+
keychain.add_key(
|
|
147
|
+
"83062a1b26d27820600eac4e31c1a890a6ba026b28bb96bb66454e9ce1033f4cba8824259dc17dc3b643ab1003e6b961",
|
|
148
|
+
None,
|
|
149
|
+
private=False,
|
|
150
|
+
)
|
|
151
|
+
keychain.add_key(
|
|
152
|
+
"a272d5aaa6046e64bd7fd69bae288b9f9e5622c13058ec7d1b85e3d4d1acfa5d63d6542336c7b24d2fceab991919e989",
|
|
153
|
+
None,
|
|
154
|
+
private=False,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# When no fingerprint is provided, we should get the default (first) key
|
|
158
|
+
key = await node.get_key(None, private=False)
|
|
159
|
+
|
|
160
|
+
assert key is not None
|
|
161
|
+
assert isinstance(key, G1Element)
|
|
162
|
+
assert key.get_fingerprint() == fingerprint
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@pytest.mark.anyio
|
|
166
|
+
@pytest.mark.parametrize("fingerprint", [None, 1234567890])
|
|
167
|
+
async def test_get_public_key_missing_key(
|
|
168
|
+
root_path_populated_with_config: Path, get_temp_keyring: Keychain, fingerprint: Optional[int]
|
|
169
|
+
) -> None:
|
|
170
|
+
root_path: Path = root_path_populated_with_config
|
|
171
|
+
keychain: Keychain = get_temp_keyring # empty keyring
|
|
172
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml", "wallet")
|
|
173
|
+
node: WalletNode = WalletNode(config, root_path, test_constants, keychain)
|
|
174
|
+
|
|
175
|
+
# Keyring is empty, so requesting a key by fingerprint or None should return None
|
|
176
|
+
key = await node.get_key(fingerprint, private=False)
|
|
177
|
+
|
|
178
|
+
assert key is None
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@pytest.mark.anyio
|
|
182
|
+
async def test_get_public_key_missing_key_use_default(
|
|
183
|
+
root_path_populated_with_config: Path, get_temp_keyring: Keychain
|
|
184
|
+
) -> None:
|
|
185
|
+
root_path: Path = root_path_populated_with_config
|
|
186
|
+
keychain: Keychain = get_temp_keyring
|
|
187
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml", "wallet")
|
|
188
|
+
node: WalletNode = WalletNode(config, root_path, test_constants, keychain)
|
|
189
|
+
pk: G1Element = keychain.add_key(
|
|
190
|
+
"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
191
|
+
None,
|
|
192
|
+
private=False,
|
|
193
|
+
)
|
|
194
|
+
fingerprint: int = pk.get_fingerprint()
|
|
195
|
+
|
|
196
|
+
# Stupid sanity check that the fingerprint we're going to use isn't actually in the keychain
|
|
197
|
+
assert fingerprint != 1234567890
|
|
198
|
+
|
|
199
|
+
# When fingerprint is provided and the key is missing, we should get the default (first) key
|
|
200
|
+
key = await node.get_key(1234567890, private=False)
|
|
201
|
+
|
|
202
|
+
assert key is not None
|
|
203
|
+
assert isinstance(key, G1Element)
|
|
204
|
+
assert key.get_fingerprint() == fingerprint
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def test_log_in(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
|
|
208
|
+
root_path = root_path_populated_with_config
|
|
209
|
+
keychain = get_temp_keyring
|
|
210
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
211
|
+
node = WalletNode(config, root_path, test_constants)
|
|
212
|
+
sk = keychain.add_key(generate_mnemonic())
|
|
213
|
+
fingerprint = sk.get_g1().get_fingerprint()
|
|
214
|
+
|
|
215
|
+
node.log_in(fingerprint)
|
|
216
|
+
|
|
217
|
+
assert node.logged_in is True
|
|
218
|
+
assert node.logged_in_fingerprint == fingerprint
|
|
219
|
+
assert node.get_last_used_fingerprint() == fingerprint
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def test_log_in_failure_to_write_last_used_fingerprint(
|
|
223
|
+
root_path_populated_with_config: Path, get_temp_keyring: Keychain, monkeypatch: pytest.MonkeyPatch
|
|
224
|
+
) -> None:
|
|
225
|
+
called_update_last_used_fingerprint: bool = False
|
|
226
|
+
|
|
227
|
+
def patched_update_last_used_fingerprint(self: Self) -> None:
|
|
228
|
+
nonlocal called_update_last_used_fingerprint
|
|
229
|
+
called_update_last_used_fingerprint = True
|
|
230
|
+
raise Exception("Generic write failure")
|
|
231
|
+
|
|
232
|
+
with monkeypatch.context() as m:
|
|
233
|
+
m.setattr(WalletNode, "update_last_used_fingerprint", patched_update_last_used_fingerprint)
|
|
234
|
+
root_path = root_path_populated_with_config
|
|
235
|
+
keychain = get_temp_keyring
|
|
236
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
237
|
+
node = WalletNode(config, root_path, test_constants)
|
|
238
|
+
sk = keychain.add_key(generate_mnemonic())
|
|
239
|
+
fingerprint = sk.get_g1().get_fingerprint()
|
|
240
|
+
|
|
241
|
+
# Expect log_in to succeed, even though we can't write the last used fingerprint
|
|
242
|
+
node.log_in(fingerprint)
|
|
243
|
+
|
|
244
|
+
assert node.logged_in is True
|
|
245
|
+
assert node.logged_in_fingerprint == fingerprint
|
|
246
|
+
assert node.get_last_used_fingerprint() is None
|
|
247
|
+
assert called_update_last_used_fingerprint is True
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def test_log_out(root_path_populated_with_config: Path, get_temp_keyring: Keychain) -> None:
|
|
251
|
+
root_path = root_path_populated_with_config
|
|
252
|
+
keychain = get_temp_keyring
|
|
253
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
254
|
+
node = WalletNode(config, root_path, test_constants)
|
|
255
|
+
sk = keychain.add_key(generate_mnemonic())
|
|
256
|
+
fingerprint = sk.get_g1().get_fingerprint()
|
|
257
|
+
|
|
258
|
+
node.log_in(fingerprint)
|
|
259
|
+
|
|
260
|
+
assert node.logged_in is True
|
|
261
|
+
assert node.logged_in_fingerprint == fingerprint
|
|
262
|
+
assert node.get_last_used_fingerprint() == fingerprint
|
|
263
|
+
|
|
264
|
+
node.log_out()
|
|
265
|
+
|
|
266
|
+
assert node.logged_in is False
|
|
267
|
+
assert node.logged_in_fingerprint is None
|
|
268
|
+
assert node.get_last_used_fingerprint() == fingerprint
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def test_get_last_used_fingerprint_path(root_path_populated_with_config: Path) -> None:
|
|
272
|
+
root_path = root_path_populated_with_config
|
|
273
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
274
|
+
node = WalletNode(config, root_path, test_constants)
|
|
275
|
+
path = node.get_last_used_fingerprint_path()
|
|
276
|
+
|
|
277
|
+
assert path == root_path / "wallet" / "db" / "last_used_fingerprint"
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def test_get_last_used_fingerprint(root_path_populated_with_config: Path) -> None:
|
|
281
|
+
path = root_path_populated_with_config / "wallet" / "db" / "last_used_fingerprint"
|
|
282
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
283
|
+
path.write_text("1234567890")
|
|
284
|
+
|
|
285
|
+
root_path = root_path_populated_with_config
|
|
286
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
287
|
+
node = WalletNode(config, root_path, test_constants)
|
|
288
|
+
last_used_fingerprint = node.get_last_used_fingerprint()
|
|
289
|
+
|
|
290
|
+
assert last_used_fingerprint == 1234567890
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def test_get_last_used_fingerprint_file_doesnt_exist(root_path_populated_with_config: Path) -> None:
|
|
294
|
+
root_path = root_path_populated_with_config
|
|
295
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
296
|
+
node = WalletNode(config, root_path, test_constants)
|
|
297
|
+
last_used_fingerprint = node.get_last_used_fingerprint()
|
|
298
|
+
|
|
299
|
+
assert last_used_fingerprint is None
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def test_get_last_used_fingerprint_file_cant_read_unix(root_path_populated_with_config: Path) -> None:
|
|
303
|
+
if sys.platform in {"win32", "cygwin"}:
|
|
304
|
+
pytest.skip("Setting UNIX file permissions doesn't apply to Windows")
|
|
305
|
+
|
|
306
|
+
root_path = root_path_populated_with_config
|
|
307
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
308
|
+
node = WalletNode(config, root_path, test_constants)
|
|
309
|
+
path = node.get_last_used_fingerprint_path()
|
|
310
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
311
|
+
path.write_text("1234567890")
|
|
312
|
+
|
|
313
|
+
assert node.get_last_used_fingerprint() == 1234567890
|
|
314
|
+
|
|
315
|
+
# Make the file unreadable
|
|
316
|
+
path.chmod(0o000)
|
|
317
|
+
|
|
318
|
+
last_used_fingerprint = node.get_last_used_fingerprint()
|
|
319
|
+
|
|
320
|
+
assert last_used_fingerprint is None
|
|
321
|
+
|
|
322
|
+
# Verify that the file is unreadable
|
|
323
|
+
with pytest.raises(PermissionError):
|
|
324
|
+
path.read_text()
|
|
325
|
+
|
|
326
|
+
# Calling get_last_used_fingerprint() should not throw an exception
|
|
327
|
+
assert node.get_last_used_fingerprint() is None
|
|
328
|
+
|
|
329
|
+
path.chmod(0o600)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def test_get_last_used_fingerprint_file_cant_read_win32(
|
|
333
|
+
root_path_populated_with_config: Path, monkeypatch: pytest.MonkeyPatch
|
|
334
|
+
) -> None:
|
|
335
|
+
if sys.platform not in {"win32", "cygwin"}:
|
|
336
|
+
pytest.skip("Windows-specific test")
|
|
337
|
+
|
|
338
|
+
called_read_text = False
|
|
339
|
+
|
|
340
|
+
def patched_pathlib_path_read_text(self: Self) -> str:
|
|
341
|
+
nonlocal called_read_text
|
|
342
|
+
called_read_text = True
|
|
343
|
+
raise PermissionError("Permission denied")
|
|
344
|
+
|
|
345
|
+
root_path = root_path_populated_with_config
|
|
346
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
347
|
+
node = WalletNode(config, root_path, test_constants)
|
|
348
|
+
path = node.get_last_used_fingerprint_path()
|
|
349
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
350
|
+
path.write_text("1234567890")
|
|
351
|
+
|
|
352
|
+
assert node.get_last_used_fingerprint() == 1234567890
|
|
353
|
+
|
|
354
|
+
# Make the file unreadable. Doing this with pywin32 is more trouble than it's worth. All we care about is that
|
|
355
|
+
# get_last_used_fingerprint doesn't throw an exception.
|
|
356
|
+
with monkeypatch.context() as m:
|
|
357
|
+
from pathlib import WindowsPath
|
|
358
|
+
|
|
359
|
+
m.setattr(WindowsPath, "read_text", patched_pathlib_path_read_text)
|
|
360
|
+
|
|
361
|
+
# Calling get_last_used_fingerprint() should not throw an exception
|
|
362
|
+
last_used_fingerprint: Optional[int] = node.get_last_used_fingerprint()
|
|
363
|
+
|
|
364
|
+
# Verify that the file is unreadable
|
|
365
|
+
assert called_read_text is True
|
|
366
|
+
assert last_used_fingerprint is None
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def test_get_last_used_fingerprint_file_with_whitespace(root_path_populated_with_config: Path) -> None:
|
|
370
|
+
root_path = root_path_populated_with_config
|
|
371
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
372
|
+
node = WalletNode(config, root_path, test_constants)
|
|
373
|
+
path = node.get_last_used_fingerprint_path()
|
|
374
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
375
|
+
path.write_text("\n\r\n \t1234567890\r\n\n")
|
|
376
|
+
|
|
377
|
+
assert node.get_last_used_fingerprint() == 1234567890
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def test_update_last_used_fingerprint_missing_fingerprint(root_path_populated_with_config: Path) -> None:
|
|
381
|
+
root_path = root_path_populated_with_config
|
|
382
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
383
|
+
node = WalletNode(config, root_path, test_constants)
|
|
384
|
+
node.logged_in_fingerprint = None
|
|
385
|
+
|
|
386
|
+
with pytest.raises(AssertionError):
|
|
387
|
+
node.update_last_used_fingerprint()
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def test_update_last_used_fingerprint_create_intermediate_dirs(root_path_populated_with_config: Path) -> None:
|
|
391
|
+
root_path = root_path_populated_with_config
|
|
392
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
393
|
+
node = WalletNode(config, root_path, test_constants)
|
|
394
|
+
node.logged_in_fingerprint = 9876543210
|
|
395
|
+
path = node.get_last_used_fingerprint_path()
|
|
396
|
+
|
|
397
|
+
assert path.parent.exists() is False
|
|
398
|
+
|
|
399
|
+
node.update_last_used_fingerprint()
|
|
400
|
+
|
|
401
|
+
assert path.parent.exists() is True
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
def test_update_last_used_fingerprint(root_path_populated_with_config: Path) -> None:
|
|
405
|
+
root_path = root_path_populated_with_config
|
|
406
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
407
|
+
node = WalletNode(config, root_path, test_constants)
|
|
408
|
+
node.logged_in_fingerprint = 9876543210
|
|
409
|
+
path = node.get_last_used_fingerprint_path()
|
|
410
|
+
|
|
411
|
+
node.update_last_used_fingerprint()
|
|
412
|
+
|
|
413
|
+
assert path.exists() is True
|
|
414
|
+
assert path.read_text() == "9876543210"
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
@pytest.mark.parametrize("testing", [True, False])
|
|
418
|
+
@pytest.mark.parametrize("offset", [0, 550, 650])
|
|
419
|
+
def test_timestamp_in_sync(root_path_populated_with_config: Path, testing: bool, offset: int) -> None:
|
|
420
|
+
root_path = root_path_populated_with_config
|
|
421
|
+
config = load_config(root_path, "config.yaml", "wallet")
|
|
422
|
+
wallet_node = WalletNode(config, root_path, test_constants)
|
|
423
|
+
now = time.time()
|
|
424
|
+
wallet_node.config["testing"] = testing
|
|
425
|
+
|
|
426
|
+
expected = testing or offset < 600
|
|
427
|
+
assert wallet_node.is_timestamp_in_sync(uint64(now - offset)) == expected
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
@pytest.mark.anyio
|
|
431
|
+
@pytest.mark.standard_block_tools
|
|
432
|
+
async def test_get_timestamp_for_height_from_peer(
|
|
433
|
+
simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, caplog: pytest.LogCaptureFixture
|
|
434
|
+
) -> None:
|
|
435
|
+
[full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
|
|
436
|
+
|
|
437
|
+
async def get_timestamp(height: int) -> Optional[uint64]:
|
|
438
|
+
return await wallet_node.get_timestamp_for_height_from_peer(uint32(height), full_node_peer)
|
|
439
|
+
|
|
440
|
+
await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
|
|
441
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
442
|
+
await full_node_api.farm_blocks_to_wallet(2, wallet)
|
|
443
|
+
full_node_peer = next(iter(wallet_server.all_connections.values()))
|
|
444
|
+
# There should be no timestamp available for height 10
|
|
445
|
+
assert await get_timestamp(10) is None
|
|
446
|
+
# The timestamp at peak height should match the one from the full node block_store.
|
|
447
|
+
peak = await wallet_node.wallet_state_manager.blockchain.get_peak_block()
|
|
448
|
+
assert peak is not None
|
|
449
|
+
timestamp_at_peak = await get_timestamp(peak.height)
|
|
450
|
+
block_at_peak = (await full_node_api.full_node.block_store.get_full_blocks_at([peak.height]))[0]
|
|
451
|
+
assert block_at_peak.foliage_transaction_block is not None
|
|
452
|
+
assert timestamp_at_peak == block_at_peak.foliage_transaction_block.timestamp
|
|
453
|
+
# Clear the cache and add the peak back with a modified timestamp
|
|
454
|
+
cache = wallet_node.get_cache_for_peer(full_node_peer)
|
|
455
|
+
cache.clear_after_height(0)
|
|
456
|
+
modified_foliage_transaction_block = block_at_peak.foliage_transaction_block.replace(
|
|
457
|
+
timestamp=uint64(timestamp_at_peak + 1)
|
|
458
|
+
)
|
|
459
|
+
modified_peak = peak.replace(foliage_transaction_block=modified_foliage_transaction_block)
|
|
460
|
+
cache.add_to_blocks(modified_peak)
|
|
461
|
+
# Now the call should make use of the cached, modified block
|
|
462
|
+
assert await get_timestamp(peak.height) == timestamp_at_peak + 1
|
|
463
|
+
# After the clearing the cache it should fetch the actual timestamp again
|
|
464
|
+
cache.clear_after_height(0)
|
|
465
|
+
assert await get_timestamp(peak.height) == timestamp_at_peak
|
|
466
|
+
# Test block cache usage
|
|
467
|
+
cache.clear_after_height(0)
|
|
468
|
+
with caplog.at_level(logging.DEBUG):
|
|
469
|
+
await get_timestamp(1)
|
|
470
|
+
for i in [0, 1]:
|
|
471
|
+
block = cache.get_block(uint32(i))
|
|
472
|
+
assert block is not None
|
|
473
|
+
if i == 0:
|
|
474
|
+
assert block.is_transaction_block
|
|
475
|
+
else:
|
|
476
|
+
assert not block.is_transaction_block
|
|
477
|
+
assert f"get_timestamp_for_height_from_peer cache miss for height {i}" in caplog.text
|
|
478
|
+
assert f"get_timestamp_for_height_from_peer add to cache for height {i}" in caplog.text
|
|
479
|
+
caplog.clear()
|
|
480
|
+
with caplog.at_level(logging.DEBUG):
|
|
481
|
+
await get_timestamp(1)
|
|
482
|
+
assert f"get_timestamp_for_height_from_peer use cached block for height {0}" not in caplog.text
|
|
483
|
+
assert f"get_timestamp_for_height_from_peer use cached block for height {1}" in caplog.text
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
@pytest.mark.anyio
|
|
487
|
+
async def test_unique_puzzle_hash_subscriptions(simulator_and_wallet: OldSimulatorsAndWallets) -> None:
|
|
488
|
+
_, [(node, _)], _ = simulator_and_wallet
|
|
489
|
+
puzzle_hashes = await node.get_puzzle_hashes_to_subscribe()
|
|
490
|
+
assert len(puzzle_hashes) > 1
|
|
491
|
+
assert len(set(puzzle_hashes)) == len(puzzle_hashes)
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
@pytest.mark.anyio
|
|
495
|
+
@pytest.mark.standard_block_tools
|
|
496
|
+
async def test_get_balance(
|
|
497
|
+
simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, default_400_blocks: list[FullBlock]
|
|
498
|
+
) -> None:
|
|
499
|
+
[full_node_api], [(wallet_node, wallet_server)], _bt = simulator_and_wallet
|
|
500
|
+
full_node_server = full_node_api.full_node.server
|
|
501
|
+
|
|
502
|
+
def wallet_synced() -> bool:
|
|
503
|
+
return full_node_server.node_id in wallet_node.synced_peers
|
|
504
|
+
|
|
505
|
+
async def restart_with_fingerprint(fingerprint: Optional[int]) -> None:
|
|
506
|
+
wallet_node._close()
|
|
507
|
+
await wallet_node._await_closed(shutting_down=False)
|
|
508
|
+
await wallet_node._start_with_fingerprint(fingerprint=fingerprint)
|
|
509
|
+
|
|
510
|
+
wallet_id = uint32(1)
|
|
511
|
+
initial_fingerprint = wallet_node.logged_in_fingerprint
|
|
512
|
+
|
|
513
|
+
# TODO, there is a bug in wallet_short_sync_backtrack which leads to a rollback to 0 (-1 which is another a bug) and
|
|
514
|
+
# with that to a KeyError when applying the race cache if there are less than WEIGHT_PROOF_RECENT_BLOCKS
|
|
515
|
+
# blocks but we still have a peak stored in the DB. So we need to add enough blocks for a weight proof here to
|
|
516
|
+
# be able to restart the wallet in this test.
|
|
517
|
+
await add_blocks_in_batches(default_400_blocks, full_node_api.full_node)
|
|
518
|
+
# Initially there should be no sync and no balance
|
|
519
|
+
assert not wallet_synced()
|
|
520
|
+
assert await wallet_node.get_balance(wallet_id) == Balance()
|
|
521
|
+
# Generate some funds, get the balance and make sure it's as expected
|
|
522
|
+
await wallet_server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
523
|
+
await time_out_assert(30, wallet_synced)
|
|
524
|
+
generated_funds = await full_node_api.farm_blocks_to_wallet(5, wallet_node.wallet_state_manager.main_wallet)
|
|
525
|
+
expected_generated_balance = Balance(
|
|
526
|
+
confirmed_wallet_balance=uint128(generated_funds),
|
|
527
|
+
unconfirmed_wallet_balance=uint128(generated_funds),
|
|
528
|
+
spendable_balance=uint128(generated_funds),
|
|
529
|
+
max_send_amount=uint128(generated_funds),
|
|
530
|
+
unspent_coin_count=uint32(10),
|
|
531
|
+
)
|
|
532
|
+
generated_balance = await wallet_node.get_balance(wallet_id)
|
|
533
|
+
assert generated_balance == expected_generated_balance
|
|
534
|
+
# Load another key without funds, make sure the balance is empty.
|
|
535
|
+
other_key = KeyData.generate()
|
|
536
|
+
assert wallet_node.local_keychain is not None
|
|
537
|
+
wallet_node.local_keychain.add_key(other_key.mnemonic_str())
|
|
538
|
+
await restart_with_fingerprint(other_key.fingerprint)
|
|
539
|
+
assert await wallet_node.get_balance(wallet_id) == Balance()
|
|
540
|
+
# Load the initial fingerprint again and make sure the balance is still what we generated earlier
|
|
541
|
+
await restart_with_fingerprint(initial_fingerprint)
|
|
542
|
+
assert await wallet_node.get_balance(wallet_id) == generated_balance
|
|
543
|
+
# Connect and sync to the full node, generate more funds and test the balance caching
|
|
544
|
+
# TODO, there is a bug in untrusted sync if we try to sync to the same peak as stored in the DB after restart
|
|
545
|
+
# which leads to a rollback to 0 (-1 which is another a bug) and then to a validation error because the
|
|
546
|
+
# downloaded weight proof will not be added to the blockchain properly because we still have a peak with the
|
|
547
|
+
# same weight stored in the DB but without chain data. The 1 block generation below can be dropped if we just
|
|
548
|
+
# also store the chain data or maybe adjust the weight proof consideration logic in new_valid_weight_proof.
|
|
549
|
+
await full_node_api.farm_blocks_to_puzzlehash(1)
|
|
550
|
+
assert not wallet_synced()
|
|
551
|
+
await wallet_server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
552
|
+
await time_out_assert(30, wallet_synced)
|
|
553
|
+
generated_funds += await full_node_api.farm_blocks_to_wallet(5, wallet_node.wallet_state_manager.main_wallet)
|
|
554
|
+
expected_more_balance = Balance(
|
|
555
|
+
confirmed_wallet_balance=uint128(generated_funds),
|
|
556
|
+
unconfirmed_wallet_balance=uint128(generated_funds),
|
|
557
|
+
spendable_balance=uint128(generated_funds),
|
|
558
|
+
max_send_amount=uint128(generated_funds),
|
|
559
|
+
unspent_coin_count=uint32(20),
|
|
560
|
+
)
|
|
561
|
+
async with wallet_node.wallet_state_manager.set_sync_mode(uint32(100)):
|
|
562
|
+
# During sync the balance cache should not become updated, so it still should have the old balance here
|
|
563
|
+
assert await wallet_node.get_balance(wallet_id) == expected_generated_balance
|
|
564
|
+
# Now after the sync context the cache should become updated to the newly genertated balance
|
|
565
|
+
assert await wallet_node.get_balance(wallet_id) == expected_more_balance
|
|
566
|
+
# Restart one more time and make sure the balance is still correct after start
|
|
567
|
+
await restart_with_fingerprint(initial_fingerprint)
|
|
568
|
+
assert await wallet_node.get_balance(wallet_id) == expected_more_balance
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
@pytest.mark.anyio
|
|
572
|
+
async def test_add_states_from_peer_reorg_failure(
|
|
573
|
+
simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, caplog: pytest.LogCaptureFixture
|
|
574
|
+
) -> None:
|
|
575
|
+
[full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
|
|
576
|
+
await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
|
|
577
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
578
|
+
await full_node_api.farm_rewards_to_wallet(1, wallet)
|
|
579
|
+
coin_generator = CoinGenerator()
|
|
580
|
+
coin_states = [CoinState(coin_generator.get().coin, None, None)]
|
|
581
|
+
with caplog.at_level(logging.DEBUG):
|
|
582
|
+
full_node_peer = next(iter(wallet_server.all_connections.values()))
|
|
583
|
+
# Close the connection to trigger a state processing failure during reorged coin processing.
|
|
584
|
+
await full_node_peer.close()
|
|
585
|
+
assert not await wallet_node.add_states_from_peer(coin_states, full_node_peer)
|
|
586
|
+
assert "Processing reorged states failed" in caplog.text
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
@pytest.mark.anyio
|
|
590
|
+
async def test_add_states_from_peer_untrusted_shutdown(
|
|
591
|
+
simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, caplog: pytest.LogCaptureFixture
|
|
592
|
+
) -> None:
|
|
593
|
+
[full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
|
|
594
|
+
await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
|
|
595
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
596
|
+
await full_node_api.farm_rewards_to_wallet(1, wallet)
|
|
597
|
+
# Close to trigger the shutdown
|
|
598
|
+
wallet_node._close()
|
|
599
|
+
coin_generator = CoinGenerator()
|
|
600
|
+
# Generate enough coin states to fill up the max number validation/add tasks.
|
|
601
|
+
coin_states = [CoinState(coin_generator.get().coin, uint32(i), uint32(i)) for i in range(3000)]
|
|
602
|
+
with caplog.at_level(logging.INFO):
|
|
603
|
+
assert not await wallet_node.add_states_from_peer(
|
|
604
|
+
coin_states, next(iter(wallet_server.all_connections.values()))
|
|
605
|
+
)
|
|
606
|
+
assert "Terminating receipt and validation due to shut down request" in caplog.text
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
@pytest.mark.limit_consensus_modes(reason="consensus rules irrelevant")
|
|
610
|
+
@pytest.mark.anyio
|
|
611
|
+
async def test_transaction_send_cache(
|
|
612
|
+
self_hostname: str, simulator_and_wallet: OldSimulatorsAndWallets, monkeypatch: pytest.MonkeyPatch
|
|
613
|
+
) -> None:
|
|
614
|
+
"""
|
|
615
|
+
The purpose of this test is to test that calling _resend_queue on the wallet node does not result in resending a
|
|
616
|
+
spend to a peer that has already recieved that spend and is currently processing it. It also tests that once we
|
|
617
|
+
have heard that the peer is done processing the spend, we _do_ properly resend it.
|
|
618
|
+
"""
|
|
619
|
+
[full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
|
|
620
|
+
|
|
621
|
+
await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
|
|
622
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
623
|
+
await full_node_api.farm_rewards_to_wallet(1, wallet)
|
|
624
|
+
|
|
625
|
+
# Replacing the normal logic a full node has for processing transactions with a function that just logs what it gets
|
|
626
|
+
logged_spends = []
|
|
627
|
+
|
|
628
|
+
async def send_transaction(
|
|
629
|
+
self: Self, request: wallet_protocol.SendTransaction, *, test: bool = False
|
|
630
|
+
) -> Optional[Message]:
|
|
631
|
+
logged_spends.append(request.transaction.name())
|
|
632
|
+
return None
|
|
633
|
+
|
|
634
|
+
assert full_node_api.full_node._server is not None
|
|
635
|
+
with patch_request_handler(api=full_node_api.full_node._server.get_connections()[0].api, handler=send_transaction):
|
|
636
|
+
# Generate the transaction
|
|
637
|
+
async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
638
|
+
await wallet.generate_signed_transaction(uint64(0), bytes32.zeros, action_scope)
|
|
639
|
+
[tx] = action_scope.side_effects.transactions
|
|
640
|
+
|
|
641
|
+
# Make sure it is sent to the peer
|
|
642
|
+
await wallet_node._resend_queue()
|
|
643
|
+
|
|
644
|
+
def logged_spends_len() -> int:
|
|
645
|
+
return len(logged_spends)
|
|
646
|
+
|
|
647
|
+
await time_out_assert(5, logged_spends_len, 1)
|
|
648
|
+
|
|
649
|
+
# Make sure queue processing again does not result in another spend
|
|
650
|
+
await wallet_node._resend_queue()
|
|
651
|
+
with pytest.raises(AssertionError):
|
|
652
|
+
await time_out_assert(5, logged_spends_len, 2)
|
|
653
|
+
|
|
654
|
+
# Tell the wallet that we recieved the spend (but failed to process it so it should send again)
|
|
655
|
+
msg = make_msg(
|
|
656
|
+
ProtocolMessageTypes.transaction_ack,
|
|
657
|
+
wallet_protocol.TransactionAck(
|
|
658
|
+
tx.name, uint8(MempoolInclusionStatus.FAILED), Err.GENERATOR_RUNTIME_ERROR.name
|
|
659
|
+
),
|
|
660
|
+
)
|
|
661
|
+
assert simulator_and_wallet[1][0][0]._server is not None
|
|
662
|
+
await simulator_and_wallet[1][0][0]._server.get_connections()[0].incoming_queue.put(msg)
|
|
663
|
+
|
|
664
|
+
# Make sure the cache is emptied
|
|
665
|
+
def check_wallet_cache_empty() -> bool:
|
|
666
|
+
return wallet_node._tx_messages_in_progress == {}
|
|
667
|
+
|
|
668
|
+
await time_out_assert(5, check_wallet_cache_empty, True)
|
|
669
|
+
|
|
670
|
+
# Re-process the queue again and this time it should result in a resend
|
|
671
|
+
await wallet_node._resend_queue()
|
|
672
|
+
await time_out_assert(5, logged_spends_len, 2)
|
|
673
|
+
assert logged_spends == [tx.name, tx.name]
|
|
674
|
+
|
|
675
|
+
await time_out_assert(5, check_wallet_cache_empty, False)
|
|
676
|
+
|
|
677
|
+
# Disconnect from the peer to make sure their entry in the cache is also deleted
|
|
678
|
+
await simulator_and_wallet[1][0][0]._server.get_connections()[0].close(120)
|
|
679
|
+
await time_out_assert(5, check_wallet_cache_empty, True)
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
@pytest.mark.limit_consensus_modes(reason="consensus rules irrelevant")
|
|
683
|
+
@pytest.mark.anyio
|
|
684
|
+
async def test_wallet_node_bad_coin_state_ignore(
|
|
685
|
+
self_hostname: str, simulator_and_wallet: OldSimulatorsAndWallets, monkeypatch: pytest.MonkeyPatch
|
|
686
|
+
) -> None:
|
|
687
|
+
[full_node_api], [(wallet_node, wallet_server)], _ = simulator_and_wallet
|
|
688
|
+
|
|
689
|
+
await wallet_server.start_client(PeerInfo(self_hostname, full_node_api.server.get_port()), None)
|
|
690
|
+
|
|
691
|
+
async def register_for_coin_updates(
|
|
692
|
+
self: Self, request: wallet_protocol.RegisterForCoinUpdates, *, test: bool = False
|
|
693
|
+
) -> Optional[Message]:
|
|
694
|
+
return make_msg(
|
|
695
|
+
ProtocolMessageTypes.respond_to_coin_updates,
|
|
696
|
+
wallet_protocol.RespondToCoinUpdates(
|
|
697
|
+
[], uint32(0), [CoinState(Coin(bytes32.zeros, bytes32.zeros, uint64(0)), uint32(0), uint32(0))]
|
|
698
|
+
),
|
|
699
|
+
)
|
|
700
|
+
|
|
701
|
+
async def validate_received_state_from_peer(*args: Any) -> bool:
|
|
702
|
+
# It's an interesting case here where we don't hit this unless something is broken
|
|
703
|
+
return True # pragma: no cover
|
|
704
|
+
|
|
705
|
+
assert full_node_api.full_node._server is not None
|
|
706
|
+
with patch_request_handler(
|
|
707
|
+
api=full_node_api.full_node._server.get_connections()[0].api, handler=register_for_coin_updates
|
|
708
|
+
):
|
|
709
|
+
monkeypatch.setattr(
|
|
710
|
+
wallet_node,
|
|
711
|
+
"validate_received_state_from_peer",
|
|
712
|
+
types.MethodType(validate_received_state_from_peer, wallet_node),
|
|
713
|
+
)
|
|
714
|
+
|
|
715
|
+
with pytest.raises(PeerRequestException):
|
|
716
|
+
await wallet_node.get_coin_state([], wallet_node.get_full_node_peer())
|
|
717
|
+
|
|
718
|
+
|
|
719
|
+
@pytest.mark.anyio
|
|
720
|
+
@pytest.mark.standard_block_tools
|
|
721
|
+
async def test_start_with_multiple_key_types(
|
|
722
|
+
simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, default_400_blocks: list[FullBlock]
|
|
723
|
+
) -> None:
|
|
724
|
+
[_full_node_api], [(wallet_node, _wallet_server)], _bt = simulator_and_wallet
|
|
725
|
+
|
|
726
|
+
async def restart_with_fingerprint(fingerprint: Optional[int]) -> None:
|
|
727
|
+
wallet_node._close()
|
|
728
|
+
await wallet_node._await_closed(shutting_down=False)
|
|
729
|
+
await wallet_node._start_with_fingerprint(fingerprint=fingerprint)
|
|
730
|
+
|
|
731
|
+
initial_sk = wallet_node.wallet_state_manager.private_key
|
|
732
|
+
|
|
733
|
+
pk: G1Element = await wallet_node.keychain_proxy.add_key(
|
|
734
|
+
"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
735
|
+
None,
|
|
736
|
+
private=False,
|
|
737
|
+
)
|
|
738
|
+
fingerprint_pk: int = pk.get_fingerprint()
|
|
739
|
+
|
|
740
|
+
await restart_with_fingerprint(fingerprint_pk)
|
|
741
|
+
assert wallet_node.wallet_state_manager.private_key is None
|
|
742
|
+
assert wallet_node.wallet_state_manager.root_pubkey == G1Element()
|
|
743
|
+
|
|
744
|
+
await wallet_node.keychain_proxy.delete_key_by_fingerprint(fingerprint_pk)
|
|
745
|
+
|
|
746
|
+
await restart_with_fingerprint(fingerprint_pk)
|
|
747
|
+
assert wallet_node.wallet_state_manager.private_key == initial_sk
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
@pytest.mark.anyio
|
|
751
|
+
@pytest.mark.standard_block_tools
|
|
752
|
+
async def test_start_with_multiple_keys(
|
|
753
|
+
simulator_and_wallet: OldSimulatorsAndWallets, self_hostname: str, default_400_blocks: list[FullBlock]
|
|
754
|
+
) -> None:
|
|
755
|
+
[_full_node_api], [(wallet_node, _wallet_server)], _bt = simulator_and_wallet
|
|
756
|
+
|
|
757
|
+
async def restart_with_fingerprint(fingerprint: Optional[int]) -> None:
|
|
758
|
+
wallet_node._close()
|
|
759
|
+
await wallet_node._await_closed(shutting_down=False)
|
|
760
|
+
await wallet_node._start_with_fingerprint(fingerprint=fingerprint)
|
|
761
|
+
|
|
762
|
+
initial_sk = wallet_node.wallet_state_manager.private_key
|
|
763
|
+
|
|
764
|
+
sk_2: PrivateKey = await wallet_node.keychain_proxy.add_key(
|
|
765
|
+
(
|
|
766
|
+
"cup smoke miss park baby say island tomorrow segment lava bitter easily settle gift "
|
|
767
|
+
"renew arrive kangaroo dilemma organ skin design salt history awesome"
|
|
768
|
+
),
|
|
769
|
+
None,
|
|
770
|
+
private=True,
|
|
771
|
+
)
|
|
772
|
+
fingerprint_2: int = sk_2.get_g1().get_fingerprint()
|
|
773
|
+
|
|
774
|
+
await restart_with_fingerprint(fingerprint_2)
|
|
775
|
+
assert wallet_node.wallet_state_manager.private_key == sk_2
|
|
776
|
+
|
|
777
|
+
await wallet_node.keychain_proxy.delete_key_by_fingerprint(fingerprint_2)
|
|
778
|
+
|
|
779
|
+
await restart_with_fingerprint(fingerprint_2)
|
|
780
|
+
assert wallet_node.wallet_state_manager.private_key == initial_sk
|