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,1123 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
5
|
+
import logging
|
|
6
|
+
import tempfile
|
|
7
|
+
from collections.abc import AsyncIterator
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from shutil import rmtree
|
|
11
|
+
from typing import Any, Union
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
# TODO: update after resolution in https://github.com/pytest-dev/pytest/issues/7469
|
|
16
|
+
from _pytest.fixtures import SubRequest
|
|
17
|
+
from chia_rs import G1Element
|
|
18
|
+
|
|
19
|
+
from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
|
|
20
|
+
from chia._tests.util.setup_nodes import setup_simulators_and_wallets_service
|
|
21
|
+
from chia._tests.util.time_out_assert import time_out_assert
|
|
22
|
+
from chia.consensus.constants import ConsensusConstants
|
|
23
|
+
from chia.pools.pool_puzzles import SINGLETON_LAUNCHER_HASH
|
|
24
|
+
from chia.pools.pool_wallet_info import PoolSingletonState, PoolWalletInfo
|
|
25
|
+
from chia.rpc.wallet_rpc_client import WalletRpcClient
|
|
26
|
+
from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
|
|
27
|
+
from chia.simulator.block_tools import BlockTools, get_plot_dir
|
|
28
|
+
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
29
|
+
from chia.simulator.simulator_protocol import ReorgProtocol
|
|
30
|
+
from chia.simulator.start_simulator import SimulatorFullNodeService
|
|
31
|
+
from chia.types.aliases import WalletService
|
|
32
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
33
|
+
from chia.types.peer_info import PeerInfo
|
|
34
|
+
from chia.util.bech32m import encode_puzzle_hash
|
|
35
|
+
from chia.util.byte_types import hexstr_to_bytes
|
|
36
|
+
from chia.util.config import load_config
|
|
37
|
+
from chia.util.ints import uint32, uint64
|
|
38
|
+
from chia.wallet.derive_keys import find_authentication_sk, find_owner_sk
|
|
39
|
+
from chia.wallet.transaction_record import TransactionRecord
|
|
40
|
+
from chia.wallet.util.transaction_type import TransactionType
|
|
41
|
+
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
42
|
+
from chia.wallet.util.wallet_types import WalletType
|
|
43
|
+
from chia.wallet.wallet_node import WalletNode
|
|
44
|
+
from chia.wallet.wallet_state_manager import WalletStateManager
|
|
45
|
+
|
|
46
|
+
# TODO: Compare deducted fees in all tests against reported total_fee
|
|
47
|
+
|
|
48
|
+
# limit to plain consensus mode for all tests
|
|
49
|
+
pytestmark = [pytest.mark.limit_consensus_modes(reason="irrelevant")]
|
|
50
|
+
|
|
51
|
+
log = logging.getLogger(__name__)
|
|
52
|
+
FEE_AMOUNT = uint64(29_000)
|
|
53
|
+
MAX_WAIT_SECS = 30 # A high value for WAIT_SECS is useful when paused in the debugger
|
|
54
|
+
LOCK_HEIGHT = uint32(5)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def get_pool_plot_dir() -> Path:
|
|
58
|
+
return get_plot_dir() / Path("pool_tests")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@dataclass(frozen=True)
|
|
62
|
+
class TemporaryPoolPlot:
|
|
63
|
+
bt: BlockTools
|
|
64
|
+
p2_singleton_puzzle_hash: bytes32
|
|
65
|
+
plot_id: bytes32
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@contextlib.asynccontextmanager
|
|
69
|
+
async def manage_temporary_pool_plot(
|
|
70
|
+
bt: BlockTools,
|
|
71
|
+
p2_singleton_puzzle_hash: bytes32,
|
|
72
|
+
) -> AsyncIterator[TemporaryPoolPlot]:
|
|
73
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
74
|
+
tmp_path: Path = Path(tmpdir)
|
|
75
|
+
bt.add_plot_directory(tmp_path)
|
|
76
|
+
bt_plot = await bt.new_plot(p2_singleton_puzzle_hash, tmp_path, tmp_dir=tmp_path)
|
|
77
|
+
try:
|
|
78
|
+
await bt.refresh_plots()
|
|
79
|
+
|
|
80
|
+
plot = TemporaryPoolPlot(bt=bt, p2_singleton_puzzle_hash=p2_singleton_puzzle_hash, plot_id=bt_plot.plot_id)
|
|
81
|
+
|
|
82
|
+
yield plot
|
|
83
|
+
finally:
|
|
84
|
+
await bt.delete_plot(bt_plot.plot_id)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
PREFARMED_BLOCKS = 4
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@pytest.fixture(scope="function", params=[False, True])
|
|
91
|
+
def trusted(request: SubRequest) -> bool:
|
|
92
|
+
return request.param # type: ignore[no-any-return]
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@pytest.fixture(scope="function")
|
|
96
|
+
def fee(trusted: bool) -> uint64:
|
|
97
|
+
if trusted:
|
|
98
|
+
return FEE_AMOUNT
|
|
99
|
+
|
|
100
|
+
return uint64(0)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
OneWalletNodeAndRpc = tuple[WalletRpcClient, Any, FullNodeSimulator, int, BlockTools]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@pytest.fixture(scope="function")
|
|
107
|
+
async def one_wallet_node_and_rpc(
|
|
108
|
+
trusted: bool, self_hostname: str, blockchain_constants: ConsensusConstants
|
|
109
|
+
) -> AsyncIterator[OneWalletNodeAndRpc]:
|
|
110
|
+
rmtree(get_pool_plot_dir(), ignore_errors=True)
|
|
111
|
+
async with setup_simulators_and_wallets_service(1, 1, blockchain_constants) as nodes:
|
|
112
|
+
full_nodes, wallets, bt = nodes
|
|
113
|
+
full_node_api: FullNodeSimulator = full_nodes[0]._api
|
|
114
|
+
wallet_service = wallets[0]
|
|
115
|
+
wallet_node = wallet_service._node
|
|
116
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
117
|
+
|
|
118
|
+
if trusted:
|
|
119
|
+
wallet_node.config["trusted_peers"] = {
|
|
120
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
121
|
+
}
|
|
122
|
+
else:
|
|
123
|
+
wallet_node.config["trusted_peers"] = {}
|
|
124
|
+
|
|
125
|
+
await wallet_node.server.start_client(PeerInfo(self_hostname, full_node_api.full_node.server.get_port()), None)
|
|
126
|
+
|
|
127
|
+
balance = await full_node_api.farm_rewards_to_wallet(amount=8_000_000_000_000, wallet=wallet)
|
|
128
|
+
assert wallet_service.rpc_server is not None
|
|
129
|
+
client = await WalletRpcClient.create(
|
|
130
|
+
self_hostname, wallet_service.rpc_server.listen_port, wallet_service.root_path, wallet_service.config
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
134
|
+
|
|
135
|
+
yield client, wallet_node, full_node_api, balance, bt
|
|
136
|
+
|
|
137
|
+
client.close()
|
|
138
|
+
await client.await_closed()
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
Setup = tuple[FullNodeSimulator, WalletNode, bytes32, int, WalletRpcClient]
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@pytest.fixture(scope="function")
|
|
145
|
+
async def setup(
|
|
146
|
+
one_wallet_and_one_simulator_services: tuple[list[SimulatorFullNodeService], list[WalletService], BlockTools],
|
|
147
|
+
trusted: bool,
|
|
148
|
+
self_hostname: str,
|
|
149
|
+
) -> AsyncIterator[Setup]:
|
|
150
|
+
rmtree(get_pool_plot_dir(), ignore_errors=True)
|
|
151
|
+
[full_node_service], [wallet_service], _bt = one_wallet_and_one_simulator_services
|
|
152
|
+
full_node_api: FullNodeSimulator = full_node_service._api
|
|
153
|
+
wallet_node = wallet_service._node
|
|
154
|
+
our_ph_record = await wallet_node.wallet_state_manager.get_unused_derivation_record(uint32(1), hardened=True)
|
|
155
|
+
our_ph = our_ph_record.puzzle_hash
|
|
156
|
+
|
|
157
|
+
wallet_server = wallet_service.rpc_server
|
|
158
|
+
assert wallet_server is not None
|
|
159
|
+
|
|
160
|
+
client = await WalletRpcClient.create(
|
|
161
|
+
self_hostname, wallet_server.listen_port, wallet_service.root_path, wallet_service.config
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
if trusted:
|
|
165
|
+
wallet_node.config["trusted_peers"] = {
|
|
166
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
167
|
+
}
|
|
168
|
+
else:
|
|
169
|
+
wallet_node.config["trusted_peers"] = {}
|
|
170
|
+
|
|
171
|
+
await wallet_node.server.start_client(PeerInfo(self_hostname, full_node_api.full_node.server.get_port()), None)
|
|
172
|
+
|
|
173
|
+
assert wallet_node._wallet_state_manager is not None
|
|
174
|
+
wallet = wallet_node._wallet_state_manager.main_wallet
|
|
175
|
+
total_block_rewards = await full_node_api.farm_rewards_to_wallet(amount=8_000_000_000_000, wallet=wallet)
|
|
176
|
+
await full_node_api.farm_blocks_to_wallet(count=3, wallet=wallet)
|
|
177
|
+
|
|
178
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
179
|
+
|
|
180
|
+
yield (
|
|
181
|
+
full_node_api,
|
|
182
|
+
wallet_node,
|
|
183
|
+
our_ph,
|
|
184
|
+
total_block_rewards,
|
|
185
|
+
client, # wallet rpc client
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
client.close()
|
|
189
|
+
await client.await_closed()
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
async def verify_pool_state(wallet_rpc: WalletRpcClient, w_id: int, expected_state: PoolSingletonState) -> bool:
|
|
193
|
+
pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(w_id))[0]
|
|
194
|
+
return pw_status.current.state == expected_state.value
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
async def process_plotnft_create(
|
|
198
|
+
wallet_test_framework: WalletTestFramework, expected_state: PoolSingletonState, second_nft: bool = False
|
|
199
|
+
) -> int:
|
|
200
|
+
wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
|
|
201
|
+
|
|
202
|
+
pre_block_balance_updates: dict[Union[int, str], dict[str, int]] = {
|
|
203
|
+
1: {
|
|
204
|
+
"confirmed_wallet_balance": 0,
|
|
205
|
+
"unconfirmed_wallet_balance": -1,
|
|
206
|
+
"<=#spendable_balance": 1,
|
|
207
|
+
"<=#max_send_amount": 1,
|
|
208
|
+
">=#pending_change": 1, # any amount increase
|
|
209
|
+
"pending_coin_removal_count": 1,
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
post_block_balance_updates: dict[Union[int, str], dict[str, int]] = {
|
|
214
|
+
1: {
|
|
215
|
+
"confirmed_wallet_balance": -1,
|
|
216
|
+
"unconfirmed_wallet_balance": 0,
|
|
217
|
+
">=#spendable_balance": 1,
|
|
218
|
+
">=#max_send_amount": 1,
|
|
219
|
+
"<=#pending_change": 1, # any amount decrease
|
|
220
|
+
"<=#pending_coin_removal_count": 1,
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if second_nft:
|
|
225
|
+
post_block = post_block_balance_updates | {
|
|
226
|
+
2: {
|
|
227
|
+
"set_remainder": True, # TODO: sometimes this fails with pending_coin_removal_count
|
|
228
|
+
},
|
|
229
|
+
3: {"init": True, "unspent_coin_count": 1},
|
|
230
|
+
}
|
|
231
|
+
else:
|
|
232
|
+
post_block = post_block_balance_updates | {2: {"init": True, "unspent_coin_count": 1}}
|
|
233
|
+
|
|
234
|
+
await wallet_test_framework.process_pending_states(
|
|
235
|
+
[
|
|
236
|
+
WalletStateTransition(
|
|
237
|
+
pre_block_balance_updates=pre_block_balance_updates,
|
|
238
|
+
post_block_balance_updates=post_block,
|
|
239
|
+
)
|
|
240
|
+
]
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
summaries_response = await wallet_rpc.get_wallets(WalletType.POOLING_WALLET)
|
|
244
|
+
assert len(summaries_response) == 2 if second_nft else 1
|
|
245
|
+
wallet_id: int = summaries_response[-1]["id"]
|
|
246
|
+
|
|
247
|
+
await verify_pool_state(wallet_rpc, wallet_id, expected_state=expected_state)
|
|
248
|
+
return wallet_id
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
async def create_new_plotnft(
|
|
252
|
+
wallet_test_framework: WalletTestFramework, self_pool: bool = False, second_nft: bool = False
|
|
253
|
+
) -> int:
|
|
254
|
+
wallet_state_manager: WalletStateManager = wallet_test_framework.environments[0].wallet_state_manager
|
|
255
|
+
wallet_rpc: WalletRpcClient = wallet_test_framework.environments[0].rpc_client
|
|
256
|
+
|
|
257
|
+
our_ph = await wallet_state_manager.main_wallet.get_new_puzzlehash()
|
|
258
|
+
|
|
259
|
+
await wallet_rpc.create_new_pool_wallet(
|
|
260
|
+
target_puzzlehash=our_ph,
|
|
261
|
+
backup_host="",
|
|
262
|
+
mode="new",
|
|
263
|
+
relative_lock_height=uint32(0) if self_pool else LOCK_HEIGHT,
|
|
264
|
+
state="SELF_POOLING" if self_pool else "FARMING_TO_POOL",
|
|
265
|
+
pool_url="" if self_pool else "http://pool.example.com",
|
|
266
|
+
fee=uint64(0),
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
return await process_plotnft_create(
|
|
270
|
+
wallet_test_framework=wallet_test_framework,
|
|
271
|
+
expected_state=PoolSingletonState.SELF_POOLING if self_pool else PoolSingletonState.FARMING_TO_POOL,
|
|
272
|
+
second_nft=second_nft,
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class TestPoolWalletRpc:
|
|
277
|
+
@pytest.mark.anyio
|
|
278
|
+
async def test_create_new_pool_wallet_self_farm(
|
|
279
|
+
self,
|
|
280
|
+
one_wallet_node_and_rpc: OneWalletNodeAndRpc,
|
|
281
|
+
fee: uint64,
|
|
282
|
+
self_hostname: str,
|
|
283
|
+
) -> None:
|
|
284
|
+
client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
|
|
285
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
286
|
+
|
|
287
|
+
our_ph = await wallet.get_new_puzzlehash()
|
|
288
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
289
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
290
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
291
|
+
our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
|
|
292
|
+
)
|
|
293
|
+
await full_node_api.process_transaction_records(records=[creation_tx])
|
|
294
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=30)
|
|
295
|
+
|
|
296
|
+
summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
|
|
297
|
+
assert len(summaries_response) == 1
|
|
298
|
+
wallet_id: int = summaries_response[0]["id"]
|
|
299
|
+
status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
300
|
+
|
|
301
|
+
assert status.current.state == PoolSingletonState.SELF_POOLING.value
|
|
302
|
+
assert status.target is None
|
|
303
|
+
assert status.current.owner_pubkey == G1Element.from_bytes(
|
|
304
|
+
bytes.fromhex(
|
|
305
|
+
"b286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
|
|
306
|
+
)
|
|
307
|
+
)
|
|
308
|
+
assert status.current.pool_url == ""
|
|
309
|
+
assert status.current.relative_lock_height == 0
|
|
310
|
+
assert status.current.version == 1
|
|
311
|
+
# Check that config has been written properly
|
|
312
|
+
full_config: dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
|
|
313
|
+
pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
|
|
314
|
+
assert len(pool_list) == 1
|
|
315
|
+
pool_config = pool_list[0]
|
|
316
|
+
assert (
|
|
317
|
+
pool_config["owner_public_key"]
|
|
318
|
+
== "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
|
|
319
|
+
)
|
|
320
|
+
# It can be one of multiple launcher IDs, due to selecting a different coin
|
|
321
|
+
launcher_id = None
|
|
322
|
+
for addition in creation_tx.additions:
|
|
323
|
+
if addition.puzzle_hash == SINGLETON_LAUNCHER_HASH:
|
|
324
|
+
launcher_id = addition.name()
|
|
325
|
+
break
|
|
326
|
+
assert hexstr_to_bytes(pool_config["launcher_id"]) == launcher_id
|
|
327
|
+
assert pool_config["pool_url"] == ""
|
|
328
|
+
|
|
329
|
+
@pytest.mark.anyio
|
|
330
|
+
async def test_create_new_pool_wallet_farm_to_pool(
|
|
331
|
+
self,
|
|
332
|
+
one_wallet_node_and_rpc: OneWalletNodeAndRpc,
|
|
333
|
+
fee: uint64,
|
|
334
|
+
self_hostname: str,
|
|
335
|
+
) -> None:
|
|
336
|
+
client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
|
|
337
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
338
|
+
|
|
339
|
+
our_ph = await wallet.get_new_puzzlehash()
|
|
340
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
341
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
342
|
+
|
|
343
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
344
|
+
our_ph, "http://pool.example.com", uint32(10), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
|
|
345
|
+
)
|
|
346
|
+
await full_node_api.process_transaction_records(records=[creation_tx])
|
|
347
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
348
|
+
|
|
349
|
+
summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
|
|
350
|
+
assert len(summaries_response) == 1
|
|
351
|
+
wallet_id: int = summaries_response[0]["id"]
|
|
352
|
+
status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
353
|
+
|
|
354
|
+
assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
355
|
+
assert status.target is None
|
|
356
|
+
assert status.current.owner_pubkey == G1Element.from_bytes(
|
|
357
|
+
bytes.fromhex(
|
|
358
|
+
"b286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
|
|
359
|
+
)
|
|
360
|
+
)
|
|
361
|
+
assert status.current.pool_url == "http://pool.example.com"
|
|
362
|
+
assert status.current.relative_lock_height == 10
|
|
363
|
+
assert status.current.version == 1
|
|
364
|
+
# Check that config has been written properly
|
|
365
|
+
full_config: dict[str, Any] = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
|
|
366
|
+
pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
|
|
367
|
+
assert len(pool_list) == 1
|
|
368
|
+
pool_config = pool_list[0]
|
|
369
|
+
assert (
|
|
370
|
+
pool_config["owner_public_key"]
|
|
371
|
+
== "0xb286bbf7a10fa058d2a2a758921377ef00bb7f8143e1bd40dd195ae918dbef42cfc481140f01b9eae13b430a0c8fe304"
|
|
372
|
+
)
|
|
373
|
+
# It can be one of multiple launcher IDs, due to selecting a different coin
|
|
374
|
+
launcher_id = None
|
|
375
|
+
for addition in creation_tx.additions:
|
|
376
|
+
if addition.puzzle_hash == SINGLETON_LAUNCHER_HASH:
|
|
377
|
+
launcher_id = addition.name()
|
|
378
|
+
break
|
|
379
|
+
assert hexstr_to_bytes(pool_config["launcher_id"]) == launcher_id
|
|
380
|
+
assert pool_config["pool_url"] == "http://pool.example.com"
|
|
381
|
+
|
|
382
|
+
@pytest.mark.anyio
|
|
383
|
+
async def test_create_multiple_pool_wallets(
|
|
384
|
+
self,
|
|
385
|
+
one_wallet_node_and_rpc: OneWalletNodeAndRpc,
|
|
386
|
+
trusted: bool,
|
|
387
|
+
fee: uint64,
|
|
388
|
+
self_hostname: str,
|
|
389
|
+
) -> None:
|
|
390
|
+
client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
|
|
391
|
+
|
|
392
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
393
|
+
|
|
394
|
+
our_ph_1 = await wallet.get_new_puzzlehash()
|
|
395
|
+
our_ph_2 = await wallet.get_new_puzzlehash()
|
|
396
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
397
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
398
|
+
|
|
399
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
400
|
+
our_ph_1, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
|
|
401
|
+
)
|
|
402
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
403
|
+
creation_tx_2: TransactionRecord = await client.create_new_pool_wallet(
|
|
404
|
+
our_ph_1, self_hostname, uint32(12), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
await full_node_api.process_transaction_records(records=[creation_tx, creation_tx_2])
|
|
408
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
409
|
+
|
|
410
|
+
async def pw_created(check_wallet_id: int) -> bool:
|
|
411
|
+
try:
|
|
412
|
+
await client.pw_status(check_wallet_id)
|
|
413
|
+
return True
|
|
414
|
+
except ValueError:
|
|
415
|
+
return False
|
|
416
|
+
|
|
417
|
+
await time_out_assert(10, pw_created, True, 2)
|
|
418
|
+
await time_out_assert(10, pw_created, True, 3)
|
|
419
|
+
status_2: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
420
|
+
status_3: PoolWalletInfo = (await client.pw_status(3))[0]
|
|
421
|
+
|
|
422
|
+
if status_2.current.state == PoolSingletonState.SELF_POOLING.value:
|
|
423
|
+
assert status_3.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
424
|
+
else:
|
|
425
|
+
assert status_2.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
426
|
+
assert status_3.current.state == PoolSingletonState.SELF_POOLING.value
|
|
427
|
+
|
|
428
|
+
full_config = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
|
|
429
|
+
pool_list: list[dict[str, Any]] = full_config["pool"]["pool_list"]
|
|
430
|
+
assert len(pool_list) == 2
|
|
431
|
+
|
|
432
|
+
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
|
|
433
|
+
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(3)) == 0
|
|
434
|
+
# Doing a reorg reverts and removes the pool wallets
|
|
435
|
+
await full_node_api.reorg_from_index_to_new_index(ReorgProtocol(uint32(0), uint32(20), our_ph_2, None))
|
|
436
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=30)
|
|
437
|
+
summaries_response = await client.get_wallets()
|
|
438
|
+
assert len(summaries_response) == 1
|
|
439
|
+
|
|
440
|
+
with pytest.raises(ValueError):
|
|
441
|
+
await client.pw_status(2)
|
|
442
|
+
with pytest.raises(ValueError):
|
|
443
|
+
await client.pw_status(3)
|
|
444
|
+
|
|
445
|
+
# Create some CAT wallets to increase wallet IDs
|
|
446
|
+
def mempool_empty() -> bool:
|
|
447
|
+
return full_node_api.full_node.mempool_manager.mempool.size() == 0
|
|
448
|
+
|
|
449
|
+
await client.delete_unconfirmed_transactions(1)
|
|
450
|
+
await full_node_api.process_all_wallet_transactions(wallet=wallet)
|
|
451
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
452
|
+
|
|
453
|
+
for i in range(5):
|
|
454
|
+
await time_out_assert(10, mempool_empty)
|
|
455
|
+
res = await client.create_new_cat_and_wallet(uint64(20), test=True)
|
|
456
|
+
assert res["success"]
|
|
457
|
+
cat_0_id = res["wallet_id"]
|
|
458
|
+
asset_id = bytes.fromhex(res["asset_id"])
|
|
459
|
+
assert len(asset_id) > 0
|
|
460
|
+
await full_node_api.process_all_wallet_transactions(wallet=wallet)
|
|
461
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
462
|
+
bal_0 = await client.get_wallet_balance(cat_0_id)
|
|
463
|
+
assert bal_0["confirmed_wallet_balance"] == 20
|
|
464
|
+
|
|
465
|
+
# Test creation of many pool wallets. Use untrusted since that is the more complicated protocol, but don't
|
|
466
|
+
# run this code more than once, since it's slow.
|
|
467
|
+
if not trusted:
|
|
468
|
+
for i in range(22):
|
|
469
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
470
|
+
creation_tx_3: TransactionRecord = await client.create_new_pool_wallet(
|
|
471
|
+
our_ph_1, self_hostname, uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
|
|
472
|
+
)
|
|
473
|
+
await full_node_api.process_transaction_records(records=[creation_tx_3])
|
|
474
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
475
|
+
|
|
476
|
+
full_config = load_config(wallet.wallet_state_manager.root_path, "config.yaml")
|
|
477
|
+
pool_list = full_config["pool"]["pool_list"]
|
|
478
|
+
assert len(pool_list) == i + 3
|
|
479
|
+
if i == 0:
|
|
480
|
+
# Ensures that the CAT creation does not cause pool wallet IDs to increment
|
|
481
|
+
for some_wallet in wallet_node.wallet_state_manager.wallets.values():
|
|
482
|
+
if some_wallet.type() == WalletType.POOLING_WALLET:
|
|
483
|
+
status: PoolWalletInfo = (await client.pw_status(some_wallet.id()))[0]
|
|
484
|
+
assert (await some_wallet.get_pool_wallet_index()) < 5
|
|
485
|
+
auth_sk = find_authentication_sk(
|
|
486
|
+
[some_wallet.wallet_state_manager.get_master_private_key()], status.current.owner_pubkey
|
|
487
|
+
)
|
|
488
|
+
assert auth_sk is not None
|
|
489
|
+
owner_sk = find_owner_sk(
|
|
490
|
+
[some_wallet.wallet_state_manager.get_master_private_key()], status.current.owner_pubkey
|
|
491
|
+
)
|
|
492
|
+
assert owner_sk is not None
|
|
493
|
+
assert owner_sk[0] != auth_sk
|
|
494
|
+
|
|
495
|
+
@pytest.mark.anyio
|
|
496
|
+
async def test_absorb_self(
|
|
497
|
+
self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
|
|
498
|
+
) -> None:
|
|
499
|
+
client, wallet_node, full_node_api, _total_block_rewards, _ = one_wallet_node_and_rpc
|
|
500
|
+
bt = full_node_api.bt
|
|
501
|
+
|
|
502
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
503
|
+
|
|
504
|
+
our_ph = await wallet.get_new_puzzlehash()
|
|
505
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
506
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
507
|
+
|
|
508
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
509
|
+
our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
|
|
510
|
+
)
|
|
511
|
+
await full_node_api.process_transaction_records(records=[creation_tx])
|
|
512
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
513
|
+
status: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
514
|
+
|
|
515
|
+
assert status.current.state == PoolSingletonState.SELF_POOLING.value
|
|
516
|
+
async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
|
|
517
|
+
all_blocks = await full_node_api.get_all_full_blocks()
|
|
518
|
+
blocks = bt.get_consecutive_blocks(
|
|
519
|
+
3,
|
|
520
|
+
block_list_input=all_blocks,
|
|
521
|
+
force_plot_id=pool_plot.plot_id,
|
|
522
|
+
farmer_reward_puzzle_hash=our_ph,
|
|
523
|
+
guarantee_transaction_block=True,
|
|
524
|
+
)
|
|
525
|
+
|
|
526
|
+
await add_blocks_in_batches(blocks[-3:], full_node_api.full_node)
|
|
527
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
528
|
+
|
|
529
|
+
bal = await client.get_wallet_balance(2)
|
|
530
|
+
assert bal["confirmed_wallet_balance"] == 2 * 1_750_000_000_000
|
|
531
|
+
|
|
532
|
+
# Claim 2 * 1.75, and farm a new 1.75
|
|
533
|
+
absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
|
|
534
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs)
|
|
535
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
536
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
537
|
+
await full_node_api.check_transactions_confirmed(wallet_node.wallet_state_manager, absorb_txs)
|
|
538
|
+
assert (
|
|
539
|
+
len(
|
|
540
|
+
[
|
|
541
|
+
tx
|
|
542
|
+
for tx in await wallet_node.wallet_state_manager.tx_store.get_all_transactions()
|
|
543
|
+
if TransactionType(tx.type) is TransactionType.INCOMING_TX and tx.amount == 1_750_000_000_000
|
|
544
|
+
]
|
|
545
|
+
)
|
|
546
|
+
== 2
|
|
547
|
+
)
|
|
548
|
+
new_status: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
549
|
+
assert status.current == new_status.current
|
|
550
|
+
assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
|
|
551
|
+
bal = await client.get_wallet_balance(2)
|
|
552
|
+
assert bal["confirmed_wallet_balance"] == 1 * 1_750_000_000_000
|
|
553
|
+
|
|
554
|
+
# Claim another 1.75
|
|
555
|
+
absorb_txs1: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee)))["transactions"]
|
|
556
|
+
|
|
557
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=absorb_txs1)
|
|
558
|
+
|
|
559
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
560
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
561
|
+
bal = await client.get_wallet_balance(2)
|
|
562
|
+
assert bal["confirmed_wallet_balance"] == 0
|
|
563
|
+
|
|
564
|
+
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
|
|
565
|
+
|
|
566
|
+
tr: TransactionRecord = (
|
|
567
|
+
await client.send_transaction(
|
|
568
|
+
1, uint64(100), encode_puzzle_hash(status.p2_singleton_puzzle_hash, "txch"), DEFAULT_TX_CONFIG
|
|
569
|
+
)
|
|
570
|
+
).transaction
|
|
571
|
+
|
|
572
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=[tr])
|
|
573
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=2, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
574
|
+
|
|
575
|
+
# Balance ignores non coinbase TX
|
|
576
|
+
bal = await client.get_wallet_balance(2)
|
|
577
|
+
assert bal["confirmed_wallet_balance"] == 0
|
|
578
|
+
|
|
579
|
+
with pytest.raises(ValueError):
|
|
580
|
+
await client.pw_absorb_rewards(2, uint64(fee))
|
|
581
|
+
|
|
582
|
+
tx1 = await client.get_transactions(1)
|
|
583
|
+
assert (250_000_000_000 + fee) in [tx.amount for tx in tx1]
|
|
584
|
+
|
|
585
|
+
@pytest.mark.anyio
|
|
586
|
+
async def test_absorb_self_multiple_coins(
|
|
587
|
+
self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
|
|
588
|
+
) -> None:
|
|
589
|
+
client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
|
|
590
|
+
bt = full_node_api.bt
|
|
591
|
+
|
|
592
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
593
|
+
|
|
594
|
+
our_ph = await wallet.get_new_puzzlehash()
|
|
595
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
596
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
597
|
+
|
|
598
|
+
main_expected_confirmed_balance = total_block_rewards
|
|
599
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
600
|
+
our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
|
|
601
|
+
)
|
|
602
|
+
await full_node_api.process_transaction_records(records=[creation_tx])
|
|
603
|
+
main_expected_confirmed_balance -= fee
|
|
604
|
+
main_expected_confirmed_balance -= 1
|
|
605
|
+
pool_expected_confirmed_balance = 0
|
|
606
|
+
|
|
607
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
608
|
+
main_bal = await client.get_wallet_balance(1)
|
|
609
|
+
assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance
|
|
610
|
+
|
|
611
|
+
status: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
612
|
+
assert status.current.state == PoolSingletonState.SELF_POOLING.value
|
|
613
|
+
|
|
614
|
+
async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
|
|
615
|
+
all_blocks = await full_node_api.get_all_full_blocks()
|
|
616
|
+
blocks = bt.get_consecutive_blocks(
|
|
617
|
+
3,
|
|
618
|
+
block_list_input=all_blocks,
|
|
619
|
+
force_plot_id=pool_plot.plot_id,
|
|
620
|
+
farmer_reward_puzzle_hash=our_ph,
|
|
621
|
+
guarantee_transaction_block=True,
|
|
622
|
+
)
|
|
623
|
+
|
|
624
|
+
block_count = 3
|
|
625
|
+
await add_blocks_in_batches(blocks[-block_count:], full_node_api.full_node)
|
|
626
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
|
|
627
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
628
|
+
|
|
629
|
+
pool_expected_confirmed_balance += block_count * 1_750_000_000_000
|
|
630
|
+
main_expected_confirmed_balance += block_count * 250_000_000_000
|
|
631
|
+
|
|
632
|
+
main_bal = await client.get_wallet_balance(1)
|
|
633
|
+
assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance
|
|
634
|
+
bal = await client.get_wallet_balance(2)
|
|
635
|
+
assert bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
|
|
636
|
+
|
|
637
|
+
# Claim
|
|
638
|
+
absorb_txs: list[TransactionRecord] = (await client.pw_absorb_rewards(2, uint64(fee), 1))["transactions"]
|
|
639
|
+
await full_node_api.process_transaction_records(records=absorb_txs)
|
|
640
|
+
main_expected_confirmed_balance -= fee
|
|
641
|
+
main_expected_confirmed_balance += 1_750_000_000_000
|
|
642
|
+
pool_expected_confirmed_balance -= 1_750_000_000_000
|
|
643
|
+
|
|
644
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
645
|
+
new_status: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
646
|
+
assert status.current == new_status.current
|
|
647
|
+
assert status.tip_singleton_coin_id != new_status.tip_singleton_coin_id
|
|
648
|
+
main_bal = await client.get_wallet_balance(1)
|
|
649
|
+
pool_bal = await client.get_wallet_balance(2)
|
|
650
|
+
assert pool_bal["confirmed_wallet_balance"] == pool_expected_confirmed_balance
|
|
651
|
+
assert main_bal["confirmed_wallet_balance"] == main_expected_confirmed_balance # 10499999999999
|
|
652
|
+
|
|
653
|
+
@pytest.mark.anyio
|
|
654
|
+
async def test_absorb_pooling(
|
|
655
|
+
self, one_wallet_node_and_rpc: OneWalletNodeAndRpc, fee: uint64, self_hostname: str
|
|
656
|
+
) -> None:
|
|
657
|
+
client, wallet_node, full_node_api, total_block_rewards, _ = one_wallet_node_and_rpc
|
|
658
|
+
bt = full_node_api.bt
|
|
659
|
+
|
|
660
|
+
main_expected_confirmed_balance = total_block_rewards
|
|
661
|
+
|
|
662
|
+
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
663
|
+
|
|
664
|
+
our_ph = await wallet.get_new_puzzlehash()
|
|
665
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
666
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
667
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
668
|
+
our_ph, "http://123.45.67.89", uint32(10), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", fee
|
|
669
|
+
)
|
|
670
|
+
await full_node_api.process_transaction_records(records=[creation_tx])
|
|
671
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
672
|
+
main_expected_confirmed_balance -= 1
|
|
673
|
+
main_expected_confirmed_balance -= fee
|
|
674
|
+
|
|
675
|
+
async def farming_to_pool() -> bool:
|
|
676
|
+
try:
|
|
677
|
+
status: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
678
|
+
return status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
679
|
+
except ValueError:
|
|
680
|
+
return False
|
|
681
|
+
|
|
682
|
+
await time_out_assert(20, farming_to_pool)
|
|
683
|
+
|
|
684
|
+
status: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
685
|
+
async with manage_temporary_pool_plot(bt, status.p2_singleton_puzzle_hash) as pool_plot:
|
|
686
|
+
all_blocks = await full_node_api.get_all_full_blocks()
|
|
687
|
+
blocks = bt.get_consecutive_blocks(
|
|
688
|
+
3,
|
|
689
|
+
block_list_input=all_blocks,
|
|
690
|
+
force_plot_id=pool_plot.plot_id,
|
|
691
|
+
farmer_reward_puzzle_hash=our_ph,
|
|
692
|
+
guarantee_transaction_block=True,
|
|
693
|
+
)
|
|
694
|
+
|
|
695
|
+
block_count = 3
|
|
696
|
+
await add_blocks_in_batches(blocks[-block_count:], full_node_api.full_node)
|
|
697
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
|
|
698
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
699
|
+
# Pooled plots don't have balance
|
|
700
|
+
main_expected_confirmed_balance += block_count * 250_000_000_000
|
|
701
|
+
bal = await client.get_wallet_balance(2)
|
|
702
|
+
assert bal["confirmed_wallet_balance"] == 0
|
|
703
|
+
|
|
704
|
+
# Claim block_count * 1.75
|
|
705
|
+
ret = await client.pw_absorb_rewards(2, uint64(fee))
|
|
706
|
+
absorb_txs: list[TransactionRecord] = ret["transactions"]
|
|
707
|
+
if fee == 0:
|
|
708
|
+
assert ret["fee_transaction"] is None
|
|
709
|
+
else:
|
|
710
|
+
assert ret["fee_transaction"].fee_amount == fee
|
|
711
|
+
for tx in absorb_txs:
|
|
712
|
+
assert tx.fee_amount == fee
|
|
713
|
+
await full_node_api.process_transaction_records(records=absorb_txs)
|
|
714
|
+
main_expected_confirmed_balance -= fee
|
|
715
|
+
main_expected_confirmed_balance += block_count * 1_750_000_000_000
|
|
716
|
+
|
|
717
|
+
async def status_updated() -> bool:
|
|
718
|
+
new_st: PoolWalletInfo = (await client.pw_status(2))[0]
|
|
719
|
+
return status.current == new_st.current and status.tip_singleton_coin_id != new_st.tip_singleton_coin_id
|
|
720
|
+
|
|
721
|
+
await time_out_assert(20, status_updated)
|
|
722
|
+
new_status = (await client.pw_status(2))[0]
|
|
723
|
+
bal = await client.get_wallet_balance(2)
|
|
724
|
+
assert bal["confirmed_wallet_balance"] == 0
|
|
725
|
+
|
|
726
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
727
|
+
bal = await client.get_wallet_balance(2)
|
|
728
|
+
assert bal["confirmed_wallet_balance"] == 0
|
|
729
|
+
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
|
|
730
|
+
peak = full_node_api.full_node.blockchain.get_peak()
|
|
731
|
+
assert peak is not None
|
|
732
|
+
assert await wallet_node.wallet_state_manager.blockchain.get_finished_sync_up_to() == peak.height
|
|
733
|
+
assert (await wallet.get_confirmed_balance()) == main_expected_confirmed_balance
|
|
734
|
+
|
|
735
|
+
num_trials = 3
|
|
736
|
+
status = new_status
|
|
737
|
+
|
|
738
|
+
if fee == 0:
|
|
739
|
+
for i in range(num_trials):
|
|
740
|
+
all_blocks = await full_node_api.get_all_full_blocks()
|
|
741
|
+
# Farm one block using our pool plot
|
|
742
|
+
blocks = bt.get_consecutive_blocks(
|
|
743
|
+
1,
|
|
744
|
+
block_list_input=all_blocks,
|
|
745
|
+
force_plot_id=pool_plot.plot_id,
|
|
746
|
+
farmer_reward_puzzle_hash=our_ph,
|
|
747
|
+
guarantee_transaction_block=True,
|
|
748
|
+
)
|
|
749
|
+
# Farm one more block to include the reward of the previous one
|
|
750
|
+
blocks = bt.get_consecutive_blocks(
|
|
751
|
+
1,
|
|
752
|
+
block_list_input=blocks,
|
|
753
|
+
guarantee_transaction_block=True,
|
|
754
|
+
)
|
|
755
|
+
await add_blocks_in_batches(blocks[-2:], full_node_api.full_node)
|
|
756
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
757
|
+
|
|
758
|
+
# Absorb the farmed reward
|
|
759
|
+
ret = await client.pw_absorb_rewards(2, fee)
|
|
760
|
+
absorb_tx = ret["transaction"]
|
|
761
|
+
await full_node_api.process_transaction_records(records=[absorb_tx])
|
|
762
|
+
|
|
763
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
764
|
+
await time_out_assert(20, status_updated)
|
|
765
|
+
status = (await client.pw_status(2))[0]
|
|
766
|
+
assert ret["fee_transaction"] is None
|
|
767
|
+
|
|
768
|
+
bal2 = await client.get_wallet_balance(2)
|
|
769
|
+
assert bal2["confirmed_wallet_balance"] == 0
|
|
770
|
+
|
|
771
|
+
@pytest.mark.anyio
|
|
772
|
+
async def test_self_pooling_to_pooling(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
|
|
773
|
+
"""
|
|
774
|
+
This tests self-pooling -> pooling
|
|
775
|
+
TODO: Fix this test for a positive fee value
|
|
776
|
+
"""
|
|
777
|
+
|
|
778
|
+
if fee != 0:
|
|
779
|
+
pytest.skip("need to fix this test for non-zero fees")
|
|
780
|
+
|
|
781
|
+
full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
|
|
782
|
+
pool_ph = bytes32.zeros
|
|
783
|
+
|
|
784
|
+
assert wallet_node._wallet_state_manager is not None
|
|
785
|
+
|
|
786
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
787
|
+
|
|
788
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
789
|
+
our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
|
|
790
|
+
)
|
|
791
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
|
|
792
|
+
creation_tx_2: TransactionRecord = await client.create_new_pool_wallet(
|
|
793
|
+
our_ph, "", uint32(0), f"{self_hostname}:5001", "new", "SELF_POOLING", fee
|
|
794
|
+
)
|
|
795
|
+
|
|
796
|
+
for r in creation_tx.removals:
|
|
797
|
+
assert r not in creation_tx_2.removals
|
|
798
|
+
|
|
799
|
+
await full_node_api.process_transaction_records(records=[creation_tx_2])
|
|
800
|
+
|
|
801
|
+
assert not full_node_api.txs_in_mempool(txs=[creation_tx])
|
|
802
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
803
|
+
|
|
804
|
+
summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
|
|
805
|
+
assert len(summaries_response) == 2
|
|
806
|
+
wallet_id: int = summaries_response[0]["id"]
|
|
807
|
+
wallet_id_2: int = summaries_response[1]["id"]
|
|
808
|
+
status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
809
|
+
status_2: PoolWalletInfo = (await client.pw_status(wallet_id_2))[0]
|
|
810
|
+
|
|
811
|
+
assert status.current.state == PoolSingletonState.SELF_POOLING.value
|
|
812
|
+
assert status_2.current.state == PoolSingletonState.SELF_POOLING.value
|
|
813
|
+
assert status.target is None
|
|
814
|
+
assert status_2.target is None
|
|
815
|
+
|
|
816
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
817
|
+
join_pool: dict[str, Any] = await client.pw_join_pool(
|
|
818
|
+
wallet_id,
|
|
819
|
+
pool_ph,
|
|
820
|
+
"https://pool.example.com",
|
|
821
|
+
uint32(10),
|
|
822
|
+
uint64(fee),
|
|
823
|
+
)
|
|
824
|
+
assert join_pool["success"]
|
|
825
|
+
join_pool_tx: TransactionRecord = join_pool["transaction"]
|
|
826
|
+
assert join_pool_tx is not None
|
|
827
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx])
|
|
828
|
+
|
|
829
|
+
join_pool_2: dict[str, Any] = await client.pw_join_pool(
|
|
830
|
+
wallet_id_2, pool_ph, "https://pool.example.com", uint32(10), uint64(fee)
|
|
831
|
+
)
|
|
832
|
+
assert join_pool_2["success"]
|
|
833
|
+
join_pool_tx_2: TransactionRecord = join_pool_2["transaction"]
|
|
834
|
+
for r in join_pool_tx.removals:
|
|
835
|
+
assert r not in join_pool_tx_2.removals
|
|
836
|
+
assert join_pool_tx_2 is not None
|
|
837
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=[join_pool_tx_2])
|
|
838
|
+
|
|
839
|
+
status = (await client.pw_status(wallet_id))[0]
|
|
840
|
+
status_2 = (await client.pw_status(wallet_id_2))[0]
|
|
841
|
+
|
|
842
|
+
assert status.current.state == PoolSingletonState.SELF_POOLING.value
|
|
843
|
+
assert status.target is not None
|
|
844
|
+
assert status.target.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
845
|
+
assert status_2.current.state == PoolSingletonState.SELF_POOLING.value
|
|
846
|
+
assert status_2.target is not None
|
|
847
|
+
assert status_2.target.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
848
|
+
|
|
849
|
+
await full_node_api.process_transaction_records(records=[join_pool_tx, join_pool_tx_2])
|
|
850
|
+
|
|
851
|
+
async def status_is_farming_to_pool(w_id: int) -> bool:
|
|
852
|
+
pw_status: PoolWalletInfo = (await client.pw_status(w_id))[0]
|
|
853
|
+
return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
854
|
+
|
|
855
|
+
await time_out_assert(20, status_is_farming_to_pool, True, wallet_id)
|
|
856
|
+
await time_out_assert(20, status_is_farming_to_pool, True, wallet_id_2)
|
|
857
|
+
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
|
|
858
|
+
|
|
859
|
+
@pytest.mark.anyio
|
|
860
|
+
async def test_leave_pool(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
|
|
861
|
+
"""This tests self-pooling -> pooling -> escaping -> self pooling"""
|
|
862
|
+
full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
|
|
863
|
+
pool_ph = bytes32.zeros
|
|
864
|
+
|
|
865
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
866
|
+
|
|
867
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
868
|
+
|
|
869
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
870
|
+
our_ph, "", uint32(0), f"{self_hostname}:5000", "new", "SELF_POOLING", fee
|
|
871
|
+
)
|
|
872
|
+
|
|
873
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
|
|
874
|
+
|
|
875
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
876
|
+
assert not full_node_api.txs_in_mempool(txs=[creation_tx])
|
|
877
|
+
|
|
878
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
879
|
+
|
|
880
|
+
summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
|
|
881
|
+
assert len(summaries_response) == 1
|
|
882
|
+
wallet_id: int = summaries_response[0]["id"]
|
|
883
|
+
status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
884
|
+
|
|
885
|
+
assert status.current.state == PoolSingletonState.SELF_POOLING.value
|
|
886
|
+
assert status.target is None
|
|
887
|
+
|
|
888
|
+
join_pool_tx: TransactionRecord = (
|
|
889
|
+
await client.pw_join_pool(
|
|
890
|
+
wallet_id,
|
|
891
|
+
pool_ph,
|
|
892
|
+
"https://pool.example.com",
|
|
893
|
+
uint32(5),
|
|
894
|
+
fee,
|
|
895
|
+
)
|
|
896
|
+
)["transaction"]
|
|
897
|
+
assert join_pool_tx is not None
|
|
898
|
+
|
|
899
|
+
status = (await client.pw_status(wallet_id))[0]
|
|
900
|
+
|
|
901
|
+
assert status.current.state == PoolSingletonState.SELF_POOLING.value
|
|
902
|
+
assert status.current.pool_url == ""
|
|
903
|
+
assert status.current.relative_lock_height == 0
|
|
904
|
+
assert status.current.state == 1
|
|
905
|
+
assert status.current.version == 1
|
|
906
|
+
|
|
907
|
+
assert status.target
|
|
908
|
+
assert status.target.pool_url == "https://pool.example.com"
|
|
909
|
+
assert status.target.relative_lock_height == 5
|
|
910
|
+
assert status.target.state == 3
|
|
911
|
+
assert status.target.version == 1
|
|
912
|
+
|
|
913
|
+
async def status_is_farming_to_pool() -> bool:
|
|
914
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
915
|
+
pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
916
|
+
return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
917
|
+
|
|
918
|
+
await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_farming_to_pool)
|
|
919
|
+
|
|
920
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
921
|
+
|
|
922
|
+
leave_pool_tx: dict[str, Any] = await client.pw_self_pool(wallet_id, uint64(fee))
|
|
923
|
+
assert leave_pool_tx["transaction"].wallet_id == wallet_id
|
|
924
|
+
assert leave_pool_tx["transaction"].amount == 1
|
|
925
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=leave_pool_tx["transactions"])
|
|
926
|
+
|
|
927
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
928
|
+
|
|
929
|
+
async def status_is_leaving() -> bool:
|
|
930
|
+
pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
931
|
+
return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
|
|
932
|
+
|
|
933
|
+
await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_leaving)
|
|
934
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
935
|
+
|
|
936
|
+
async def status_is_self_pooling() -> bool:
|
|
937
|
+
# Farm enough blocks to wait for relative_lock_height
|
|
938
|
+
pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
939
|
+
log.warning(f"PW status state: {pw_status.current}")
|
|
940
|
+
return pw_status.current.state == PoolSingletonState.SELF_POOLING.value
|
|
941
|
+
|
|
942
|
+
# pass the relative lock height, this will trigger a tx.
|
|
943
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=4, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
944
|
+
|
|
945
|
+
# Farm the TX
|
|
946
|
+
for i in range(20):
|
|
947
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
948
|
+
await asyncio.sleep(1)
|
|
949
|
+
if await status_is_self_pooling():
|
|
950
|
+
break
|
|
951
|
+
|
|
952
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
953
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
954
|
+
|
|
955
|
+
await time_out_assert(timeout=MAX_WAIT_SECS, function=status_is_self_pooling)
|
|
956
|
+
assert len(await wallet_node.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(2)) == 0
|
|
957
|
+
|
|
958
|
+
@pytest.mark.parametrize(
|
|
959
|
+
"wallet_environments",
|
|
960
|
+
[
|
|
961
|
+
{
|
|
962
|
+
"num_environments": 1,
|
|
963
|
+
"blocks_needed": [10],
|
|
964
|
+
}
|
|
965
|
+
],
|
|
966
|
+
indirect=True,
|
|
967
|
+
)
|
|
968
|
+
@pytest.mark.anyio
|
|
969
|
+
async def test_change_pools(
|
|
970
|
+
self,
|
|
971
|
+
fee: uint64,
|
|
972
|
+
wallet_environments: WalletTestFramework,
|
|
973
|
+
) -> None:
|
|
974
|
+
"""This tests Pool A -> escaping -> Pool B"""
|
|
975
|
+
|
|
976
|
+
wallet_state_manager: WalletStateManager = wallet_environments.environments[0].wallet_state_manager
|
|
977
|
+
wallet_rpc: WalletRpcClient = wallet_environments.environments[0].rpc_client
|
|
978
|
+
|
|
979
|
+
wallet_state_manager.config["reuse_public_key_for_change"][
|
|
980
|
+
str(wallet_state_manager.root_pubkey.get_fingerprint())
|
|
981
|
+
] = wallet_environments.tx_config.reuse_puzhash
|
|
982
|
+
|
|
983
|
+
# Create a farming plotnft to url http://pool.example.com
|
|
984
|
+
wallet_id = await create_new_plotnft(wallet_environments)
|
|
985
|
+
|
|
986
|
+
# Join a different pool
|
|
987
|
+
join_pool_tx: TransactionRecord = (
|
|
988
|
+
await wallet_rpc.pw_join_pool(
|
|
989
|
+
wallet_id,
|
|
990
|
+
bytes32.zeros,
|
|
991
|
+
"https://pool-b.org",
|
|
992
|
+
LOCK_HEIGHT,
|
|
993
|
+
uint64(fee),
|
|
994
|
+
)
|
|
995
|
+
)["transaction"]
|
|
996
|
+
assert join_pool_tx is not None
|
|
997
|
+
|
|
998
|
+
await wallet_environments.full_node.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
|
|
999
|
+
await verify_pool_state(wallet_rpc, wallet_id, PoolSingletonState.LEAVING_POOL)
|
|
1000
|
+
await wallet_environments.full_node.farm_blocks_to_puzzlehash(
|
|
1001
|
+
count=LOCK_HEIGHT + 2, guarantee_transaction_blocks=True
|
|
1002
|
+
)
|
|
1003
|
+
await wallet_environments.full_node.wait_for_wallet_synced(
|
|
1004
|
+
wallet_node=wallet_environments.environments[0].node, timeout=20
|
|
1005
|
+
)
|
|
1006
|
+
|
|
1007
|
+
async def farm_blocks_until_state(
|
|
1008
|
+
state: PoolSingletonState,
|
|
1009
|
+
wallet_rpc: WalletRpcClient,
|
|
1010
|
+
wallet_id: int,
|
|
1011
|
+
full_node: FullNodeSimulator,
|
|
1012
|
+
wallet_node: WalletNode,
|
|
1013
|
+
max_blocks: int = 10 * (LOCK_HEIGHT + 2),
|
|
1014
|
+
) -> bool:
|
|
1015
|
+
block_chunk = LOCK_HEIGHT + 2
|
|
1016
|
+
total_blocks_farmed = 0
|
|
1017
|
+
while total_blocks_farmed < max_blocks:
|
|
1018
|
+
await full_node.farm_blocks_to_puzzlehash(count=block_chunk, guarantee_transaction_blocks=True)
|
|
1019
|
+
total_blocks_farmed += block_chunk
|
|
1020
|
+
print(f"Checking state after {total_blocks_farmed} blocks")
|
|
1021
|
+
|
|
1022
|
+
await full_node.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
1023
|
+
pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
|
|
1024
|
+
if pw_status.current.state == state.value:
|
|
1025
|
+
return True
|
|
1026
|
+
return False
|
|
1027
|
+
|
|
1028
|
+
assert await farm_blocks_until_state(
|
|
1029
|
+
PoolSingletonState.FARMING_TO_POOL,
|
|
1030
|
+
wallet_rpc,
|
|
1031
|
+
wallet_id,
|
|
1032
|
+
wallet_environments.full_node,
|
|
1033
|
+
wallet_environments.environments[0].node,
|
|
1034
|
+
)
|
|
1035
|
+
|
|
1036
|
+
pw_status: PoolWalletInfo = (await wallet_rpc.pw_status(wallet_id))[0]
|
|
1037
|
+
assert pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
1038
|
+
assert pw_status.current.pool_url == "https://pool-b.org"
|
|
1039
|
+
assert pw_status.current.relative_lock_height == LOCK_HEIGHT
|
|
1040
|
+
|
|
1041
|
+
@pytest.mark.anyio
|
|
1042
|
+
async def test_change_pools_reorg(self, setup: Setup, fee: uint64, self_hostname: str) -> None:
|
|
1043
|
+
"""This tests Pool A -> escaping -> reorg -> escaping -> Pool B"""
|
|
1044
|
+
full_node_api, wallet_node, our_ph, _total_block_rewards, client = setup
|
|
1045
|
+
pool_a_ph = bytes32.zeros
|
|
1046
|
+
pool_b_ph = bytes32.zeros
|
|
1047
|
+
WAIT_SECS = 30
|
|
1048
|
+
|
|
1049
|
+
assert len(await client.get_wallets(WalletType.POOLING_WALLET)) == 0
|
|
1050
|
+
|
|
1051
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
1052
|
+
|
|
1053
|
+
creation_tx: TransactionRecord = await client.create_new_pool_wallet(
|
|
1054
|
+
pool_a_ph, "https://pool-a.org", uint32(5), f"{self_hostname}:5000", "new", "FARMING_TO_POOL", uint64(fee)
|
|
1055
|
+
)
|
|
1056
|
+
|
|
1057
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=[creation_tx])
|
|
1058
|
+
|
|
1059
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=6, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
1060
|
+
assert not full_node_api.txs_in_mempool(txs=[creation_tx])
|
|
1061
|
+
|
|
1062
|
+
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
1063
|
+
|
|
1064
|
+
summaries_response = await client.get_wallets(WalletType.POOLING_WALLET)
|
|
1065
|
+
assert len(summaries_response) == 1
|
|
1066
|
+
wallet_id: int = summaries_response[0]["id"]
|
|
1067
|
+
status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
1068
|
+
|
|
1069
|
+
assert status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
1070
|
+
assert status.target is None
|
|
1071
|
+
|
|
1072
|
+
async def status_is_farming_to_pool() -> bool:
|
|
1073
|
+
pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
1074
|
+
return pw_status.current.state == PoolSingletonState.FARMING_TO_POOL.value
|
|
1075
|
+
|
|
1076
|
+
await time_out_assert(timeout=WAIT_SECS, function=status_is_farming_to_pool)
|
|
1077
|
+
|
|
1078
|
+
pw_info: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
1079
|
+
assert pw_info.current.pool_url == "https://pool-a.org"
|
|
1080
|
+
assert pw_info.current.relative_lock_height == 5
|
|
1081
|
+
|
|
1082
|
+
join_pool_txs: list[TransactionRecord] = (
|
|
1083
|
+
await client.pw_join_pool(
|
|
1084
|
+
wallet_id,
|
|
1085
|
+
pool_b_ph,
|
|
1086
|
+
"https://pool-b.org",
|
|
1087
|
+
uint32(10),
|
|
1088
|
+
uint64(fee),
|
|
1089
|
+
)
|
|
1090
|
+
)["transactions"]
|
|
1091
|
+
await full_node_api.wait_transaction_records_entered_mempool(records=join_pool_txs)
|
|
1092
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
1093
|
+
|
|
1094
|
+
async def status_is_leaving_no_blocks() -> bool:
|
|
1095
|
+
pw_status: PoolWalletInfo = (await client.pw_status(wallet_id))[0]
|
|
1096
|
+
return pw_status.current.state == PoolSingletonState.LEAVING_POOL.value
|
|
1097
|
+
|
|
1098
|
+
await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
|
|
1099
|
+
|
|
1100
|
+
current_blocks = await full_node_api.get_all_full_blocks()
|
|
1101
|
+
more_blocks = full_node_api.bt.get_consecutive_blocks(
|
|
1102
|
+
3,
|
|
1103
|
+
farmer_reward_puzzle_hash=pool_a_ph,
|
|
1104
|
+
pool_reward_puzzle_hash=pool_b_ph,
|
|
1105
|
+
block_list_input=current_blocks[:-1],
|
|
1106
|
+
force_overflow=True,
|
|
1107
|
+
guarantee_transaction_block=True,
|
|
1108
|
+
seed=32 * b"4",
|
|
1109
|
+
transaction_data=next(tx.spend_bundle for tx in join_pool_txs if tx.spend_bundle is not None),
|
|
1110
|
+
)
|
|
1111
|
+
|
|
1112
|
+
await add_blocks_in_batches(more_blocks[-3:], full_node_api.full_node)
|
|
1113
|
+
|
|
1114
|
+
await time_out_assert(timeout=WAIT_SECS, function=status_is_leaving_no_blocks)
|
|
1115
|
+
|
|
1116
|
+
for i in range(50):
|
|
1117
|
+
await full_node_api.farm_blocks_to_puzzlehash(count=1, farm_to=our_ph, guarantee_transaction_blocks=True)
|
|
1118
|
+
await asyncio.sleep(1)
|
|
1119
|
+
if await status_is_farming_to_pool():
|
|
1120
|
+
break
|
|
1121
|
+
|
|
1122
|
+
# Eventually, leaves pool
|
|
1123
|
+
assert await status_is_farming_to_pool()
|