chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any, Callable,
|
|
4
|
+
from typing import Any, Callable, Optional, TypeVar, cast, get_args, get_origin
|
|
5
5
|
|
|
6
6
|
from chia_rs import G1Element, G2Element
|
|
7
7
|
from clvm_tools import binutils
|
|
@@ -35,12 +35,12 @@ ANYONE_CAN_SPEND_WITH_PADDING_PUZZLE_HASH = Program.to(binutils.assemble("(a (q
|
|
|
35
35
|
|
|
36
36
|
POOL_REWARD_PREFIX_MAINNET = bytes32.fromhex("ccd5bb71183532bff220ba46c268991a00000000000000000000000000000000")
|
|
37
37
|
|
|
38
|
-
MAX_BLOCK_COST_CLVM =
|
|
38
|
+
MAX_BLOCK_COST_CLVM = 10**18
|
|
39
39
|
|
|
40
40
|
T = TypeVar("T")
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def satisfies_hint(obj: T, type_hint:
|
|
43
|
+
def satisfies_hint(obj: T, type_hint: type[T]) -> bool:
|
|
44
44
|
"""
|
|
45
45
|
Check if an object satisfies a type hint.
|
|
46
46
|
This is a simplified version of `isinstance` that also handles generic types.
|
|
@@ -56,7 +56,7 @@ def satisfies_hint(obj: T, type_hint: Type[T]) -> bool:
|
|
|
56
56
|
if not isinstance(obj, origin):
|
|
57
57
|
return False
|
|
58
58
|
if len(args) > 0:
|
|
59
|
-
#
|
|
59
|
+
# tuple[T, ...] gets handled just like list[T]
|
|
60
60
|
if origin is list or (origin is tuple and args[-1] is Ellipsis):
|
|
61
61
|
object_hint_pairs.extend((item, args[0]) for item in obj)
|
|
62
62
|
elif origin is tuple:
|
|
@@ -75,7 +75,7 @@ def satisfies_hint(obj: T, type_hint: Type[T]) -> bool:
|
|
|
75
75
|
|
|
76
76
|
class PuzzleDB:
|
|
77
77
|
def __init__(self) -> None:
|
|
78
|
-
self._db:
|
|
78
|
+
self._db: dict[bytes32, Program] = {}
|
|
79
79
|
|
|
80
80
|
def add_puzzle(self, puzzle: Program) -> None:
|
|
81
81
|
self._db[puzzle.get_tree_hash()] = Program.from_bytes(bytes(puzzle))
|
|
@@ -84,7 +84,7 @@ class PuzzleDB:
|
|
|
84
84
|
return self._db.get(puzzle_hash)
|
|
85
85
|
|
|
86
86
|
|
|
87
|
-
def from_kwargs(kwargs:
|
|
87
|
+
def from_kwargs(kwargs: dict[str, Any], key: str, type_info: type[T]) -> T:
|
|
88
88
|
"""Raise an exception if `kwargs[key]` is missing or the wrong type"""
|
|
89
89
|
if key not in kwargs:
|
|
90
90
|
raise ValueError(f"`{key}` missing in call to `solve`")
|
|
@@ -93,7 +93,7 @@ def from_kwargs(kwargs: Dict[str, Any], key: str, type_info: Type[T]) -> T:
|
|
|
93
93
|
return cast(T, kwargs[key])
|
|
94
94
|
|
|
95
95
|
|
|
96
|
-
Solver_F = Callable[["Solver", PuzzleDB,
|
|
96
|
+
Solver_F = Callable[["Solver", PuzzleDB, list[Program], Any], Program]
|
|
97
97
|
|
|
98
98
|
|
|
99
99
|
class Solver:
|
|
@@ -102,14 +102,14 @@ class Solver:
|
|
|
102
102
|
"""
|
|
103
103
|
|
|
104
104
|
def __init__(self) -> None:
|
|
105
|
-
self.solvers_by_puzzle_hash:
|
|
105
|
+
self.solvers_by_puzzle_hash: dict[bytes32, Solver_F] = {}
|
|
106
106
|
|
|
107
107
|
def register_solver(self, puzzle_hash: bytes32, solver_f: Solver_F) -> None:
|
|
108
108
|
if puzzle_hash in self.solvers_by_puzzle_hash:
|
|
109
109
|
raise ValueError(f"solver registered for {puzzle_hash}")
|
|
110
110
|
self.solvers_by_puzzle_hash[puzzle_hash] = solver_f
|
|
111
111
|
|
|
112
|
-
def solve(self, puzzle_db: PuzzleDB, puzzle: Program, **kwargs:
|
|
112
|
+
def solve(self, puzzle_db: PuzzleDB, puzzle: Program, **kwargs: dict[str, Any]) -> Program:
|
|
113
113
|
"""
|
|
114
114
|
The legal values and types for `kwargs` depends on the underlying solver
|
|
115
115
|
that's invoked. The `kwargs` are passed through to any inner solvers
|
|
@@ -128,34 +128,34 @@ class Solver:
|
|
|
128
128
|
raise ValueError("can't solve")
|
|
129
129
|
|
|
130
130
|
|
|
131
|
-
def solve_launcher(solver: Solver, puzzle_db: PuzzleDB, args:
|
|
131
|
+
def solve_launcher(solver: Solver, puzzle_db: PuzzleDB, args: list[Program], kwargs: dict[str, Any]) -> Program:
|
|
132
132
|
launcher_amount = from_kwargs(kwargs, "launcher_amount", uint64)
|
|
133
133
|
destination_puzzle_hash = from_kwargs(kwargs, "destination_puzzle_hash", bytes32)
|
|
134
|
-
metadata = from_kwargs(kwargs, "metadata",
|
|
134
|
+
metadata = from_kwargs(kwargs, "metadata", list[tuple[str, str]])
|
|
135
135
|
solution = Program.to([destination_puzzle_hash, launcher_amount, metadata])
|
|
136
136
|
return solution
|
|
137
137
|
|
|
138
138
|
|
|
139
|
-
def solve_anyone_can_spend(solver: Solver, puzzle_db: PuzzleDB, args:
|
|
139
|
+
def solve_anyone_can_spend(solver: Solver, puzzle_db: PuzzleDB, args: list[Program], kwargs: dict[str, Any]) -> Program:
|
|
140
140
|
"""
|
|
141
141
|
This is the anyone-can-spend puzzle `1`. Note that farmers can easily steal this coin, so don't use
|
|
142
142
|
it except for testing.
|
|
143
143
|
"""
|
|
144
|
-
conditions = from_kwargs(kwargs, "conditions",
|
|
144
|
+
conditions = from_kwargs(kwargs, "conditions", list[Program])
|
|
145
145
|
solution = Program.to(conditions)
|
|
146
146
|
return solution
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
def solve_anyone_can_spend_with_padding(
|
|
150
|
-
solver: Solver, puzzle_db: PuzzleDB, args:
|
|
150
|
+
solver: Solver, puzzle_db: PuzzleDB, args: list[Program], kwargs: dict[str, Any]
|
|
151
151
|
) -> Program:
|
|
152
152
|
"""This is the puzzle `(a (q . 1) 3)`. It's only for testing."""
|
|
153
|
-
conditions = from_kwargs(kwargs, "conditions",
|
|
153
|
+
conditions = from_kwargs(kwargs, "conditions", list[Program])
|
|
154
154
|
solution = Program.to((0, conditions))
|
|
155
155
|
return solution
|
|
156
156
|
|
|
157
157
|
|
|
158
|
-
def solve_singleton(solver: Solver, puzzle_db: PuzzleDB, args:
|
|
158
|
+
def solve_singleton(solver: Solver, puzzle_db: PuzzleDB, args: list[Program], kwargs: dict[str, Any]) -> Program:
|
|
159
159
|
"""
|
|
160
160
|
`lineage_proof`: a `Program` that proves the parent is also a singleton (or the launcher).
|
|
161
161
|
`coin_amount`: a necessarily-odd value of mojos in this coin.
|
|
@@ -168,7 +168,7 @@ def solve_singleton(solver: Solver, puzzle_db: PuzzleDB, args: List[Program], kw
|
|
|
168
168
|
return solution
|
|
169
169
|
|
|
170
170
|
|
|
171
|
-
def solve_pool_member(solver: Solver, puzzle_db: PuzzleDB, args:
|
|
171
|
+
def solve_pool_member(solver: Solver, puzzle_db: PuzzleDB, args: list[Program], kwargs: dict[str, Any]) -> Program:
|
|
172
172
|
pool_member_spend_type = from_kwargs(kwargs, "pool_member_spend_type", str)
|
|
173
173
|
allowable = ["to-waiting-room", "claim-p2-nft"]
|
|
174
174
|
if pool_member_spend_type not in allowable:
|
|
@@ -185,7 +185,7 @@ def solve_pool_member(solver: Solver, puzzle_db: PuzzleDB, args: List[Program],
|
|
|
185
185
|
|
|
186
186
|
|
|
187
187
|
def solve_pool_waiting_room(
|
|
188
|
-
solver: Solver, puzzle_db: PuzzleDB, args:
|
|
188
|
+
solver: Solver, puzzle_db: PuzzleDB, args: list[Program], kwargs: dict[str, Any]
|
|
189
189
|
) -> Program:
|
|
190
190
|
pool_leaving_spend_type = from_kwargs(kwargs, "pool_leaving_spend_type", str)
|
|
191
191
|
allowable = ["exit-waiting-room", "claim-p2-nft"]
|
|
@@ -193,7 +193,7 @@ def solve_pool_waiting_room(
|
|
|
193
193
|
raise ValueError(f"`pool_leaving_spend_type` must be one of {'/'.join(allowable)} for POOL_MEMBER puzzle")
|
|
194
194
|
exit_waiting_room = pool_leaving_spend_type == "exit-waiting-room"
|
|
195
195
|
if exit_waiting_room:
|
|
196
|
-
key_value_list = from_kwargs(kwargs, "key_value_list",
|
|
196
|
+
key_value_list = from_kwargs(kwargs, "key_value_list", list[tuple[str, str]])
|
|
197
197
|
destination_puzzle_hash = from_kwargs(kwargs, "destination_puzzle_hash", bytes32)
|
|
198
198
|
return Program.to([0, 1, key_value_list, destination_puzzle_hash])
|
|
199
199
|
# it's an "absorb_pool_reward" type
|
|
@@ -203,7 +203,7 @@ def solve_pool_waiting_room(
|
|
|
203
203
|
return solution
|
|
204
204
|
|
|
205
205
|
|
|
206
|
-
def solve_p2_singleton(solver: Solver, puzzle_db: PuzzleDB, args:
|
|
206
|
+
def solve_p2_singleton(solver: Solver, puzzle_db: PuzzleDB, args: list[Program], kwargs: dict[str, Any]) -> Program:
|
|
207
207
|
p2_singleton_spend_type = from_kwargs(kwargs, "p2_singleton_spend_type", str)
|
|
208
208
|
allowable = ["claim-p2-nft", "delayed-spend"]
|
|
209
209
|
if p2_singleton_spend_type not in allowable:
|
|
@@ -211,7 +211,7 @@ def solve_p2_singleton(solver: Solver, puzzle_db: PuzzleDB, args: List[Program],
|
|
|
211
211
|
claim_p2_nft = p2_singleton_spend_type == "claim-p2-nft"
|
|
212
212
|
if claim_p2_nft:
|
|
213
213
|
singleton_inner_puzzle_hash = from_kwargs(kwargs, "singleton_inner_puzzle_hash", bytes32)
|
|
214
|
-
p2_singleton_coin_name = from_kwargs(kwargs, "p2_singleton_coin_name",
|
|
214
|
+
p2_singleton_coin_name = from_kwargs(kwargs, "p2_singleton_coin_name", bytes32)
|
|
215
215
|
solution = Program.to([singleton_inner_puzzle_hash, p2_singleton_coin_name])
|
|
216
216
|
return solution
|
|
217
217
|
raise ValueError("can't solve `delayed-spend` yet")
|
|
@@ -261,7 +261,7 @@ class SingletonWallet:
|
|
|
261
261
|
)
|
|
262
262
|
return make_spend(coin, puzzle_reveal, solution)
|
|
263
263
|
|
|
264
|
-
def update_state(self, puzzle_db: PuzzleDB, removals:
|
|
264
|
+
def update_state(self, puzzle_db: PuzzleDB, removals: list[CoinSpend]) -> int:
|
|
265
265
|
state_change_count = 0
|
|
266
266
|
current_coin_name = self.current_state.name()
|
|
267
267
|
for coin_spend in removals:
|
|
@@ -303,9 +303,9 @@ def launcher_conditions_and_spend_bundle(
|
|
|
303
303
|
parent_coin_id: bytes32,
|
|
304
304
|
launcher_amount: uint64,
|
|
305
305
|
initial_singleton_inner_puzzle: Program,
|
|
306
|
-
metadata:
|
|
306
|
+
metadata: list[tuple[str, str]],
|
|
307
307
|
launcher_puzzle: Program,
|
|
308
|
-
) ->
|
|
308
|
+
) -> tuple[bytes32, list[Program], WalletSpendBundle]:
|
|
309
309
|
puzzle_db.add_puzzle(launcher_puzzle)
|
|
310
310
|
launcher_puzzle_hash = launcher_puzzle.get_tree_hash()
|
|
311
311
|
launcher_coin = Coin(parent_coin_id, launcher_puzzle_hash, launcher_amount)
|
|
@@ -374,7 +374,7 @@ def p2_singleton_puzzle_hash_for_launcher(
|
|
|
374
374
|
|
|
375
375
|
def claim_p2_singleton(
|
|
376
376
|
puzzle_db: PuzzleDB, singleton_wallet: SingletonWallet, p2_singleton_coin: Coin
|
|
377
|
-
) ->
|
|
377
|
+
) -> tuple[CoinSpend, list[Program]]:
|
|
378
378
|
inner_puzzle = singleton_wallet.inner_puzzle(puzzle_db)
|
|
379
379
|
assert inner_puzzle
|
|
380
380
|
inner_puzzle_hash = inner_puzzle.get_tree_hash()
|
|
@@ -432,7 +432,7 @@ def assert_coin_spent(coin_store: CoinStore, coin: Coin, is_spent: bool = True)
|
|
|
432
432
|
|
|
433
433
|
def spend_coin_to_singleton(
|
|
434
434
|
puzzle_db: PuzzleDB, launcher_puzzle: Program, coin_store: CoinStore, now: CoinTimestamp
|
|
435
|
-
) ->
|
|
435
|
+
) -> tuple[list[Coin], list[CoinSpend]]:
|
|
436
436
|
farmed_coin_amount = 100000
|
|
437
437
|
metadata = [("foo", "bar")]
|
|
438
438
|
|
|
@@ -468,7 +468,7 @@ def spend_coin_to_singleton(
|
|
|
468
468
|
return additions, removals
|
|
469
469
|
|
|
470
470
|
|
|
471
|
-
def find_interesting_singletons(removals:
|
|
471
|
+
def find_interesting_singletons(removals: list[CoinSpend]) -> list[SingletonWallet]:
|
|
472
472
|
singletons = []
|
|
473
473
|
for coin_spend in removals:
|
|
474
474
|
if coin_spend.coin.puzzle_hash == LAUNCHER_PUZZLE_HASH:
|
|
@@ -484,7 +484,7 @@ def find_interesting_singletons(removals: List[CoinSpend]) -> List[SingletonWall
|
|
|
484
484
|
return singletons
|
|
485
485
|
|
|
486
486
|
|
|
487
|
-
def filter_p2_singleton(puzzle_db: PuzzleDB, additions:
|
|
487
|
+
def filter_p2_singleton(puzzle_db: PuzzleDB, additions: list[Coin]) -> list[Coin]:
|
|
488
488
|
r = []
|
|
489
489
|
for coin in additions:
|
|
490
490
|
puzzle = puzzle_db.puzzle_for_hash(coin.puzzle_hash)
|
|
@@ -508,7 +508,7 @@ def test_lifecycle_with_coinstore_as_wallet() -> None:
|
|
|
508
508
|
now = CoinTimestamp(10012300, uint32(1))
|
|
509
509
|
|
|
510
510
|
DELAY_SECONDS = 86400
|
|
511
|
-
DELAY_PUZZLE_HASH = bytes32
|
|
511
|
+
DELAY_PUZZLE_HASH = bytes32.zeros
|
|
512
512
|
|
|
513
513
|
#######
|
|
514
514
|
# spend coin to a singleton
|
|
@@ -8,7 +8,7 @@ from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import (
|
|
|
8
8
|
)
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
def test_1():
|
|
11
|
+
def test_1() -> None:
|
|
12
12
|
for main_secret_exponent in range(500, 600):
|
|
13
13
|
hidden_puzzle_hash = DEFAULT_HIDDEN_PUZZLE.get_tree_hash()
|
|
14
14
|
main_pubkey = int_to_public_key(main_secret_exponent)
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import random
|
|
5
|
-
from typing import Any,
|
|
5
|
+
from typing import Any, Optional
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
8
|
|
|
@@ -16,7 +16,11 @@ from chia.wallet.conditions import ConditionValidTimes
|
|
|
16
16
|
from chia.wallet.transaction_record import TransactionRecord, TransactionRecordOld, minimum_send_attempts
|
|
17
17
|
from chia.wallet.util.query_filter import TransactionTypeFilter
|
|
18
18
|
from chia.wallet.util.transaction_type import TransactionType
|
|
19
|
-
from chia.wallet.wallet_transaction_store import
|
|
19
|
+
from chia.wallet.wallet_transaction_store import (
|
|
20
|
+
WalletTransactionStore,
|
|
21
|
+
filter_ok_mempool_status,
|
|
22
|
+
get_light_transaction_record,
|
|
23
|
+
)
|
|
20
24
|
|
|
21
25
|
module_seeded_random = random.Random()
|
|
22
26
|
module_seeded_random.seed(a=0, version=2)
|
|
@@ -37,11 +41,11 @@ tr1 = TransactionRecord(
|
|
|
37
41
|
[coin_2, coin_3], # additions
|
|
38
42
|
[coin_1], # removals
|
|
39
43
|
uint32(1), # wallet_id
|
|
40
|
-
[], #
|
|
44
|
+
[], # list[tuple[str, uint8, Optional[str]]] sent_to
|
|
41
45
|
bytes32(bytes32.random(module_seeded_random)), # trade_id
|
|
42
46
|
uint32(TransactionType.OUTGOING_TX), # type
|
|
43
47
|
bytes32(bytes32.random(module_seeded_random)), # name
|
|
44
|
-
[], #
|
|
48
|
+
[], # list[tuple[bytes32, list[bytes]]] memos
|
|
45
49
|
ConditionValidTimes(),
|
|
46
50
|
)
|
|
47
51
|
|
|
@@ -210,7 +214,7 @@ async def test_get_farming_rewards(seeded_random: random.Random) -> None:
|
|
|
210
214
|
async with DBConnection(1) as db_wrapper:
|
|
211
215
|
store = await WalletTransactionStore.create(db_wrapper)
|
|
212
216
|
|
|
213
|
-
test_trs:
|
|
217
|
+
test_trs: list[TransactionRecord] = []
|
|
214
218
|
# tr1 is type OUTGOING_TX
|
|
215
219
|
|
|
216
220
|
for conf in [True, False]:
|
|
@@ -252,8 +256,8 @@ async def test_get_all_unconfirmed(seeded_random: random.Random) -> None:
|
|
|
252
256
|
)
|
|
253
257
|
await store.add_transaction_record(tr1)
|
|
254
258
|
await store.add_transaction_record(tr2)
|
|
255
|
-
|
|
256
|
-
assert
|
|
259
|
+
all_unconfirmed = await store.get_all_unconfirmed()
|
|
260
|
+
assert all_unconfirmed == [get_light_transaction_record(tr1)]
|
|
257
261
|
|
|
258
262
|
|
|
259
263
|
@pytest.mark.anyio
|
|
@@ -320,7 +324,7 @@ async def test_all_transactions_for_wallet(seeded_random: random.Random) -> None
|
|
|
320
324
|
async with DBConnection(1) as db_wrapper:
|
|
321
325
|
store = await WalletTransactionStore.create(db_wrapper)
|
|
322
326
|
|
|
323
|
-
test_trs:
|
|
327
|
+
test_trs: list[TransactionRecord] = []
|
|
324
328
|
for wallet_id in [1, 2]:
|
|
325
329
|
for type in [
|
|
326
330
|
TransactionType.INCOMING_TX,
|
|
@@ -356,7 +360,7 @@ async def test_all_transactions_for_wallet(seeded_random: random.Random) -> None
|
|
|
356
360
|
assert await store.get_all_transactions_for_wallet(2, TransactionType.OUTGOING_TRADE) == [test_trs[11]]
|
|
357
361
|
|
|
358
362
|
|
|
359
|
-
def cmp(lhs:
|
|
363
|
+
def cmp(lhs: list[Any], rhs: list[Any]) -> bool:
|
|
360
364
|
if len(rhs) != len(lhs):
|
|
361
365
|
return False
|
|
362
366
|
|
|
@@ -371,7 +375,7 @@ async def test_get_all_transactions(seeded_random: random.Random) -> None:
|
|
|
371
375
|
async with DBConnection(1) as db_wrapper:
|
|
372
376
|
store = await WalletTransactionStore.create(db_wrapper)
|
|
373
377
|
|
|
374
|
-
test_trs:
|
|
378
|
+
test_trs: list[TransactionRecord] = []
|
|
375
379
|
assert await store.get_all_transactions() == []
|
|
376
380
|
for wallet_id in [1, 2, 3, 4]:
|
|
377
381
|
test_trs.append(dataclasses.replace(tr1, name=bytes32.random(seeded_random), wallet_id=uint32(wallet_id)))
|
|
@@ -388,7 +392,7 @@ async def test_get_transaction_above(seeded_random: random.Random) -> None:
|
|
|
388
392
|
async with DBConnection(1) as db_wrapper:
|
|
389
393
|
store = await WalletTransactionStore.create(db_wrapper)
|
|
390
394
|
|
|
391
|
-
test_trs:
|
|
395
|
+
test_trs: list[TransactionRecord] = []
|
|
392
396
|
assert await store.get_transaction_above(uint32(0)) == []
|
|
393
397
|
for height in range(10):
|
|
394
398
|
test_trs.append(
|
|
@@ -440,7 +444,7 @@ async def test_rollback_to_block(seeded_random: random.Random) -> None:
|
|
|
440
444
|
async with DBConnection(1) as db_wrapper:
|
|
441
445
|
store = await WalletTransactionStore.create(db_wrapper)
|
|
442
446
|
|
|
443
|
-
test_trs:
|
|
447
|
+
test_trs: list[TransactionRecord] = []
|
|
444
448
|
for height in range(10):
|
|
445
449
|
test_trs.append(
|
|
446
450
|
dataclasses.replace(tr1, name=bytes32.random(seeded_random), confirmed_at_height=uint32(height))
|
|
@@ -798,7 +802,7 @@ async def test_get_not_sent(seeded_random: random.Random) -> None:
|
|
|
798
802
|
|
|
799
803
|
@pytest.mark.anyio
|
|
800
804
|
async def test_transaction_record_is_valid() -> None:
|
|
801
|
-
invalid_attempts:
|
|
805
|
+
invalid_attempts: list[tuple[str, uint8, Optional[str]]] = []
|
|
802
806
|
# The tx should be valid as long as we don't have minimum_send_attempts failed attempts
|
|
803
807
|
while len(invalid_attempts) < minimum_send_attempts:
|
|
804
808
|
assert dataclasses.replace(tr1, sent_to=invalid_attempts).is_valid()
|
|
@@ -814,9 +818,9 @@ async def test_transaction_record_is_valid() -> None:
|
|
|
814
818
|
Err.INVALID_FEE_TOO_CLOSE_TO_ZERO.name,
|
|
815
819
|
)
|
|
816
820
|
# But it should become valid with one of the above attempts
|
|
817
|
-
assert dataclasses.replace(tr1, sent_to=invalid_attempts
|
|
818
|
-
assert dataclasses.replace(tr1, sent_to=invalid_attempts
|
|
819
|
-
assert dataclasses.replace(tr1, sent_to=invalid_attempts
|
|
821
|
+
assert dataclasses.replace(tr1, sent_to=[*invalid_attempts, mempool_success]).is_valid()
|
|
822
|
+
assert dataclasses.replace(tr1, sent_to=[*invalid_attempts, low_fee]).is_valid()
|
|
823
|
+
assert dataclasses.replace(tr1, sent_to=[*invalid_attempts, close_to_zero]).is_valid()
|
|
820
824
|
|
|
821
825
|
|
|
822
826
|
@pytest.mark.anyio
|
|
@@ -842,7 +846,7 @@ async def test_valid_times_migration() -> None:
|
|
|
842
846
|
old_record = TransactionRecordOld(
|
|
843
847
|
confirmed_at_height=uint32(0),
|
|
844
848
|
created_at_time=uint64(1000000000),
|
|
845
|
-
to_puzzle_hash=bytes32
|
|
849
|
+
to_puzzle_hash=bytes32.zeros,
|
|
846
850
|
amount=uint64(0),
|
|
847
851
|
fee_amount=uint64(0),
|
|
848
852
|
confirmed=False,
|
|
@@ -854,7 +858,7 @@ async def test_valid_times_migration() -> None:
|
|
|
854
858
|
sent_to=[],
|
|
855
859
|
trade_id=None,
|
|
856
860
|
type=uint32(TransactionType.INCOMING_TX.value),
|
|
857
|
-
name=bytes32
|
|
861
|
+
name=bytes32.zeros,
|
|
858
862
|
memos=[],
|
|
859
863
|
)
|
|
860
864
|
|
|
@@ -893,7 +897,7 @@ async def test_large_tx_record_query() -> None:
|
|
|
893
897
|
record = TransactionRecordOld(
|
|
894
898
|
confirmed_at_height=uint32(0),
|
|
895
899
|
created_at_time=uint64(1000000000),
|
|
896
|
-
to_puzzle_hash=bytes32
|
|
900
|
+
to_puzzle_hash=bytes32.zeros,
|
|
897
901
|
amount=uint64(0),
|
|
898
902
|
fee_amount=uint64(0),
|
|
899
903
|
confirmed=False,
|
chia/_tests/wallet/test_util.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
6
|
|
|
@@ -21,6 +21,7 @@ from chia.wallet.util.tx_config import (
|
|
|
21
21
|
CoinSelectionConfigLoader,
|
|
22
22
|
TXConfigLoader,
|
|
23
23
|
)
|
|
24
|
+
from chia.wallet.util.wallet_types import WalletType
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
def test_compute_spend_hints_and_additions() -> None:
|
|
@@ -36,22 +37,18 @@ def test_compute_spend_hints_and_additions() -> None:
|
|
|
36
37
|
expected_dict = {hinted_coin.coin.name(): hinted_coin for hinted_coin in hinted_coins}
|
|
37
38
|
assert compute_spend_hints_and_additions(coin_spend)[0] == expected_dict
|
|
38
39
|
|
|
39
|
-
not_hinted_coin = HintedCoin(Coin(parent_coin.coin.name(), bytes32
|
|
40
|
+
not_hinted_coin = HintedCoin(Coin(parent_coin.coin.name(), bytes32.zeros, uint64(0)), None)
|
|
40
41
|
assert compute_spend_hints_and_additions(
|
|
41
|
-
make_spend(parent_coin.coin, Program.to(1), Program.to([[51, bytes32
|
|
42
|
+
make_spend(parent_coin.coin, Program.to(1), Program.to([[51, bytes32.zeros, 0, [["not", "a"], "hint"]]]))
|
|
42
43
|
)[0] == {not_hinted_coin.coin.name(): not_hinted_coin}
|
|
43
44
|
|
|
44
45
|
with pytest.raises(ValidationError):
|
|
45
46
|
compute_spend_hints_and_additions(
|
|
46
|
-
make_spend(
|
|
47
|
-
parent_coin.coin, Program.to(1), Program.to([[51, bytes32([0] * 32), 0] for _ in range(0, 10000)])
|
|
48
|
-
)
|
|
47
|
+
make_spend(parent_coin.coin, Program.to(1), Program.to([[51, bytes32.zeros, 0] for _ in range(0, 10000)]))
|
|
49
48
|
)
|
|
50
49
|
with pytest.raises(ValidationError):
|
|
51
50
|
compute_spend_hints_and_additions(
|
|
52
|
-
make_spend(
|
|
53
|
-
parent_coin.coin, Program.to(1), Program.to([[50, bytes48([0] * 48), b""] for _ in range(0, 10000)])
|
|
54
|
-
)
|
|
51
|
+
make_spend(parent_coin.coin, Program.to(1), Program.to([[50, bytes48.zeros, b""] for _ in range(0, 10000)]))
|
|
55
52
|
)
|
|
56
53
|
|
|
57
54
|
|
|
@@ -66,7 +63,7 @@ def test_cs_config() -> None:
|
|
|
66
63
|
"min_coin_amount": 50,
|
|
67
64
|
}
|
|
68
65
|
coin_to_exclude = CoinGenerator().get().coin
|
|
69
|
-
coin_id_to_exclude = bytes32
|
|
66
|
+
coin_id_to_exclude = bytes32.zeros
|
|
70
67
|
assert CoinSelectionConfigLoader.from_json_dict(
|
|
71
68
|
{
|
|
72
69
|
"excluded_coins": [coin_to_exclude.to_json_dict()],
|
|
@@ -80,9 +77,7 @@ def test_cs_config() -> None:
|
|
|
80
77
|
{
|
|
81
78
|
"excluded_coins": [coin_to_exclude.to_json_dict()],
|
|
82
79
|
}
|
|
83
|
-
).override(
|
|
84
|
-
max_coin_amount=100
|
|
85
|
-
).autofill(constants=DEFAULT_CONSTANTS).to_json_dict() == {
|
|
80
|
+
).override(max_coin_amount=100).autofill(constants=DEFAULT_CONSTANTS).to_json_dict() == {
|
|
86
81
|
**default_cs_config,
|
|
87
82
|
"excluded_coin_ids": ["0x" + coin_to_exclude.name().hex()],
|
|
88
83
|
"max_coin_amount": 100,
|
|
@@ -112,20 +107,20 @@ def test_list_to_binary_tree() -> None:
|
|
|
112
107
|
"serializations",
|
|
113
108
|
[
|
|
114
109
|
(tuple(), Program.to(None), []),
|
|
115
|
-
((bytes32
|
|
110
|
+
((bytes32.zeros,), Program.to([bytes32.zeros]), [LineageProofField.PARENT_NAME]),
|
|
116
111
|
(
|
|
117
|
-
(bytes32
|
|
118
|
-
Program.to([bytes32
|
|
112
|
+
(bytes32.zeros, bytes32.zeros),
|
|
113
|
+
Program.to([bytes32.zeros, bytes32.zeros]),
|
|
119
114
|
[LineageProofField.PARENT_NAME, LineageProofField.INNER_PUZZLE_HASH],
|
|
120
115
|
),
|
|
121
116
|
(
|
|
122
|
-
(bytes32
|
|
123
|
-
Program.to([bytes32
|
|
117
|
+
(bytes32.zeros, bytes32.zeros, uint64(0)),
|
|
118
|
+
Program.to([bytes32.zeros, bytes32.zeros, uint64(0)]),
|
|
124
119
|
[LineageProofField.PARENT_NAME, LineageProofField.INNER_PUZZLE_HASH, LineageProofField.AMOUNT],
|
|
125
120
|
),
|
|
126
121
|
],
|
|
127
122
|
)
|
|
128
|
-
def test_lineage_proof_varargs(serializations:
|
|
123
|
+
def test_lineage_proof_varargs(serializations: tuple[tuple[Any, ...], Program, list[LineageProofField]]) -> None:
|
|
129
124
|
var_args, expected_program, lp_fields = serializations
|
|
130
125
|
assert LineageProof(*var_args).to_program() == expected_program
|
|
131
126
|
assert LineageProof(*var_args) == LineageProof.from_program(expected_program, lp_fields)
|
|
@@ -135,36 +130,36 @@ def test_lineage_proof_varargs(serializations: Tuple[Tuple[Any, ...], Program, L
|
|
|
135
130
|
"serializations",
|
|
136
131
|
[
|
|
137
132
|
({}, Program.to(None), []),
|
|
138
|
-
({"parent_name": bytes32
|
|
133
|
+
({"parent_name": bytes32.zeros}, Program.to([bytes32.zeros]), [LineageProofField.PARENT_NAME]),
|
|
139
134
|
(
|
|
140
|
-
{"parent_name": bytes32
|
|
141
|
-
Program.to([bytes32
|
|
135
|
+
{"parent_name": bytes32.zeros, "inner_puzzle_hash": bytes32.zeros},
|
|
136
|
+
Program.to([bytes32.zeros, bytes32.zeros]),
|
|
142
137
|
[LineageProofField.PARENT_NAME, LineageProofField.INNER_PUZZLE_HASH],
|
|
143
138
|
),
|
|
144
139
|
(
|
|
145
|
-
{"parent_name": bytes32
|
|
146
|
-
Program.to([bytes32
|
|
140
|
+
{"parent_name": bytes32.zeros, "inner_puzzle_hash": bytes32.zeros, "amount": uint64(0)},
|
|
141
|
+
Program.to([bytes32.zeros, bytes32.zeros, uint64(0)]),
|
|
147
142
|
[LineageProofField.PARENT_NAME, LineageProofField.INNER_PUZZLE_HASH, LineageProofField.AMOUNT],
|
|
148
143
|
),
|
|
149
144
|
(
|
|
150
|
-
{"parent_name": bytes32
|
|
151
|
-
Program.to([bytes32
|
|
145
|
+
{"parent_name": bytes32.zeros, "amount": uint64(0)},
|
|
146
|
+
Program.to([bytes32.zeros, uint64(0)]),
|
|
152
147
|
[LineageProofField.PARENT_NAME, LineageProofField.AMOUNT],
|
|
153
148
|
),
|
|
154
149
|
(
|
|
155
|
-
{"inner_puzzle_hash": bytes32
|
|
156
|
-
Program.to([bytes32
|
|
150
|
+
{"inner_puzzle_hash": bytes32.zeros, "amount": uint64(0)},
|
|
151
|
+
Program.to([bytes32.zeros, uint64(0)]),
|
|
157
152
|
[LineageProofField.INNER_PUZZLE_HASH, LineageProofField.AMOUNT],
|
|
158
153
|
),
|
|
159
154
|
({"amount": uint64(0)}, Program.to([uint64(0)]), [LineageProofField.AMOUNT]),
|
|
160
155
|
(
|
|
161
|
-
{"inner_puzzle_hash": bytes32
|
|
162
|
-
Program.to([bytes32
|
|
156
|
+
{"inner_puzzle_hash": bytes32.zeros},
|
|
157
|
+
Program.to([bytes32.zeros]),
|
|
163
158
|
[LineageProofField.INNER_PUZZLE_HASH],
|
|
164
159
|
),
|
|
165
160
|
],
|
|
166
161
|
)
|
|
167
|
-
def test_lineage_proof_kwargs(serializations:
|
|
162
|
+
def test_lineage_proof_kwargs(serializations: tuple[dict[str, Any], Program, list[LineageProofField]]) -> None:
|
|
168
163
|
kwargs, expected_program, lp_fields = serializations
|
|
169
164
|
assert LineageProof(**kwargs).to_program() == expected_program
|
|
170
165
|
assert LineageProof(**kwargs) == LineageProof.from_program(expected_program, lp_fields)
|
|
@@ -174,8 +169,17 @@ def test_lineage_proof_errors() -> None:
|
|
|
174
169
|
with pytest.raises(ValueError, match="Mismatch"):
|
|
175
170
|
LineageProof.from_program(Program.to([]), [LineageProofField.PARENT_NAME])
|
|
176
171
|
with pytest.raises(StopIteration):
|
|
177
|
-
LineageProof.from_program(Program.to([bytes32
|
|
172
|
+
LineageProof.from_program(Program.to([bytes32.zeros]), [])
|
|
178
173
|
with pytest.raises(ValueError):
|
|
179
174
|
LineageProof.from_program(Program.to([bytes32([1] * 32)]), [LineageProofField.AMOUNT])
|
|
180
175
|
with pytest.raises(ValueError):
|
|
181
176
|
LineageProof.from_program(Program.to([uint64(0)]), [LineageProofField.PARENT_NAME])
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
# this is the only test that has coverage for `WalletType.to_json_dict`
|
|
180
|
+
# it's possible it could even be deleted
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def test_wallet_type_to_json() -> None:
|
|
184
|
+
for w in WalletType:
|
|
185
|
+
assert w.to_json_dict() == w.name
|