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,794 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import itertools
|
|
5
|
+
import time
|
|
6
|
+
from collections.abc import Collection
|
|
7
|
+
from typing import Any, Optional, Union
|
|
8
|
+
|
|
9
|
+
import anyio
|
|
10
|
+
|
|
11
|
+
from chia.consensus.block_body_validation import ForkInfo
|
|
12
|
+
from chia.consensus.block_record import BlockRecord
|
|
13
|
+
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
14
|
+
from chia.consensus.blockchain import BlockchainMutexPriority
|
|
15
|
+
from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
|
|
16
|
+
from chia.full_node.full_node import FullNode
|
|
17
|
+
from chia.full_node.full_node_api import FullNodeAPI
|
|
18
|
+
from chia.rpc.rpc_server import default_get_connections
|
|
19
|
+
from chia.server.outbound_message import NodeType
|
|
20
|
+
from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
|
|
21
|
+
from chia.simulator.block_tools import BlockTools
|
|
22
|
+
from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol
|
|
23
|
+
from chia.types.blockchain_format.coin import Coin
|
|
24
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
25
|
+
from chia.types.coin_record import CoinRecord
|
|
26
|
+
from chia.types.full_block import FullBlock
|
|
27
|
+
from chia.types.spend_bundle import SpendBundle
|
|
28
|
+
from chia.types.validation_state import ValidationState
|
|
29
|
+
from chia.util.augmented_chain import AugmentedBlockchain
|
|
30
|
+
from chia.util.config import lock_and_load_config, save_config
|
|
31
|
+
from chia.util.ints import uint8, uint32, uint64, uint128
|
|
32
|
+
from chia.util.timing import adjusted_timeout, backoff_times
|
|
33
|
+
from chia.wallet.payment import Payment
|
|
34
|
+
from chia.wallet.transaction_record import LightTransactionRecord, TransactionRecord
|
|
35
|
+
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
36
|
+
from chia.wallet.wallet import Wallet
|
|
37
|
+
from chia.wallet.wallet_node import WalletNode
|
|
38
|
+
from chia.wallet.wallet_state_manager import WalletStateManager
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class _Default:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
default = _Default()
|
|
46
|
+
|
|
47
|
+
timeout_per_block = 5
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def wait_for_coins_in_wallet(coins: set[Coin], wallet: Wallet, timeout: Optional[float] = 5):
|
|
51
|
+
"""Wait until all of the specified coins are simultaneously reported as spendable
|
|
52
|
+
by the wallet.
|
|
53
|
+
|
|
54
|
+
Arguments:
|
|
55
|
+
coins: The coins expected to be received.
|
|
56
|
+
wallet: The wallet expected to receive the coins.
|
|
57
|
+
"""
|
|
58
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
59
|
+
for backoff in backoff_times():
|
|
60
|
+
spendable_wallet_coin_records = await wallet.wallet_state_manager.get_spendable_coins_for_wallet(
|
|
61
|
+
wallet_id=wallet.id()
|
|
62
|
+
)
|
|
63
|
+
spendable_wallet_coins = {record.coin for record in spendable_wallet_coin_records}
|
|
64
|
+
|
|
65
|
+
if coins.issubset(spendable_wallet_coins):
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
await asyncio.sleep(backoff)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class FullNodeSimulator(FullNodeAPI):
|
|
72
|
+
def __init__(self, full_node: FullNode, block_tools: BlockTools, config: dict) -> None:
|
|
73
|
+
super().__init__(full_node)
|
|
74
|
+
self.bt = block_tools
|
|
75
|
+
self.full_node = full_node
|
|
76
|
+
self.config = config
|
|
77
|
+
self.time_per_block: Optional[float] = None
|
|
78
|
+
self.full_node.simulator_transaction_callback = self.autofarm_transaction
|
|
79
|
+
self.use_current_time: bool = self.config.get("simulator", {}).get("use_current_time", False)
|
|
80
|
+
self.auto_farm: bool = self.config.get("simulator", {}).get("auto_farm", False)
|
|
81
|
+
|
|
82
|
+
def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
83
|
+
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
84
|
+
|
|
85
|
+
async def get_all_full_blocks(self) -> list[FullBlock]:
|
|
86
|
+
peak: Optional[BlockRecord] = self.full_node.blockchain.get_peak()
|
|
87
|
+
if peak is None:
|
|
88
|
+
return []
|
|
89
|
+
blocks = []
|
|
90
|
+
peak_block = await self.full_node.blockchain.get_full_block(peak.header_hash)
|
|
91
|
+
if peak_block is None:
|
|
92
|
+
return []
|
|
93
|
+
blocks.append(peak_block)
|
|
94
|
+
current = peak_block
|
|
95
|
+
while True:
|
|
96
|
+
prev = await self.full_node.blockchain.get_full_block(current.prev_header_hash)
|
|
97
|
+
if prev is not None:
|
|
98
|
+
current = prev
|
|
99
|
+
blocks.append(prev)
|
|
100
|
+
else:
|
|
101
|
+
break
|
|
102
|
+
|
|
103
|
+
blocks.reverse()
|
|
104
|
+
return blocks
|
|
105
|
+
|
|
106
|
+
async def autofarm_transaction(self, spend_name: bytes32) -> None:
|
|
107
|
+
if self.auto_farm:
|
|
108
|
+
self.log.info(f"Autofarm triggered by tx-id: {spend_name.hex()}")
|
|
109
|
+
new_block = FarmNewBlockProtocol(self.bt.farmer_ph)
|
|
110
|
+
await self.farm_new_transaction_block(new_block, force_wait_for_timestamp=True)
|
|
111
|
+
|
|
112
|
+
async def update_autofarm_config(self, enable_autofarm: bool) -> bool:
|
|
113
|
+
if enable_autofarm == self.auto_farm:
|
|
114
|
+
return self.auto_farm
|
|
115
|
+
else:
|
|
116
|
+
self.auto_farm = enable_autofarm
|
|
117
|
+
with lock_and_load_config(self.bt.root_path, "config.yaml") as config:
|
|
118
|
+
if "simulator" in config:
|
|
119
|
+
config["simulator"]["auto_farm"] = self.auto_farm
|
|
120
|
+
save_config(self.bt.root_path, "config.yaml", config)
|
|
121
|
+
self.config = config
|
|
122
|
+
if self.auto_farm is True and self.full_node.mempool_manager.mempool.total_mempool_cost() > 0:
|
|
123
|
+
# if mempool is not empty and auto farm was just enabled, farm a block
|
|
124
|
+
await self.farm_new_transaction_block(FarmNewBlockProtocol(self.bt.farmer_ph))
|
|
125
|
+
return self.auto_farm
|
|
126
|
+
|
|
127
|
+
async def get_all_coins(self, request: GetAllCoinsProtocol) -> list[CoinRecord]:
|
|
128
|
+
return await self.full_node.coin_store.get_all_coins(request.include_spent_coins)
|
|
129
|
+
|
|
130
|
+
async def revert_block_height(self, new_height: uint32) -> None:
|
|
131
|
+
"""
|
|
132
|
+
This completely deletes blocks from the blockchain.
|
|
133
|
+
While reorgs are preferred, this is also an option
|
|
134
|
+
Note: This does not broadcast the changes, and all wallets will need to be wiped.
|
|
135
|
+
"""
|
|
136
|
+
async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
|
|
137
|
+
peak_height: Optional[uint32] = self.full_node.blockchain.get_peak_height()
|
|
138
|
+
if peak_height is None:
|
|
139
|
+
raise ValueError("We can't revert without any blocks.")
|
|
140
|
+
elif peak_height - 1 < new_height:
|
|
141
|
+
raise ValueError("Cannot revert to a height greater than the current peak height.")
|
|
142
|
+
elif new_height < 1:
|
|
143
|
+
raise ValueError("Cannot revert to a height less than 1.")
|
|
144
|
+
block_record: BlockRecord = self.full_node.blockchain.height_to_block_record(new_height)
|
|
145
|
+
# remove enough data to allow a bunch of blocks to be wiped.
|
|
146
|
+
async with self.full_node.block_store.db_wrapper.writer():
|
|
147
|
+
# set coinstore
|
|
148
|
+
await self.full_node.coin_store.rollback_to_block(new_height)
|
|
149
|
+
# set blockstore to new height
|
|
150
|
+
await self.full_node.block_store.rollback(new_height)
|
|
151
|
+
await self.full_node.block_store.set_peak(block_record.header_hash)
|
|
152
|
+
self.full_node.blockchain._peak_height = new_height
|
|
153
|
+
# reload mempool
|
|
154
|
+
await self.full_node.mempool_manager.new_peak(block_record, None)
|
|
155
|
+
|
|
156
|
+
async def get_all_puzzle_hashes(self) -> dict[bytes32, tuple[uint128, int]]:
|
|
157
|
+
# puzzle_hash, (total_amount, num_transactions)
|
|
158
|
+
ph_total_amount: dict[bytes32, tuple[uint128, int]] = {}
|
|
159
|
+
all_non_spent_coins: list[CoinRecord] = await self.get_all_coins(GetAllCoinsProtocol(False))
|
|
160
|
+
for cr in all_non_spent_coins:
|
|
161
|
+
if cr.coin.puzzle_hash not in ph_total_amount:
|
|
162
|
+
ph_total_amount[cr.coin.puzzle_hash] = (uint128(cr.coin.amount), 1)
|
|
163
|
+
else:
|
|
164
|
+
dict_value: tuple[uint128, int] = ph_total_amount[cr.coin.puzzle_hash]
|
|
165
|
+
ph_total_amount[cr.coin.puzzle_hash] = (uint128(cr.coin.amount + dict_value[0]), dict_value[1] + 1)
|
|
166
|
+
return ph_total_amount
|
|
167
|
+
|
|
168
|
+
async def farm_new_transaction_block(
|
|
169
|
+
self, request: FarmNewBlockProtocol, force_wait_for_timestamp: bool = False
|
|
170
|
+
) -> FullBlock:
|
|
171
|
+
ssi = self.full_node.constants.SUB_SLOT_ITERS_STARTING
|
|
172
|
+
diff = self.full_node.constants.DIFFICULTY_STARTING
|
|
173
|
+
async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
|
|
174
|
+
self.log.info("Farming new block!")
|
|
175
|
+
current_blocks = await self.get_all_full_blocks()
|
|
176
|
+
if len(current_blocks) == 0:
|
|
177
|
+
genesis = self.bt.get_consecutive_blocks(uint8(1))[0]
|
|
178
|
+
future = await pre_validate_block(
|
|
179
|
+
self.full_node.blockchain.constants,
|
|
180
|
+
AugmentedBlockchain(self.full_node.blockchain),
|
|
181
|
+
genesis,
|
|
182
|
+
self.full_node.blockchain.pool,
|
|
183
|
+
None,
|
|
184
|
+
ValidationState(ssi, diff, None),
|
|
185
|
+
)
|
|
186
|
+
pre_validation_result: PreValidationResult = await future
|
|
187
|
+
fork_info = ForkInfo(-1, -1, self.full_node.constants.GENESIS_CHALLENGE)
|
|
188
|
+
await self.full_node.blockchain.add_block(
|
|
189
|
+
genesis,
|
|
190
|
+
pre_validation_result,
|
|
191
|
+
self.full_node.constants.SUB_SLOT_ITERS_STARTING,
|
|
192
|
+
fork_info,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
peak = self.full_node.blockchain.get_peak()
|
|
196
|
+
assert peak is not None
|
|
197
|
+
curr: BlockRecord = peak
|
|
198
|
+
while not curr.is_transaction_block:
|
|
199
|
+
curr = self.full_node.blockchain.block_record(curr.prev_hash)
|
|
200
|
+
current_time = self.use_current_time
|
|
201
|
+
time_per_block = self.time_per_block
|
|
202
|
+
assert curr.timestamp is not None
|
|
203
|
+
if int(time.time()) <= int(curr.timestamp):
|
|
204
|
+
if force_wait_for_timestamp:
|
|
205
|
+
await asyncio.sleep(1)
|
|
206
|
+
else:
|
|
207
|
+
current_time = False
|
|
208
|
+
mempool_bundle = await self.full_node.mempool_manager.create_bundle_from_mempool(
|
|
209
|
+
curr.header_hash, self.full_node.coin_store.get_unspent_lineage_info_for_puzzle_hash
|
|
210
|
+
)
|
|
211
|
+
if mempool_bundle is None:
|
|
212
|
+
spend_bundle = None
|
|
213
|
+
else:
|
|
214
|
+
spend_bundle = mempool_bundle[0]
|
|
215
|
+
|
|
216
|
+
current_blocks = await self.get_all_full_blocks()
|
|
217
|
+
target = request.puzzle_hash
|
|
218
|
+
more = self.bt.get_consecutive_blocks(
|
|
219
|
+
1,
|
|
220
|
+
time_per_block=time_per_block,
|
|
221
|
+
transaction_data=spend_bundle,
|
|
222
|
+
farmer_reward_puzzle_hash=target,
|
|
223
|
+
pool_reward_puzzle_hash=target,
|
|
224
|
+
block_list_input=current_blocks,
|
|
225
|
+
guarantee_transaction_block=True,
|
|
226
|
+
current_time=current_time,
|
|
227
|
+
)
|
|
228
|
+
await self.full_node.add_block(more[-1])
|
|
229
|
+
return more[-1]
|
|
230
|
+
|
|
231
|
+
async def farm_new_block(self, request: FarmNewBlockProtocol, force_wait_for_timestamp: bool = False):
|
|
232
|
+
ssi = self.full_node.constants.SUB_SLOT_ITERS_STARTING
|
|
233
|
+
diff = self.full_node.constants.DIFFICULTY_STARTING
|
|
234
|
+
async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
|
|
235
|
+
self.log.info("Farming new block!")
|
|
236
|
+
current_blocks = await self.get_all_full_blocks()
|
|
237
|
+
if len(current_blocks) == 0:
|
|
238
|
+
genesis = self.bt.get_consecutive_blocks(uint8(1))[0]
|
|
239
|
+
future = await pre_validate_block(
|
|
240
|
+
self.full_node.blockchain.constants,
|
|
241
|
+
AugmentedBlockchain(self.full_node.blockchain),
|
|
242
|
+
genesis,
|
|
243
|
+
self.full_node.blockchain.pool,
|
|
244
|
+
None,
|
|
245
|
+
ValidationState(ssi, diff, None),
|
|
246
|
+
)
|
|
247
|
+
pre_validation_result: PreValidationResult = await future
|
|
248
|
+
fork_info = ForkInfo(-1, -1, self.full_node.constants.GENESIS_CHALLENGE)
|
|
249
|
+
await self.full_node.blockchain.add_block(genesis, pre_validation_result, ssi, fork_info)
|
|
250
|
+
peak = self.full_node.blockchain.get_peak()
|
|
251
|
+
assert peak is not None
|
|
252
|
+
curr: BlockRecord = peak
|
|
253
|
+
while not curr.is_transaction_block:
|
|
254
|
+
curr = self.full_node.blockchain.block_record(curr.prev_hash)
|
|
255
|
+
current_time = self.use_current_time
|
|
256
|
+
time_per_block = self.time_per_block
|
|
257
|
+
assert curr.timestamp is not None
|
|
258
|
+
if int(time.time()) <= int(curr.timestamp):
|
|
259
|
+
if force_wait_for_timestamp:
|
|
260
|
+
await asyncio.sleep(1)
|
|
261
|
+
else:
|
|
262
|
+
current_time = False
|
|
263
|
+
mempool_bundle = await self.full_node.mempool_manager.create_bundle_from_mempool(
|
|
264
|
+
curr.header_hash, self.full_node.coin_store.get_unspent_lineage_info_for_puzzle_hash
|
|
265
|
+
)
|
|
266
|
+
if mempool_bundle is None:
|
|
267
|
+
spend_bundle = None
|
|
268
|
+
else:
|
|
269
|
+
spend_bundle = mempool_bundle[0]
|
|
270
|
+
current_blocks = await self.get_all_full_blocks()
|
|
271
|
+
target = request.puzzle_hash
|
|
272
|
+
more = self.bt.get_consecutive_blocks(
|
|
273
|
+
1,
|
|
274
|
+
transaction_data=spend_bundle,
|
|
275
|
+
farmer_reward_puzzle_hash=target,
|
|
276
|
+
pool_reward_puzzle_hash=target,
|
|
277
|
+
block_list_input=current_blocks,
|
|
278
|
+
current_time=current_time,
|
|
279
|
+
time_per_block=time_per_block,
|
|
280
|
+
)
|
|
281
|
+
await self.full_node.add_block(more[-1])
|
|
282
|
+
|
|
283
|
+
async def reorg_from_index_to_new_index(self, request: ReorgProtocol):
|
|
284
|
+
new_index = request.new_index
|
|
285
|
+
old_index = request.old_index
|
|
286
|
+
coinbase_ph = request.puzzle_hash
|
|
287
|
+
seed = request.seed
|
|
288
|
+
if seed is None:
|
|
289
|
+
seed = bytes32(32 * b"1")
|
|
290
|
+
|
|
291
|
+
current_blocks = await self.get_all_full_blocks()
|
|
292
|
+
block_count = new_index - old_index
|
|
293
|
+
|
|
294
|
+
more_blocks = self.bt.get_consecutive_blocks(
|
|
295
|
+
block_count,
|
|
296
|
+
farmer_reward_puzzle_hash=coinbase_ph,
|
|
297
|
+
pool_reward_puzzle_hash=coinbase_ph,
|
|
298
|
+
block_list_input=current_blocks[: old_index + 1],
|
|
299
|
+
force_overflow=True,
|
|
300
|
+
guarantee_transaction_block=True,
|
|
301
|
+
seed=seed,
|
|
302
|
+
)
|
|
303
|
+
await add_blocks_in_batches(more_blocks[old_index + 1 :], self.full_node)
|
|
304
|
+
|
|
305
|
+
async def farm_blocks_to_puzzlehash(
|
|
306
|
+
self,
|
|
307
|
+
count: int,
|
|
308
|
+
farm_to: bytes32 = bytes32.zeros,
|
|
309
|
+
guarantee_transaction_blocks: bool = False,
|
|
310
|
+
timeout: Union[_Default, float, None] = default,
|
|
311
|
+
_wait_for_synced: bool = True,
|
|
312
|
+
) -> int:
|
|
313
|
+
"""Process the requested number of blocks including farming to the passed puzzle
|
|
314
|
+
hash. Note that the rewards for the last block will not have been processed.
|
|
315
|
+
Consider `.farm_blocks_to_wallet()` or `.farm_rewards_to_wallet()` if the goal
|
|
316
|
+
is to receive XCH at an address.
|
|
317
|
+
|
|
318
|
+
Arguments:
|
|
319
|
+
count: The number of blocks to process.
|
|
320
|
+
farm_to: The puzzle hash to farm the block rewards to.
|
|
321
|
+
|
|
322
|
+
Returns:
|
|
323
|
+
The total number of reward mojos for the processed blocks.
|
|
324
|
+
"""
|
|
325
|
+
if isinstance(timeout, _Default):
|
|
326
|
+
timeout = count * timeout_per_block
|
|
327
|
+
timeout += 1
|
|
328
|
+
|
|
329
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
330
|
+
rewards = 0
|
|
331
|
+
|
|
332
|
+
if count == 0:
|
|
333
|
+
return rewards
|
|
334
|
+
|
|
335
|
+
for _ in range(count):
|
|
336
|
+
if guarantee_transaction_blocks:
|
|
337
|
+
await self.farm_new_transaction_block(FarmNewBlockProtocol(farm_to))
|
|
338
|
+
else:
|
|
339
|
+
await self.farm_new_block(FarmNewBlockProtocol(farm_to))
|
|
340
|
+
height = self.full_node.blockchain.get_peak_height()
|
|
341
|
+
assert height is not None
|
|
342
|
+
|
|
343
|
+
rewards += calculate_pool_reward(height) + calculate_base_farmer_reward(height)
|
|
344
|
+
|
|
345
|
+
if _wait_for_synced:
|
|
346
|
+
await self.wait_for_self_synced(timeout=None)
|
|
347
|
+
|
|
348
|
+
return rewards
|
|
349
|
+
|
|
350
|
+
async def farm_blocks_to_wallet(
|
|
351
|
+
self,
|
|
352
|
+
count: int,
|
|
353
|
+
wallet: Wallet,
|
|
354
|
+
timeout: Union[_Default, float, None] = default,
|
|
355
|
+
_wait_for_synced: bool = True,
|
|
356
|
+
) -> int:
|
|
357
|
+
"""Farm the requested number of blocks to the passed wallet. This will
|
|
358
|
+
process additional blocks as needed to process the reward transactions
|
|
359
|
+
and also wait for the rewards to be present in the wallet.
|
|
360
|
+
|
|
361
|
+
Arguments:
|
|
362
|
+
count: The number of blocks to farm.
|
|
363
|
+
wallet: The wallet to farm the block rewards to.
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
The total number of reward mojos farmed to the requested address.
|
|
367
|
+
"""
|
|
368
|
+
if isinstance(timeout, _Default):
|
|
369
|
+
timeout = (count + 1) * timeout_per_block
|
|
370
|
+
timeout += 15
|
|
371
|
+
|
|
372
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
373
|
+
if count == 0:
|
|
374
|
+
return 0
|
|
375
|
+
|
|
376
|
+
target_puzzlehash = await wallet.get_new_puzzlehash()
|
|
377
|
+
rewards = 0
|
|
378
|
+
|
|
379
|
+
block_reward_coins = set()
|
|
380
|
+
expected_reward_coin_count = 2 * count
|
|
381
|
+
|
|
382
|
+
original_peak_height = self.full_node.blockchain.get_peak_height()
|
|
383
|
+
expected_peak_height = 0 if original_peak_height is None else original_peak_height
|
|
384
|
+
extra_blocks = [[False, False]] if original_peak_height is None else [] # Farm genesis block first
|
|
385
|
+
|
|
386
|
+
for to_wallet, tx_block in [*extra_blocks, *([[True, False]] * (count - 1)), [True, True], [False, True]]:
|
|
387
|
+
# This complicated application of the last two blocks being transaction
|
|
388
|
+
# blocks is due to the transaction blocks only including rewards from
|
|
389
|
+
# blocks up until, and including, the previous transaction block.
|
|
390
|
+
if to_wallet:
|
|
391
|
+
rewards += await self.farm_blocks_to_puzzlehash(
|
|
392
|
+
count=1,
|
|
393
|
+
farm_to=target_puzzlehash,
|
|
394
|
+
guarantee_transaction_blocks=tx_block,
|
|
395
|
+
timeout=None,
|
|
396
|
+
_wait_for_synced=False,
|
|
397
|
+
)
|
|
398
|
+
else:
|
|
399
|
+
await self.farm_blocks_to_puzzlehash(
|
|
400
|
+
count=1, guarantee_transaction_blocks=tx_block, timeout=None, _wait_for_synced=False
|
|
401
|
+
)
|
|
402
|
+
|
|
403
|
+
expected_peak_height += 1
|
|
404
|
+
peak_height = self.full_node.blockchain.get_peak_height()
|
|
405
|
+
assert peak_height == expected_peak_height
|
|
406
|
+
|
|
407
|
+
coin_records = await self.full_node.coin_store.get_coins_added_at_height(height=peak_height)
|
|
408
|
+
for record in coin_records:
|
|
409
|
+
if record.coin.puzzle_hash == target_puzzlehash and record.coinbase:
|
|
410
|
+
block_reward_coins.add(record.coin)
|
|
411
|
+
|
|
412
|
+
if len(block_reward_coins) != expected_reward_coin_count:
|
|
413
|
+
raise RuntimeError(
|
|
414
|
+
f"Expected {expected_reward_coin_count} reward coins, got: {len(block_reward_coins)}"
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
await wait_for_coins_in_wallet(coins=block_reward_coins, wallet=wallet, timeout=None)
|
|
418
|
+
if _wait_for_synced:
|
|
419
|
+
await self.wait_for_wallet_synced(wallet.wallet_state_manager.wallet_node, timeout=None)
|
|
420
|
+
return rewards
|
|
421
|
+
|
|
422
|
+
async def farm_rewards_to_wallet(
|
|
423
|
+
self,
|
|
424
|
+
amount: int,
|
|
425
|
+
wallet: Wallet,
|
|
426
|
+
timeout: Union[_Default, float, None] = default,
|
|
427
|
+
) -> int:
|
|
428
|
+
"""Farm at least the requested amount of mojos to the passed wallet. Extra
|
|
429
|
+
mojos will be received based on the block rewards at the present block height.
|
|
430
|
+
The rewards will be present in the wall before returning.
|
|
431
|
+
|
|
432
|
+
Arguments:
|
|
433
|
+
amount: The minimum number of mojos to farm.
|
|
434
|
+
wallet: The wallet to farm the block rewards to.
|
|
435
|
+
|
|
436
|
+
Returns:
|
|
437
|
+
The total number of reward mojos farmed to the requested wallet.
|
|
438
|
+
"""
|
|
439
|
+
rewards = 0
|
|
440
|
+
|
|
441
|
+
if amount == 0:
|
|
442
|
+
return rewards
|
|
443
|
+
|
|
444
|
+
height_before: Optional[uint32] = self.full_node.blockchain.get_peak_height()
|
|
445
|
+
if height_before is None:
|
|
446
|
+
height_before = uint32(0)
|
|
447
|
+
|
|
448
|
+
for count in itertools.count(1):
|
|
449
|
+
height = uint32(height_before + count)
|
|
450
|
+
rewards += calculate_pool_reward(height) + calculate_base_farmer_reward(height)
|
|
451
|
+
|
|
452
|
+
if rewards >= amount:
|
|
453
|
+
break
|
|
454
|
+
else:
|
|
455
|
+
raise Exception("internal error")
|
|
456
|
+
|
|
457
|
+
if isinstance(timeout, _Default):
|
|
458
|
+
timeout = (count + 1) * timeout_per_block
|
|
459
|
+
|
|
460
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
461
|
+
await self.farm_blocks_to_wallet(count=count, wallet=wallet, timeout=None)
|
|
462
|
+
return rewards
|
|
463
|
+
|
|
464
|
+
async def wait_transaction_records_entered_mempool(
|
|
465
|
+
self,
|
|
466
|
+
records: Collection[Union[TransactionRecord, LightTransactionRecord]],
|
|
467
|
+
timeout: Union[float, None] = 5,
|
|
468
|
+
) -> None:
|
|
469
|
+
"""Wait until the transaction records have entered the mempool. Transaction
|
|
470
|
+
records with no spend bundle are ignored.
|
|
471
|
+
|
|
472
|
+
Arguments:
|
|
473
|
+
records: The transaction records to wait for.
|
|
474
|
+
"""
|
|
475
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
476
|
+
ids_to_check: set[bytes32] = set()
|
|
477
|
+
for record in records:
|
|
478
|
+
if record.spend_bundle is None:
|
|
479
|
+
continue
|
|
480
|
+
|
|
481
|
+
ids_to_check.add(record.spend_bundle.name())
|
|
482
|
+
|
|
483
|
+
for backoff in backoff_times():
|
|
484
|
+
found = set()
|
|
485
|
+
for spend_bundle_name in ids_to_check:
|
|
486
|
+
tx = self.full_node.mempool_manager.get_spendbundle(spend_bundle_name)
|
|
487
|
+
if tx is not None:
|
|
488
|
+
found.add(spend_bundle_name)
|
|
489
|
+
ids_to_check = ids_to_check.difference(found)
|
|
490
|
+
|
|
491
|
+
if len(ids_to_check) == 0:
|
|
492
|
+
return
|
|
493
|
+
|
|
494
|
+
await asyncio.sleep(backoff)
|
|
495
|
+
|
|
496
|
+
async def wait_bundle_ids_in_mempool(
|
|
497
|
+
self,
|
|
498
|
+
bundle_ids: Collection[bytes32],
|
|
499
|
+
timeout: Union[float, None] = 5,
|
|
500
|
+
) -> None:
|
|
501
|
+
"""Wait until the ids of specific spend bundles have entered the mempool.
|
|
502
|
+
|
|
503
|
+
Arguments:
|
|
504
|
+
records: The bundle ids to wait for.
|
|
505
|
+
"""
|
|
506
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
507
|
+
ids_to_check: set[bytes32] = set(bundle_ids)
|
|
508
|
+
|
|
509
|
+
for backoff in backoff_times():
|
|
510
|
+
found = set()
|
|
511
|
+
for spend_bundle_name in ids_to_check:
|
|
512
|
+
tx = self.full_node.mempool_manager.get_spendbundle(spend_bundle_name)
|
|
513
|
+
if tx is not None:
|
|
514
|
+
found.add(spend_bundle_name)
|
|
515
|
+
ids_to_check = ids_to_check.difference(found)
|
|
516
|
+
|
|
517
|
+
if len(ids_to_check) == 0:
|
|
518
|
+
return
|
|
519
|
+
|
|
520
|
+
await asyncio.sleep(backoff)
|
|
521
|
+
|
|
522
|
+
async def wait_transaction_records_marked_as_in_mempool(
|
|
523
|
+
self,
|
|
524
|
+
record_ids: Collection[bytes32],
|
|
525
|
+
wallet_node: WalletNode,
|
|
526
|
+
timeout: Union[float, None] = 10,
|
|
527
|
+
) -> None:
|
|
528
|
+
"""Wait until the transaction records have been marked that they have made it into the mempool. Transaction
|
|
529
|
+
records with no spend bundle are ignored.
|
|
530
|
+
|
|
531
|
+
Arguments:
|
|
532
|
+
records: The transaction records to wait for.
|
|
533
|
+
"""
|
|
534
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
535
|
+
ids_to_check: set[bytes32] = set(record_ids)
|
|
536
|
+
|
|
537
|
+
for backoff in backoff_times():
|
|
538
|
+
found = set()
|
|
539
|
+
for txid in ids_to_check:
|
|
540
|
+
tx = await wallet_node.wallet_state_manager.tx_store.get_transaction_record(txid)
|
|
541
|
+
if tx is not None and (tx.is_in_mempool() or tx.spend_bundle is None):
|
|
542
|
+
found.add(txid)
|
|
543
|
+
ids_to_check = ids_to_check.difference(found)
|
|
544
|
+
|
|
545
|
+
if len(ids_to_check) == 0:
|
|
546
|
+
return
|
|
547
|
+
|
|
548
|
+
await asyncio.sleep(backoff)
|
|
549
|
+
|
|
550
|
+
async def process_transaction_records(
|
|
551
|
+
self,
|
|
552
|
+
records: Collection[TransactionRecord],
|
|
553
|
+
timeout: Union[float, None] = (2 * timeout_per_block) + 5,
|
|
554
|
+
) -> None:
|
|
555
|
+
"""Process the specified transaction records and wait until they have been
|
|
556
|
+
included in a block.
|
|
557
|
+
|
|
558
|
+
Arguments:
|
|
559
|
+
records: The transaction records to process.
|
|
560
|
+
"""
|
|
561
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
562
|
+
await self.wait_for_self_synced(timeout=None)
|
|
563
|
+
|
|
564
|
+
coins_to_wait_for: set[Coin] = set()
|
|
565
|
+
for record in records:
|
|
566
|
+
if record.spend_bundle is None:
|
|
567
|
+
continue
|
|
568
|
+
|
|
569
|
+
coins_to_wait_for.update(record.spend_bundle.additions())
|
|
570
|
+
|
|
571
|
+
await self.wait_transaction_records_entered_mempool(records=records, timeout=None)
|
|
572
|
+
|
|
573
|
+
return await self.process_coin_spends(coins=coins_to_wait_for, timeout=None)
|
|
574
|
+
|
|
575
|
+
async def process_spend_bundles(
|
|
576
|
+
self,
|
|
577
|
+
bundles: Collection[SpendBundle],
|
|
578
|
+
timeout: Union[float, None] = (2 * timeout_per_block) + 5,
|
|
579
|
+
) -> None:
|
|
580
|
+
"""Process the specified spend bundles and wait until they have been included
|
|
581
|
+
in a block.
|
|
582
|
+
|
|
583
|
+
Arguments:
|
|
584
|
+
bundles: The spend bundles to process.
|
|
585
|
+
"""
|
|
586
|
+
|
|
587
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
588
|
+
coins_to_wait_for: set[Coin] = {addition for bundle in bundles for addition in bundle.additions()}
|
|
589
|
+
return await self.process_coin_spends(coins=coins_to_wait_for, timeout=None)
|
|
590
|
+
|
|
591
|
+
async def process_coin_spends(
|
|
592
|
+
self,
|
|
593
|
+
coins: Collection[Coin],
|
|
594
|
+
timeout: Union[float, None] = (2 * timeout_per_block) + 5,
|
|
595
|
+
) -> None:
|
|
596
|
+
"""Process the specified coin names and wait until they have been created in a
|
|
597
|
+
block.
|
|
598
|
+
|
|
599
|
+
Arguments:
|
|
600
|
+
coin_names: The coin names to process.
|
|
601
|
+
"""
|
|
602
|
+
|
|
603
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
604
|
+
coin_set = set(coins)
|
|
605
|
+
coin_store = self.full_node.coin_store
|
|
606
|
+
|
|
607
|
+
while True:
|
|
608
|
+
await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True, timeout=None)
|
|
609
|
+
|
|
610
|
+
found: set[Coin] = set()
|
|
611
|
+
for coin in coin_set:
|
|
612
|
+
# TODO: is this the proper check?
|
|
613
|
+
if await coin_store.get_coin_record(coin.name()) is not None:
|
|
614
|
+
found.add(coin)
|
|
615
|
+
|
|
616
|
+
coin_set = coin_set.difference(found)
|
|
617
|
+
|
|
618
|
+
if len(coin_set) == 0:
|
|
619
|
+
return
|
|
620
|
+
|
|
621
|
+
async def process_all_wallet_transactions(self, wallet: Wallet, timeout: Optional[float] = 5) -> None:
|
|
622
|
+
# TODO: Maybe something could be done around waiting for the tx to enter the
|
|
623
|
+
# mempool. Maybe not, might be too many races or such.
|
|
624
|
+
wallet_state_manager: Optional[WalletStateManager] = wallet.wallet_state_manager
|
|
625
|
+
assert wallet_state_manager is not None
|
|
626
|
+
|
|
627
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
628
|
+
for backoff in backoff_times():
|
|
629
|
+
await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True, timeout=None)
|
|
630
|
+
|
|
631
|
+
wallet_ids = wallet_state_manager.wallets.keys()
|
|
632
|
+
for wallet_id in wallet_ids:
|
|
633
|
+
unconfirmed = await wallet_state_manager.tx_store.get_unconfirmed_for_wallet(wallet_id=wallet_id)
|
|
634
|
+
if len(unconfirmed) > 0:
|
|
635
|
+
break
|
|
636
|
+
else:
|
|
637
|
+
# all wallets have zero unconfirmed transactions
|
|
638
|
+
break
|
|
639
|
+
|
|
640
|
+
# at least one wallet has unconfirmed transactions
|
|
641
|
+
await asyncio.sleep(backoff)
|
|
642
|
+
|
|
643
|
+
async def check_transactions_confirmed(
|
|
644
|
+
self,
|
|
645
|
+
wallet_state_manager: WalletStateManager,
|
|
646
|
+
transactions: Union[list[TransactionRecord], list[LightTransactionRecord]],
|
|
647
|
+
timeout: Optional[float] = 5,
|
|
648
|
+
) -> None:
|
|
649
|
+
transactions_left: set[bytes32] = {tx.name for tx in transactions}
|
|
650
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
651
|
+
for backoff in backoff_times():
|
|
652
|
+
transactions_left &= {tx.name for tx in await wallet_state_manager.tx_store.get_all_unconfirmed()}
|
|
653
|
+
if len(transactions_left) == 0:
|
|
654
|
+
break
|
|
655
|
+
|
|
656
|
+
# at least one wallet has unconfirmed transactions
|
|
657
|
+
await asyncio.sleep(backoff) # pragma: no cover
|
|
658
|
+
|
|
659
|
+
async def create_coins_with_amounts(
|
|
660
|
+
self,
|
|
661
|
+
amounts: list[uint64],
|
|
662
|
+
wallet: Wallet,
|
|
663
|
+
per_transaction_record_group: int = 50,
|
|
664
|
+
timeout: Union[float, None] = 15,
|
|
665
|
+
) -> set[Coin]:
|
|
666
|
+
"""Create coins with the requested amount. This is useful when you need a
|
|
667
|
+
bunch of coins for a test and don't need to farm that many.
|
|
668
|
+
|
|
669
|
+
Arguments:
|
|
670
|
+
amounts: A list with entries of mojo amounts corresponding to each
|
|
671
|
+
coin to create.
|
|
672
|
+
wallet: The wallet to send the new coins to.
|
|
673
|
+
per_transaction_record_group: The maximum number of coins to create in each
|
|
674
|
+
transaction record.
|
|
675
|
+
|
|
676
|
+
Returns:
|
|
677
|
+
A set of the generated coins. Note that this does not include any change
|
|
678
|
+
coins that were created.
|
|
679
|
+
"""
|
|
680
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
681
|
+
invalid_amounts = [amount for amount in amounts if amount <= 0]
|
|
682
|
+
if len(invalid_amounts) > 0:
|
|
683
|
+
invalid_amounts_string = ", ".join(str(amount) for amount in invalid_amounts)
|
|
684
|
+
raise Exception(f"Coins must have a positive value, request included: {invalid_amounts_string}")
|
|
685
|
+
|
|
686
|
+
if len(amounts) == 0:
|
|
687
|
+
return set()
|
|
688
|
+
|
|
689
|
+
outputs: list[Payment] = []
|
|
690
|
+
amounts_seen: set[uint64] = set()
|
|
691
|
+
for amount in amounts:
|
|
692
|
+
# We need unique puzzle hash amount combos so we'll only generate a new puzzle hash when we've already
|
|
693
|
+
# seen that amount sent to that puzzle hash
|
|
694
|
+
puzzle_hash = await wallet.get_puzzle_hash(new=amount in amounts_seen)
|
|
695
|
+
outputs.append(Payment(puzzle_hash, amount))
|
|
696
|
+
amounts_seen.add(amount)
|
|
697
|
+
|
|
698
|
+
transaction_records: list[TransactionRecord] = []
|
|
699
|
+
outputs_iterator = iter(outputs)
|
|
700
|
+
while True:
|
|
701
|
+
# The outputs iterator must be second in the zip() call otherwise we lose
|
|
702
|
+
# an element when reaching the end of the range object.
|
|
703
|
+
outputs_group = [output for _, output in zip(range(per_transaction_record_group), outputs_iterator)]
|
|
704
|
+
|
|
705
|
+
if len(outputs_group) > 0:
|
|
706
|
+
async with wallet.wallet_state_manager.new_action_scope(
|
|
707
|
+
DEFAULT_TX_CONFIG, push=True
|
|
708
|
+
) as action_scope:
|
|
709
|
+
await wallet.generate_signed_transaction(
|
|
710
|
+
amount=outputs_group[0].amount,
|
|
711
|
+
puzzle_hash=outputs_group[0].puzzle_hash,
|
|
712
|
+
action_scope=action_scope,
|
|
713
|
+
primaries=outputs_group[1:],
|
|
714
|
+
)
|
|
715
|
+
transaction_records.extend(action_scope.side_effects.transactions)
|
|
716
|
+
else:
|
|
717
|
+
break
|
|
718
|
+
|
|
719
|
+
await self.wait_transaction_records_entered_mempool(transaction_records, timeout=None)
|
|
720
|
+
await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True)
|
|
721
|
+
|
|
722
|
+
output_coins = {coin for transaction_record in transaction_records for coin in transaction_record.additions}
|
|
723
|
+
puzzle_hashes = {output.puzzle_hash for output in outputs}
|
|
724
|
+
change_coins = {coin for coin in output_coins if coin.puzzle_hash not in puzzle_hashes}
|
|
725
|
+
coins_to_receive = output_coins - change_coins
|
|
726
|
+
await wait_for_coins_in_wallet(coins=coins_to_receive, wallet=wallet)
|
|
727
|
+
|
|
728
|
+
return coins_to_receive
|
|
729
|
+
|
|
730
|
+
def tx_id_in_mempool(self, tx_id: bytes32) -> bool:
|
|
731
|
+
spendbundle = self.full_node.mempool_manager.get_spendbundle(bundle_hash=tx_id)
|
|
732
|
+
return spendbundle is not None
|
|
733
|
+
|
|
734
|
+
def txs_in_mempool(self, txs: list[TransactionRecord]) -> bool:
|
|
735
|
+
return all(self.tx_id_in_mempool(tx_id=tx.spend_bundle.name()) for tx in txs if tx.spend_bundle is not None)
|
|
736
|
+
|
|
737
|
+
async def self_is_synced(self) -> bool:
|
|
738
|
+
return await self.full_node.synced()
|
|
739
|
+
|
|
740
|
+
async def wallet_is_synced(self, wallet_node: WalletNode, peak_height: Optional[uint32] = None) -> bool:
|
|
741
|
+
if not await self.self_is_synced():
|
|
742
|
+
# Depending on races, may not be covered every time
|
|
743
|
+
return False # pragma: no cover
|
|
744
|
+
if not await wallet_node.wallet_state_manager.synced():
|
|
745
|
+
return False
|
|
746
|
+
all_states_retried = await wallet_node.wallet_state_manager.retry_store.get_all_states_to_retry() == []
|
|
747
|
+
wallet_height = await wallet_node.wallet_state_manager.blockchain.get_finished_sync_up_to()
|
|
748
|
+
if peak_height is not None:
|
|
749
|
+
return wallet_height >= peak_height and all_states_retried
|
|
750
|
+
full_node_height = self.full_node.blockchain.get_peak_height()
|
|
751
|
+
return wallet_height == full_node_height and all_states_retried
|
|
752
|
+
|
|
753
|
+
async def wait_for_wallet_synced(
|
|
754
|
+
self,
|
|
755
|
+
wallet_node: WalletNode,
|
|
756
|
+
timeout: Optional[float] = 5,
|
|
757
|
+
peak_height: Optional[uint32] = None,
|
|
758
|
+
) -> None:
|
|
759
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
760
|
+
for backoff_time in backoff_times():
|
|
761
|
+
if await self.wallet_is_synced(wallet_node=wallet_node, peak_height=peak_height):
|
|
762
|
+
break
|
|
763
|
+
await asyncio.sleep(backoff_time)
|
|
764
|
+
|
|
765
|
+
async def wallets_are_synced(self, wallet_nodes: list[WalletNode], peak_height: Optional[uint32] = None) -> bool:
|
|
766
|
+
return all(
|
|
767
|
+
[
|
|
768
|
+
await self.wallet_is_synced(wallet_node=wallet_node, peak_height=peak_height)
|
|
769
|
+
for wallet_node in wallet_nodes
|
|
770
|
+
]
|
|
771
|
+
)
|
|
772
|
+
|
|
773
|
+
async def wait_for_wallets_synced(
|
|
774
|
+
self,
|
|
775
|
+
wallet_nodes: list[WalletNode],
|
|
776
|
+
timeout: Optional[float] = 5,
|
|
777
|
+
peak_height: Optional[uint32] = None,
|
|
778
|
+
) -> None:
|
|
779
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
780
|
+
for backoff_time in backoff_times():
|
|
781
|
+
if await self.wallets_are_synced(wallet_nodes=wallet_nodes, peak_height=peak_height):
|
|
782
|
+
break
|
|
783
|
+
await asyncio.sleep(backoff_time)
|
|
784
|
+
|
|
785
|
+
async def wait_for_self_synced(
|
|
786
|
+
self,
|
|
787
|
+
timeout: Optional[float] = 5,
|
|
788
|
+
) -> None:
|
|
789
|
+
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
790
|
+
for backoff_time in backoff_times():
|
|
791
|
+
if await self.self_is_synced():
|
|
792
|
+
break
|
|
793
|
+
# Depending on races, may not be covered every time
|
|
794
|
+
await asyncio.sleep(backoff_time) # pragma: no cover
|