chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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 +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_blockchain_transactions.py +5 -2
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +66 -31
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +273 -70
- chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
- chia/_tests/core/mempool/test_mempool.py +54 -50
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +988 -854
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +9 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +16 -15
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +374 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- 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/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +19 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +50 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +239 -223
- chia/full_node/full_node_api.py +197 -152
- chia/full_node/full_node_rpc_api.py +34 -32
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hard_fork_utils.py +44 -0
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +120 -36
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +4 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +24 -10
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +142 -106
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
chia/wallet/trading/offer.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import BinaryIO
|
|
5
5
|
|
|
6
6
|
from chia_puzzles_py.programs import SETTLEMENT_PAYMENT, SETTLEMENT_PAYMENT_HASH
|
|
7
7
|
from chia_rs import CoinSpend, G2Element
|
|
@@ -15,12 +15,13 @@ from chia.types.blockchain_format.program import INFINITE_COST, Program, run_wit
|
|
|
15
15
|
from chia.types.coin_spend import make_spend
|
|
16
16
|
from chia.util.bech32m import bech32_decode, bech32_encode, convertbits
|
|
17
17
|
from chia.util.errors import Err, ValidationError
|
|
18
|
-
from chia.util.streamable import parse_rust
|
|
18
|
+
from chia.util.streamable import Streamable, parse_rust, streamable
|
|
19
19
|
from chia.wallet.conditions import (
|
|
20
20
|
AssertCoinAnnouncement,
|
|
21
21
|
AssertPuzzleAnnouncement,
|
|
22
22
|
Condition,
|
|
23
23
|
ConditionValidTimes,
|
|
24
|
+
ConditionValidTimesAbsolute,
|
|
24
25
|
CreateCoin,
|
|
25
26
|
parse_conditions_non_consensus,
|
|
26
27
|
parse_timelock_info,
|
|
@@ -43,7 +44,7 @@ from chia.wallet.util.puzzle_compression import (
|
|
|
43
44
|
)
|
|
44
45
|
from chia.wallet.wallet_spend_bundle import WalletSpendBundle
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
OfferSpecification = dict[int | bytes32, int]
|
|
47
48
|
|
|
48
49
|
OFFER_MOD = Program.from_bytes(SETTLEMENT_PAYMENT)
|
|
49
50
|
OFFER_MOD_HASH = bytes32(SETTLEMENT_PAYMENT_HASH)
|
|
@@ -51,7 +52,7 @@ OFFER_MOD_HASH = bytes32(SETTLEMENT_PAYMENT_HASH)
|
|
|
51
52
|
|
|
52
53
|
def detect_dependent_coin(
|
|
53
54
|
names: list[bytes32], deps: dict[bytes32, list[bytes32]], announcement_dict: dict[bytes32, list[bytes32]]
|
|
54
|
-
) ->
|
|
55
|
+
) -> tuple[bytes32, bytes32] | None:
|
|
55
56
|
# First, we check for any dependencies on coins in the same bundle
|
|
56
57
|
for name in names:
|
|
57
58
|
for dependency in deps[name]:
|
|
@@ -76,10 +77,22 @@ class NotarizedPayment(CreateCoin):
|
|
|
76
77
|
return self.to_program().get_tree_hash()
|
|
77
78
|
|
|
78
79
|
|
|
80
|
+
@streamable
|
|
81
|
+
@dataclass(frozen=True)
|
|
82
|
+
class OfferSummary(Streamable):
|
|
83
|
+
offered: dict[str, str] # str for negative int support
|
|
84
|
+
requested: dict[str, str] # str for negative int support
|
|
85
|
+
fees: uint64
|
|
86
|
+
infos: dict[str, PuzzleInfo]
|
|
87
|
+
additions: list[bytes32]
|
|
88
|
+
removals: list[bytes32]
|
|
89
|
+
valid_times: ConditionValidTimesAbsolute
|
|
90
|
+
|
|
91
|
+
|
|
79
92
|
@dataclass(frozen=True, eq=False)
|
|
80
93
|
class Offer:
|
|
81
94
|
requested_payments: dict[
|
|
82
|
-
|
|
95
|
+
bytes32 | None, list[NotarizedPayment]
|
|
83
96
|
] # The key is the asset id of the asset being requested
|
|
84
97
|
_bundle: WalletSpendBundle
|
|
85
98
|
driver_dict: dict[bytes32, PuzzleInfo] # asset_id -> asset driver
|
|
@@ -88,9 +101,9 @@ class Offer:
|
|
|
88
101
|
# ordered by the coin being spent
|
|
89
102
|
_additions: dict[Coin, list[Coin]] = field(init=False, repr=False)
|
|
90
103
|
_hints: dict[bytes32, bytes32] = field(init=False)
|
|
91
|
-
_offered_coins: dict[
|
|
92
|
-
_final_spend_bundle:
|
|
93
|
-
_conditions:
|
|
104
|
+
_offered_coins: dict[bytes32 | None, list[Coin]] = field(init=False, repr=False)
|
|
105
|
+
_final_spend_bundle: WalletSpendBundle | None = field(init=False, repr=False)
|
|
106
|
+
_conditions: dict[Coin, list[Condition]] | None = field(init=False)
|
|
94
107
|
|
|
95
108
|
@staticmethod
|
|
96
109
|
def ph() -> bytes32:
|
|
@@ -98,15 +111,15 @@ class Offer:
|
|
|
98
111
|
|
|
99
112
|
@staticmethod
|
|
100
113
|
def notarize_payments(
|
|
101
|
-
requested_payments: dict[
|
|
114
|
+
requested_payments: dict[bytes32 | None, list[CreateCoin]], # `None` means you are requesting XCH
|
|
102
115
|
coins: list[Coin],
|
|
103
|
-
) -> dict[
|
|
116
|
+
) -> dict[bytes32 | None, list[NotarizedPayment]]:
|
|
104
117
|
# This sort should be reproducible in CLVM with `>s`
|
|
105
118
|
sorted_coins: list[Coin] = sorted(coins, key=Coin.name)
|
|
106
|
-
sorted_coin_list: list[list[
|
|
119
|
+
sorted_coin_list: list[list[bytes32 | uint64]] = [coin_as_list(c) for c in sorted_coins]
|
|
107
120
|
nonce: bytes32 = Program.to(sorted_coin_list).get_tree_hash()
|
|
108
121
|
|
|
109
|
-
notarized_payments: dict[
|
|
122
|
+
notarized_payments: dict[bytes32 | None, list[NotarizedPayment]] = {}
|
|
110
123
|
for asset_id, payments in requested_payments.items():
|
|
111
124
|
notarized_payments[asset_id] = []
|
|
112
125
|
for p in payments:
|
|
@@ -117,7 +130,7 @@ class Offer:
|
|
|
117
130
|
# The announcements returned from this function must be asserted in whatever spend bundle is created by the wallet
|
|
118
131
|
@staticmethod
|
|
119
132
|
def calculate_announcements(
|
|
120
|
-
notarized_payments: dict[
|
|
133
|
+
notarized_payments: dict[bytes32 | None, list[NotarizedPayment]],
|
|
121
134
|
driver_dict: dict[bytes32, PuzzleInfo],
|
|
122
135
|
) -> list[AssertPuzzleAnnouncement]:
|
|
123
136
|
announcements: list[AssertPuzzleAnnouncement] = []
|
|
@@ -222,8 +235,8 @@ class Offer:
|
|
|
222
235
|
|
|
223
236
|
# This method does not get every coin that is being offered, only the `settlement_payment` children
|
|
224
237
|
# It's also a little heuristic, but it should get most things
|
|
225
|
-
def _get_offered_coins(self) -> dict[
|
|
226
|
-
offered_coins: dict[
|
|
238
|
+
def _get_offered_coins(self) -> dict[bytes32 | None, list[Coin]]:
|
|
239
|
+
offered_coins: dict[bytes32 | None, list[Coin]] = {}
|
|
227
240
|
|
|
228
241
|
for parent_spend in self._bundle.coin_spends:
|
|
229
242
|
coins_for_this_spend: list[Coin] = []
|
|
@@ -235,8 +248,8 @@ class Offer:
|
|
|
235
248
|
puzzle_driver = match_puzzle(parent_puzzle)
|
|
236
249
|
if puzzle_driver is not None:
|
|
237
250
|
asset_id = create_asset_id(puzzle_driver)
|
|
238
|
-
inner_puzzle:
|
|
239
|
-
inner_solution:
|
|
251
|
+
inner_puzzle: Program | None = get_inner_puzzle(puzzle_driver, parent_puzzle, parent_solution)
|
|
252
|
+
inner_solution: Program | None = get_inner_solution(puzzle_driver, parent_solution)
|
|
240
253
|
assert inner_puzzle is not None and inner_solution is not None
|
|
241
254
|
|
|
242
255
|
# We're going to look at the conditions created by the inner puzzle
|
|
@@ -280,7 +293,7 @@ class Offer:
|
|
|
280
293
|
offered_coins[asset_id].extend(coins_for_this_spend)
|
|
281
294
|
return offered_coins
|
|
282
295
|
|
|
283
|
-
def get_offered_coins(self) -> dict[
|
|
296
|
+
def get_offered_coins(self) -> dict[bytes32 | None, list[Coin]]:
|
|
284
297
|
try:
|
|
285
298
|
if self._offered_coins is not None:
|
|
286
299
|
return self._offered_coins
|
|
@@ -288,58 +301,58 @@ class Offer:
|
|
|
288
301
|
object.__setattr__(self, "_offered_coins", self._get_offered_coins())
|
|
289
302
|
return self._offered_coins
|
|
290
303
|
|
|
291
|
-
def get_offered_amounts(self) -> dict[
|
|
292
|
-
offered_coins: dict[
|
|
293
|
-
offered_amounts: dict[
|
|
304
|
+
def get_offered_amounts(self) -> dict[bytes32 | None, int]:
|
|
305
|
+
offered_coins: dict[bytes32 | None, list[Coin]] = self.get_offered_coins()
|
|
306
|
+
offered_amounts: dict[bytes32 | None, int] = {}
|
|
294
307
|
for asset_id, coins in offered_coins.items():
|
|
295
308
|
offered_amounts[asset_id] = uint64(sum(c.amount for c in coins))
|
|
296
309
|
return offered_amounts
|
|
297
310
|
|
|
298
|
-
def get_requested_payments(self) -> dict[
|
|
311
|
+
def get_requested_payments(self) -> dict[bytes32 | None, list[NotarizedPayment]]:
|
|
299
312
|
return self.requested_payments
|
|
300
313
|
|
|
301
|
-
def get_requested_amounts(self) -> dict[
|
|
302
|
-
requested_amounts: dict[
|
|
314
|
+
def get_requested_amounts(self) -> dict[bytes32 | None, int]:
|
|
315
|
+
requested_amounts: dict[bytes32 | None, int] = {}
|
|
303
316
|
for asset_id, coins in self.get_requested_payments().items():
|
|
304
317
|
requested_amounts[asset_id] = uint64(sum(c.amount for c in coins))
|
|
305
318
|
return requested_amounts
|
|
306
319
|
|
|
307
|
-
def arbitrage(self) -> dict[
|
|
320
|
+
def arbitrage(self) -> dict[bytes32 | None, int]:
|
|
308
321
|
"""
|
|
309
322
|
Returns a dictionary of the type of each asset and amount that is involved in the trade
|
|
310
323
|
With the amount being how much their offered amount within the offer
|
|
311
324
|
exceeds/falls short of their requested amount.
|
|
312
325
|
"""
|
|
313
|
-
offered_amounts: dict[
|
|
314
|
-
requested_amounts: dict[
|
|
326
|
+
offered_amounts: dict[bytes32 | None, int] = self.get_offered_amounts()
|
|
327
|
+
requested_amounts: dict[bytes32 | None, int] = self.get_requested_amounts()
|
|
315
328
|
|
|
316
|
-
arbitrage_dict: dict[
|
|
329
|
+
arbitrage_dict: dict[bytes32 | None, int] = {}
|
|
317
330
|
for asset_id in [*requested_amounts.keys(), *offered_amounts.keys()]:
|
|
318
331
|
arbitrage_dict[asset_id] = offered_amounts.get(asset_id, 0) - requested_amounts.get(asset_id, 0)
|
|
319
332
|
|
|
320
333
|
return arbitrage_dict
|
|
321
334
|
|
|
322
335
|
# This is a method mostly for the UI that creates a JSON summary of the offer
|
|
323
|
-
def summary(self) -> tuple[dict[str,
|
|
324
|
-
offered_amounts: dict[
|
|
325
|
-
requested_amounts: dict[
|
|
336
|
+
def summary(self) -> tuple[dict[str, str], dict[str, str], dict[str, PuzzleInfo], ConditionValidTimes]:
|
|
337
|
+
offered_amounts: dict[bytes32 | None, int] = self.get_offered_amounts()
|
|
338
|
+
requested_amounts: dict[bytes32 | None, int] = self.get_requested_amounts()
|
|
326
339
|
|
|
327
|
-
def
|
|
328
|
-
new_dic: dict[str,
|
|
340
|
+
def keys_and_amounts_to_strings(dic: dict[bytes32 | None, int]) -> dict[str, str]:
|
|
341
|
+
new_dic: dict[str, str] = {}
|
|
329
342
|
for key, val in dic.items():
|
|
330
343
|
if key is None:
|
|
331
|
-
new_dic["xch"] = val
|
|
344
|
+
new_dic["xch"] = str(val)
|
|
332
345
|
else:
|
|
333
|
-
new_dic[key.hex()] = val
|
|
346
|
+
new_dic[key.hex()] = str(val)
|
|
334
347
|
return new_dic
|
|
335
348
|
|
|
336
|
-
driver_dict: dict[str,
|
|
349
|
+
driver_dict: dict[str, PuzzleInfo] = {}
|
|
337
350
|
for key, value in self.driver_dict.items():
|
|
338
|
-
driver_dict[key.hex()] = value
|
|
351
|
+
driver_dict[key.hex()] = value
|
|
339
352
|
|
|
340
353
|
return (
|
|
341
|
-
|
|
342
|
-
|
|
354
|
+
keys_and_amounts_to_strings(offered_amounts),
|
|
355
|
+
keys_and_amounts_to_strings(requested_amounts),
|
|
343
356
|
driver_dict,
|
|
344
357
|
self.absolute_valid_times_ban_relatives(),
|
|
345
358
|
)
|
|
@@ -449,7 +462,7 @@ class Offer:
|
|
|
449
462
|
|
|
450
463
|
@classmethod
|
|
451
464
|
def aggregate(cls, offers: list[Offer]) -> Offer:
|
|
452
|
-
total_requested_payments: dict[
|
|
465
|
+
total_requested_payments: dict[bytes32 | None, list[NotarizedPayment]] = {}
|
|
453
466
|
total_bundle = WalletSpendBundle([], G2Element())
|
|
454
467
|
total_driver_dict: dict[bytes32, PuzzleInfo] = {}
|
|
455
468
|
for offer in offers:
|
|
@@ -481,13 +494,13 @@ class Offer:
|
|
|
481
494
|
|
|
482
495
|
# A "valid" spend means that this bundle can be pushed to the network and will succeed
|
|
483
496
|
# This differs from the `to_spend_bundle` method which deliberately creates an invalid SpendBundle
|
|
484
|
-
def to_valid_spend(self, arbitrage_ph:
|
|
497
|
+
def to_valid_spend(self, arbitrage_ph: bytes32 | None = None, solver: Solver = Solver({})) -> WalletSpendBundle:
|
|
485
498
|
if not self.is_valid():
|
|
486
499
|
raise ValueError("Offer is currently incomplete")
|
|
487
500
|
|
|
488
501
|
completion_spends: list[CoinSpend] = []
|
|
489
|
-
all_offered_coins: dict[
|
|
490
|
-
total_arbitrage_amount: dict[
|
|
502
|
+
all_offered_coins: dict[bytes32 | None, list[Coin]] = self.get_offered_coins()
|
|
503
|
+
total_arbitrage_amount: dict[bytes32 | None, int] = self.arbitrage()
|
|
491
504
|
for asset_id, payments in self.requested_payments.items():
|
|
492
505
|
offered_coins: list[Coin] = all_offered_coins[asset_id]
|
|
493
506
|
|
|
@@ -612,7 +625,7 @@ class Offer:
|
|
|
612
625
|
@classmethod
|
|
613
626
|
def from_spend_bundle(cls, bundle: WalletSpendBundle) -> Offer:
|
|
614
627
|
# Because of the `to_spend_bundle` method, we need to parse the dummy CoinSpends as `requested_payments`
|
|
615
|
-
requested_payments: dict[
|
|
628
|
+
requested_payments: dict[bytes32 | None, list[NotarizedPayment]] = {}
|
|
616
629
|
driver_dict: dict[bytes32, PuzzleInfo] = {}
|
|
617
630
|
leftover_coin_spends: list[CoinSpend] = []
|
|
618
631
|
for coin_spend in bundle.coin_spends:
|
|
@@ -648,7 +661,7 @@ class Offer:
|
|
|
648
661
|
return False # don't attempt to compare against unrelated types
|
|
649
662
|
return self.name() == other.name()
|
|
650
663
|
|
|
651
|
-
def compress(self, version:
|
|
664
|
+
def compress(self, version: int | None = None) -> bytes:
|
|
652
665
|
as_spend_bundle = self.to_spend_bundle()
|
|
653
666
|
if version is None:
|
|
654
667
|
mods: list[bytes] = [bytes(uncurry(s.puzzle_reveal)[0]) for s in as_spend_bundle.coin_spends]
|
|
@@ -667,7 +680,7 @@ class Offer:
|
|
|
667
680
|
pass
|
|
668
681
|
return cls.from_bytes(offer_bytes)
|
|
669
682
|
|
|
670
|
-
def to_bech32(self, prefix: str = "offer", compression_version:
|
|
683
|
+
def to_bech32(self, prefix: str = "offer", compression_version: int | None = None) -> str:
|
|
671
684
|
offer_bytes = self.compress(version=compression_version)
|
|
672
685
|
encoded = bech32_encode(prefix, convertbits(list(offer_bytes), 8, 5))
|
|
673
686
|
return encoded
|
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
from time import perf_counter
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
import aiosqlite
|
|
8
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -84,7 +83,7 @@ class TradeStore:
|
|
|
84
83
|
|
|
85
84
|
@classmethod
|
|
86
85
|
async def create(
|
|
87
|
-
cls, db_wrapper: DBWrapper2, cache_size: uint32 = uint32(600000), name:
|
|
86
|
+
cls, db_wrapper: DBWrapper2, cache_size: uint32 = uint32(600000), name: str | None = None
|
|
88
87
|
) -> TradeStore:
|
|
89
88
|
self = cls()
|
|
90
89
|
|
|
@@ -227,7 +226,7 @@ class TradeStore:
|
|
|
227
226
|
"""
|
|
228
227
|
Updates the status of the trade
|
|
229
228
|
"""
|
|
230
|
-
current:
|
|
229
|
+
current: TradeRecord | None = await self.get_trade_record(trade_id)
|
|
231
230
|
if current is None:
|
|
232
231
|
return
|
|
233
232
|
confirmed_at_index = current.confirmed_at_index
|
|
@@ -255,13 +254,13 @@ class TradeStore:
|
|
|
255
254
|
await self.add_trade_record(tx, offer_name, replace=True)
|
|
256
255
|
|
|
257
256
|
async def increment_sent(
|
|
258
|
-
self, id: bytes32, name: str, send_status: MempoolInclusionStatus, err:
|
|
257
|
+
self, id: bytes32, name: str, send_status: MempoolInclusionStatus, err: Err | None
|
|
259
258
|
) -> bool:
|
|
260
259
|
"""
|
|
261
260
|
Updates trade sent count (Full Node has received spend_bundle and sent ack).
|
|
262
261
|
"""
|
|
263
262
|
|
|
264
|
-
current:
|
|
263
|
+
current: TradeRecord | None = await self.get_trade_record(id)
|
|
265
264
|
if current is None:
|
|
266
265
|
return False
|
|
267
266
|
|
|
@@ -322,7 +321,7 @@ class TradeStore:
|
|
|
322
321
|
|
|
323
322
|
return total, my_offers_count, taken_offers_count
|
|
324
323
|
|
|
325
|
-
async def get_trade_record(self, trade_id: bytes32) ->
|
|
324
|
+
async def get_trade_record(self, trade_id: bytes32) -> TradeRecord | None:
|
|
326
325
|
"""
|
|
327
326
|
Checks DB for TradeRecord with id: id and returns it.
|
|
328
327
|
"""
|
|
@@ -377,7 +376,7 @@ class TradeStore:
|
|
|
377
376
|
start: int,
|
|
378
377
|
end: int,
|
|
379
378
|
*,
|
|
380
|
-
sort_key:
|
|
379
|
+
sort_key: str | None = None,
|
|
381
380
|
reverse: bool = False,
|
|
382
381
|
exclude_my_offers: bool = False,
|
|
383
382
|
exclude_taken_offers: bool = False,
|
|
@@ -398,8 +397,8 @@ class TradeStore:
|
|
|
398
397
|
|
|
399
398
|
offset = start
|
|
400
399
|
limit = end - start
|
|
401
|
-
where_status_clause:
|
|
402
|
-
order_by_clause:
|
|
400
|
+
where_status_clause: str | None = None
|
|
401
|
+
order_by_clause: str | None = None
|
|
403
402
|
|
|
404
403
|
if not include_completed:
|
|
405
404
|
# Construct a WHERE clause that only looks at active/pending statuses
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Generic,
|
|
4
|
+
from typing import Generic, TypeVar
|
|
5
5
|
|
|
6
6
|
from chia_rs import SpendBundle
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -29,7 +29,7 @@ class ItemAndTransactionRecords(Generic[T]):
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
@streamable
|
|
32
|
-
@dataclass(frozen=True)
|
|
32
|
+
@dataclass(frozen=True, kw_only=True)
|
|
33
33
|
class TransactionRecordOld(Streamable):
|
|
34
34
|
"""
|
|
35
35
|
Used for storing transaction data and status in wallets.
|
|
@@ -42,15 +42,15 @@ class TransactionRecordOld(Streamable):
|
|
|
42
42
|
fee_amount: uint64
|
|
43
43
|
confirmed: bool
|
|
44
44
|
sent: uint32
|
|
45
|
-
spend_bundle:
|
|
45
|
+
spend_bundle: WalletSpendBundle | None
|
|
46
46
|
additions: list[Coin]
|
|
47
47
|
removals: list[Coin]
|
|
48
48
|
wallet_id: uint32
|
|
49
49
|
|
|
50
50
|
# Represents the list of peers that we sent the transaction to, whether each one
|
|
51
51
|
# included it in the mempool, and what the error message (if any) was
|
|
52
|
-
sent_to: list[tuple[str, uint8,
|
|
53
|
-
trade_id:
|
|
52
|
+
sent_to: list[tuple[str, uint8, str | None]]
|
|
53
|
+
trade_id: bytes32 | None
|
|
54
54
|
type: uint32 # TransactionType
|
|
55
55
|
|
|
56
56
|
# name is also called bundle_id and tx_id
|
|
@@ -64,7 +64,7 @@ class TransactionRecordOld(Streamable):
|
|
|
64
64
|
return True
|
|
65
65
|
return False
|
|
66
66
|
|
|
67
|
-
def height_farmed(self, genesis_challenge: bytes32) ->
|
|
67
|
+
def height_farmed(self, genesis_challenge: bytes32) -> uint32 | None:
|
|
68
68
|
if not self.confirmed:
|
|
69
69
|
return None
|
|
70
70
|
if self.type in {TransactionType.FEE_REWARD, TransactionType.COINBASE_REWARD}:
|
|
@@ -100,7 +100,7 @@ class TransactionRecordOld(Streamable):
|
|
|
100
100
|
|
|
101
101
|
|
|
102
102
|
@streamable
|
|
103
|
-
@dataclass(frozen=True)
|
|
103
|
+
@dataclass(frozen=True, kw_only=True)
|
|
104
104
|
class TransactionRecord(TransactionRecordOld):
|
|
105
105
|
valid_times: ConditionValidTimes
|
|
106
106
|
to_address: str
|
|
@@ -118,4 +118,4 @@ class LightTransactionRecord(Streamable):
|
|
|
118
118
|
type: uint32
|
|
119
119
|
additions: list[Coin]
|
|
120
120
|
removals: list[Coin]
|
|
121
|
-
spend_bundle:
|
|
121
|
+
spend_bundle: SpendBundle | None
|
chia/wallet/uncurried_puzzle.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Union
|
|
5
4
|
|
|
6
5
|
from chia.types.blockchain_format.program import Program, uncurry
|
|
7
6
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
@@ -13,5 +12,5 @@ class UncurriedPuzzle:
|
|
|
13
12
|
args: Program
|
|
14
13
|
|
|
15
14
|
|
|
16
|
-
def uncurry_puzzle(puzzle:
|
|
15
|
+
def uncurry_puzzle(puzzle: Program | SerializedProgram) -> UncurriedPuzzle:
|
|
17
16
|
return UncurriedPuzzle(*uncurry(puzzle))
|
|
@@ -2,11 +2,11 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import functools
|
|
5
|
+
from collections.abc import Callable
|
|
5
6
|
from types import MappingProxyType
|
|
6
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Generic, TypeGuard, TypeVar, get_type_hints
|
|
7
8
|
|
|
8
9
|
from hsms.clvm_serde import from_program_for_type, to_program_for_type
|
|
9
|
-
from typing_extensions import TypeGuard
|
|
10
10
|
|
|
11
11
|
from chia.types.blockchain_format.program import Program
|
|
12
12
|
from chia.util.byte_types import hexstr_to_bytes
|
|
@@ -36,7 +36,7 @@ def clvm_streamable(cls: type[Streamable]) -> type[Streamable]:
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
def program_serialize_clvm_streamable(
|
|
39
|
-
clvm_streamable: Streamable, translation_layer:
|
|
39
|
+
clvm_streamable: Streamable, translation_layer: TranslationLayer | None = None
|
|
40
40
|
) -> Program:
|
|
41
41
|
if translation_layer is not None:
|
|
42
42
|
mapping = translation_layer.get_mapping(clvm_streamable.__class__)
|
|
@@ -47,17 +47,17 @@ def program_serialize_clvm_streamable(
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
def byte_serialize_clvm_streamable(
|
|
50
|
-
clvm_streamable: Streamable, translation_layer:
|
|
50
|
+
clvm_streamable: Streamable, translation_layer: TranslationLayer | None = None
|
|
51
51
|
) -> bytes:
|
|
52
52
|
return bytes(program_serialize_clvm_streamable(clvm_streamable, translation_layer=translation_layer))
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
def json_serialize_with_clvm_streamable(
|
|
56
56
|
streamable: object,
|
|
57
|
-
next_recursion_step:
|
|
58
|
-
translation_layer:
|
|
57
|
+
next_recursion_step: Callable[..., dict[str, Any]] | None = None,
|
|
58
|
+
translation_layer: TranslationLayer | None = None,
|
|
59
59
|
**next_recursion_env: Any,
|
|
60
|
-
) ->
|
|
60
|
+
) -> str | dict[str, Any]:
|
|
61
61
|
if next_recursion_step is None:
|
|
62
62
|
next_recursion_step = recurse_jsonify
|
|
63
63
|
if is_clvm_streamable(streamable):
|
|
@@ -70,7 +70,7 @@ def json_serialize_with_clvm_streamable(
|
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
def program_deserialize_clvm_streamable(
|
|
73
|
-
program: Program, clvm_streamable_type: type[_T_Streamable], translation_layer:
|
|
73
|
+
program: Program, clvm_streamable_type: type[_T_Streamable], translation_layer: TranslationLayer | None = None
|
|
74
74
|
) -> _T_Streamable:
|
|
75
75
|
type_to_deserialize_from: type[Streamable] = clvm_streamable_type
|
|
76
76
|
if translation_layer is not None:
|
|
@@ -86,7 +86,7 @@ def program_deserialize_clvm_streamable(
|
|
|
86
86
|
|
|
87
87
|
|
|
88
88
|
def byte_deserialize_clvm_streamable(
|
|
89
|
-
blob: bytes, clvm_streamable_type: type[_T_Streamable], translation_layer:
|
|
89
|
+
blob: bytes, clvm_streamable_type: type[_T_Streamable], translation_layer: TranslationLayer | None = None
|
|
90
90
|
) -> _T_Streamable:
|
|
91
91
|
return program_deserialize_clvm_streamable(
|
|
92
92
|
Program.from_bytes(blob), clvm_streamable_type, translation_layer=translation_layer
|
|
@@ -106,9 +106,9 @@ def is_clvm_streamable(v: object) -> TypeGuard[Streamable]:
|
|
|
106
106
|
|
|
107
107
|
|
|
108
108
|
def json_deserialize_with_clvm_streamable(
|
|
109
|
-
json_dict:
|
|
109
|
+
json_dict: str | dict[str, Any],
|
|
110
110
|
streamable_type: type[_T_Streamable],
|
|
111
|
-
translation_layer:
|
|
111
|
+
translation_layer: TranslationLayer | None = None,
|
|
112
112
|
) -> _T_Streamable:
|
|
113
113
|
# This function is flawed for compound types because it's highjacking the function_to_convert_one_item func
|
|
114
114
|
# which does not call back to it. More examination is needed.
|
|
@@ -164,7 +164,7 @@ class TranslationLayer:
|
|
|
164
164
|
|
|
165
165
|
def get_mapping(
|
|
166
166
|
self, _type: type[_T_ClvmStreamable]
|
|
167
|
-
) ->
|
|
167
|
+
) -> TranslationLayerMapping[_T_ClvmStreamable, Streamable] | None:
|
|
168
168
|
mappings = [m for m in self.type_mappings if m.from_type == _type]
|
|
169
169
|
if len(mappings) == 1:
|
|
170
170
|
return mappings[0]
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from chia_rs import CoinSpend
|
|
7
6
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -18,7 +17,7 @@ from chia.util.errors import Err, ValidationError
|
|
|
18
17
|
@dataclass(frozen=True)
|
|
19
18
|
class HintedCoin:
|
|
20
19
|
coin: Coin
|
|
21
|
-
hint:
|
|
20
|
+
hint: bytes32 | None
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
def compute_spend_hints_and_additions(
|
|
@@ -54,12 +53,12 @@ def compute_spend_hints_and_additions(
|
|
|
54
53
|
assert rf is not None
|
|
55
54
|
|
|
56
55
|
coin: Coin = Coin(cs.coin.name(), bytes32(rf), uint64(condition.at("rrf").as_int()))
|
|
57
|
-
hint:
|
|
56
|
+
hint: bytes32 | None = None
|
|
58
57
|
if (
|
|
59
|
-
condition.at("rrr") != Program.
|
|
58
|
+
condition.at("rrr") != Program.NIL # There's more than two arguments
|
|
60
59
|
and condition.at("rrrf").atom is None # The 3rd argument is a cons
|
|
61
60
|
):
|
|
62
|
-
potential_hint:
|
|
61
|
+
potential_hint: bytes | None = condition.at("rrrff").atom
|
|
63
62
|
if potential_hint is not None and len(potential_hint) == 32:
|
|
64
63
|
hint = bytes32(potential_hint)
|
|
65
64
|
hinted_coins[bytes32(coin.name())] = HintedCoin(coin, hint)
|
chia/wallet/util/merkle_tree.py
CHANGED
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import math
|
|
4
4
|
from enum import Enum
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
from chia_rs.sized_bytes import bytes32
|
|
8
7
|
|
|
@@ -57,7 +56,7 @@ class MerkleTree:
|
|
|
57
56
|
|
|
58
57
|
def _proof(
|
|
59
58
|
self, puzzle_hashes: list[bytes32], searching_for: bytes32
|
|
60
|
-
) -> tuple[
|
|
59
|
+
) -> tuple[int | None, list[bytes32] | None, bytes32, int | None]:
|
|
61
60
|
if len(puzzle_hashes) == 1:
|
|
62
61
|
atom_hash = hash_an_atom(puzzle_hashes[0])
|
|
63
62
|
if puzzle_hashes[0] == searching_for:
|
|
@@ -95,6 +94,6 @@ class MerkleTree:
|
|
|
95
94
|
|
|
96
95
|
return (final_path, final_list, pair_hash, bit_num + 1 if bit_num is not None else None)
|
|
97
96
|
|
|
98
|
-
def generate_proof(self, leaf_reveal: bytes32) -> tuple[
|
|
97
|
+
def generate_proof(self, leaf_reveal: bytes32) -> tuple[int | None, list[list[bytes32] | None]]:
|
|
99
98
|
proof = self._proof(self.nodes, leaf_reveal)
|
|
100
99
|
return (proof[0], [proof[1]])
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from chia_rs import CoinState, HeaderBlock
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -14,7 +14,7 @@ from chia.util.lru_cache import LRUCache
|
|
|
14
14
|
class PeerRequestCache:
|
|
15
15
|
_blocks: LRUCache[uint32, HeaderBlock] # height -> HeaderBlock
|
|
16
16
|
_block_requests: LRUCache[tuple[uint32, uint32], asyncio.Task[Any]] # (start, end) -> Task
|
|
17
|
-
_states_validated: LRUCache[bytes32,
|
|
17
|
+
_states_validated: LRUCache[bytes32, uint32 | None] # coin state hash -> last change height, or None for reorg
|
|
18
18
|
_timestamps: LRUCache[uint32, uint64] # block height -> timestamp
|
|
19
19
|
_blocks_validated: LRUCache[bytes32, uint32] # header_hash -> height
|
|
20
20
|
_block_signatures_validated: LRUCache[bytes32, uint32] # sig_hash -> height
|
|
@@ -33,7 +33,7 @@ class PeerRequestCache:
|
|
|
33
33
|
self._additions_in_block = LRUCache(200)
|
|
34
34
|
self._race_cache = {}
|
|
35
35
|
|
|
36
|
-
def get_block(self, height: uint32) ->
|
|
36
|
+
def get_block(self, height: uint32) -> HeaderBlock | None:
|
|
37
37
|
return self._blocks.get(height)
|
|
38
38
|
|
|
39
39
|
def add_to_blocks(self, header_block: HeaderBlock) -> None:
|
|
@@ -43,7 +43,7 @@ class PeerRequestCache:
|
|
|
43
43
|
if self._timestamps.get(header_block.height) is None:
|
|
44
44
|
self._timestamps.put(header_block.height, header_block.foliage_transaction_block.timestamp)
|
|
45
45
|
|
|
46
|
-
def get_block_request(self, start: uint32, end: uint32) ->
|
|
46
|
+
def get_block_request(self, start: uint32, end: uint32) -> asyncio.Task[Any] | None:
|
|
47
47
|
return self._block_requests.get((start, end))
|
|
48
48
|
|
|
49
49
|
def add_to_block_requests(self, start: uint32, end: uint32, request: asyncio.Task[Any]) -> None:
|
|
@@ -53,14 +53,14 @@ class PeerRequestCache:
|
|
|
53
53
|
return self._states_validated.get(coin_state_hash) is not None
|
|
54
54
|
|
|
55
55
|
def add_to_states_validated(self, coin_state: CoinState) -> None:
|
|
56
|
-
cs_height:
|
|
56
|
+
cs_height: uint32 | None = None
|
|
57
57
|
if coin_state.spent_height is not None:
|
|
58
58
|
cs_height = uint32(coin_state.spent_height)
|
|
59
59
|
elif coin_state.created_height is not None:
|
|
60
60
|
cs_height = uint32(coin_state.created_height)
|
|
61
61
|
self._states_validated.put(coin_state.get_hash(), cs_height)
|
|
62
62
|
|
|
63
|
-
def get_height_timestamp(self, height: uint32) ->
|
|
63
|
+
def get_height_timestamp(self, height: uint32) -> uint64 | None:
|
|
64
64
|
return self._timestamps.get(height)
|
|
65
65
|
|
|
66
66
|
def add_to_blocks_validated(self, reward_chain_hash: bytes32, height: uint32) -> None:
|
|
@@ -126,7 +126,7 @@ class PeerRequestCache:
|
|
|
126
126
|
new_block_requests.put((start_h, end_h), fetch_task)
|
|
127
127
|
self._block_requests = new_block_requests
|
|
128
128
|
|
|
129
|
-
new_states_validated: LRUCache[bytes32,
|
|
129
|
+
new_states_validated: LRUCache[bytes32, uint32 | None] = LRUCache(self._states_validated.capacity)
|
|
130
130
|
for cs_hash, cs_height in self._states_validated.cache.items():
|
|
131
131
|
if cs_height is not None and cs_height <= height:
|
|
132
132
|
new_states_validated.put(cs_hash, cs_height)
|
|
@@ -158,7 +158,7 @@ class PeerRequestCache:
|
|
|
158
158
|
|
|
159
159
|
|
|
160
160
|
def can_use_peer_request_cache(
|
|
161
|
-
coin_state: CoinState, peer_request_cache: PeerRequestCache, fork_height:
|
|
161
|
+
coin_state: CoinState, peer_request_cache: PeerRequestCache, fork_height: uint32 | None
|
|
162
162
|
) -> bool:
|
|
163
163
|
if not peer_request_cache.in_states_validated(coin_state.get_hash()):
|
|
164
164
|
return False
|