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/coin_selection.py
CHANGED
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import random
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
from chia_rs.sized_bytes import bytes32
|
|
8
7
|
from chia_rs.sized_ints import uint64, uint128
|
|
@@ -68,7 +67,7 @@ async def select_coins(
|
|
|
68
67
|
valid_spendable_coins.sort(reverse=True, key=lambda r: r.amount)
|
|
69
68
|
|
|
70
69
|
# check for exact 1 to 1 coin match.
|
|
71
|
-
exact_match_coin:
|
|
70
|
+
exact_match_coin: Coin | None = check_for_exact_match(valid_spendable_coins, uint64(amount))
|
|
72
71
|
if exact_match_coin:
|
|
73
72
|
log.debug(f"selected coin with an exact match: {exact_match_coin}")
|
|
74
73
|
return {exact_match_coin}
|
|
@@ -85,12 +84,12 @@ async def select_coins(
|
|
|
85
84
|
log.debug(f"Selected all smaller coins because they equate to an exact match of the target.: {smaller_coins}")
|
|
86
85
|
return set(smaller_coins)
|
|
87
86
|
elif smaller_coin_sum < amount:
|
|
88
|
-
smallest_coin:
|
|
87
|
+
smallest_coin: Coin | None = select_smallest_coin_over_target(amount, valid_spendable_coins)
|
|
89
88
|
assert smallest_coin is not None # Since we know we have enough, there must be a larger coin
|
|
90
89
|
log.debug(f"Selected closest greater coin: {smallest_coin.name()}")
|
|
91
90
|
return {smallest_coin}
|
|
92
91
|
elif smaller_coin_sum > amount:
|
|
93
|
-
coin_set:
|
|
92
|
+
coin_set: set[Coin] | None = knapsack_coin_algorithm(
|
|
94
93
|
smaller_coins, amount, coin_selection_config.max_coin_amount, max_num_coins
|
|
95
94
|
)
|
|
96
95
|
log.debug(f"Selected coins from knapsack algorithm: {coin_set}")
|
|
@@ -107,7 +106,7 @@ async def select_coins(
|
|
|
107
106
|
return coin_set
|
|
108
107
|
else:
|
|
109
108
|
# if smaller_coin_sum == amount and (len(smaller_coins) >= max_num_coins or amount == 0)
|
|
110
|
-
potential_large_coin:
|
|
109
|
+
potential_large_coin: Coin | None = select_smallest_coin_over_target(amount, valid_spendable_coins)
|
|
111
110
|
if potential_large_coin is None:
|
|
112
111
|
raise ValueError("Too many coins are required to make this transaction")
|
|
113
112
|
log.debug(f"Resorted to selecting smallest coin over target due to dust.: {potential_large_coin}")
|
|
@@ -119,7 +118,7 @@ async def select_coins(
|
|
|
119
118
|
|
|
120
119
|
|
|
121
120
|
# we use this to check if one of the coins exactly matches the target.
|
|
122
|
-
def check_for_exact_match(coin_list: list[Coin], target: uint64) ->
|
|
121
|
+
def check_for_exact_match(coin_list: list[Coin], target: uint64) -> Coin | None:
|
|
123
122
|
for coin in coin_list:
|
|
124
123
|
if coin.amount == target:
|
|
125
124
|
return coin
|
|
@@ -128,7 +127,7 @@ def check_for_exact_match(coin_list: list[Coin], target: uint64) -> Optional[Coi
|
|
|
128
127
|
|
|
129
128
|
# amount of coins smaller than target, followed by a list of all valid spendable coins.
|
|
130
129
|
# Coins must be sorted in descending amount order.
|
|
131
|
-
def select_smallest_coin_over_target(target: uint128, sorted_coin_list: list[Coin]) ->
|
|
130
|
+
def select_smallest_coin_over_target(target: uint128, sorted_coin_list: list[Coin]) -> Coin | None:
|
|
132
131
|
if sorted_coin_list[0].amount < target:
|
|
133
132
|
return None
|
|
134
133
|
for coin in reversed(sorted_coin_list):
|
|
@@ -141,9 +140,9 @@ def select_smallest_coin_over_target(target: uint128, sorted_coin_list: list[Coi
|
|
|
141
140
|
# IMPORTANT: The coins have to be sorted in descending order or else this function will not work.
|
|
142
141
|
def knapsack_coin_algorithm(
|
|
143
142
|
smaller_coins: list[Coin], target: uint128, max_coin_amount: int, max_num_coins: int, seed: bytes = b"knapsack seed"
|
|
144
|
-
) ->
|
|
143
|
+
) -> set[Coin] | None:
|
|
145
144
|
best_set_sum = max_coin_amount
|
|
146
|
-
best_set_of_coins:
|
|
145
|
+
best_set_of_coins: set[Coin] | None = None
|
|
147
146
|
ran: random.Random = random.Random()
|
|
148
147
|
ran.seed(seed)
|
|
149
148
|
for i in range(1000):
|
|
@@ -177,7 +176,7 @@ def knapsack_coin_algorithm(
|
|
|
177
176
|
|
|
178
177
|
# Adds up the largest coins in the list, resulting in the minimum number of selected coins. A solution
|
|
179
178
|
# is guaranteed if and only if the sum(coins) >= target. Coins must be sorted in descending amount order.
|
|
180
|
-
def sum_largest_coins(target: uint128, sorted_coins: list[Coin]) ->
|
|
179
|
+
def sum_largest_coins(target: uint128, sorted_coins: list[Coin]) -> set[Coin] | None:
|
|
181
180
|
total_value = 0
|
|
182
181
|
selected_coins: set[Coin] = set()
|
|
183
182
|
for coin in sorted_coins:
|
chia/wallet/conditions.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from collections.abc import Iterable
|
|
5
5
|
from dataclasses import dataclass, fields, replace
|
|
6
|
-
from typing import Any, ClassVar,
|
|
6
|
+
from typing import Any, ClassVar, TypeVar, final, get_type_hints
|
|
7
7
|
|
|
8
8
|
from chia_rs import Coin, G1Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -14,7 +14,7 @@ from chia.types.blockchain_format.program import Program
|
|
|
14
14
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
15
15
|
from chia.util.casts import int_from_bytes, int_to_bytes
|
|
16
16
|
from chia.util.hash import std_hash
|
|
17
|
-
from chia.util.streamable import Streamable, streamable
|
|
17
|
+
from chia.util.streamable import Streamable, StreamableFields, streamable
|
|
18
18
|
|
|
19
19
|
_T_Condition = TypeVar("_T_Condition", bound="Condition")
|
|
20
20
|
|
|
@@ -34,14 +34,14 @@ class Condition(Streamable, ABC):
|
|
|
34
34
|
class AggSigParent(Condition):
|
|
35
35
|
pubkey: G1Element
|
|
36
36
|
msg: bytes
|
|
37
|
-
parent_id:
|
|
37
|
+
parent_id: bytes32 | None = None
|
|
38
38
|
|
|
39
39
|
def to_program(self) -> Program:
|
|
40
40
|
condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT, self.pubkey.to_bytes(), self.msg])
|
|
41
41
|
return condition
|
|
42
42
|
|
|
43
43
|
@classmethod
|
|
44
|
-
def from_program(cls, program: Program, parent_id:
|
|
44
|
+
def from_program(cls, program: Program, parent_id: bytes32 | None = None) -> AggSigParent:
|
|
45
45
|
return cls(
|
|
46
46
|
G1Element.from_bytes(program.at("rf").as_atom()),
|
|
47
47
|
program.at("rrf").as_atom(),
|
|
@@ -55,14 +55,14 @@ class AggSigParent(Condition):
|
|
|
55
55
|
class AggSigPuzzle(Condition):
|
|
56
56
|
pubkey: G1Element
|
|
57
57
|
msg: bytes
|
|
58
|
-
puzzle_hash:
|
|
58
|
+
puzzle_hash: bytes32 | None = None
|
|
59
59
|
|
|
60
60
|
def to_program(self) -> Program:
|
|
61
61
|
condition: Program = Program.to([ConditionOpcode.AGG_SIG_PUZZLE, self.pubkey.to_bytes(), self.msg])
|
|
62
62
|
return condition
|
|
63
63
|
|
|
64
64
|
@classmethod
|
|
65
|
-
def from_program(cls, program: Program, puzzle_hash:
|
|
65
|
+
def from_program(cls, program: Program, puzzle_hash: bytes32 | None = None) -> AggSigPuzzle:
|
|
66
66
|
return cls(
|
|
67
67
|
G1Element.from_bytes(program.at("rf").as_atom()),
|
|
68
68
|
program.at("rrf").as_atom(),
|
|
@@ -76,14 +76,14 @@ class AggSigPuzzle(Condition):
|
|
|
76
76
|
class AggSigAmount(Condition):
|
|
77
77
|
pubkey: G1Element
|
|
78
78
|
msg: bytes
|
|
79
|
-
amount:
|
|
79
|
+
amount: uint64 | None = None
|
|
80
80
|
|
|
81
81
|
def to_program(self) -> Program:
|
|
82
82
|
condition: Program = Program.to([ConditionOpcode.AGG_SIG_AMOUNT, self.pubkey.to_bytes(), self.msg])
|
|
83
83
|
return condition
|
|
84
84
|
|
|
85
85
|
@classmethod
|
|
86
|
-
def from_program(cls, program: Program, amount:
|
|
86
|
+
def from_program(cls, program: Program, amount: uint64 | None = None) -> AggSigAmount:
|
|
87
87
|
return cls(
|
|
88
88
|
G1Element.from_bytes(program.at("rf").as_atom()),
|
|
89
89
|
program.at("rrf").as_atom(),
|
|
@@ -97,8 +97,8 @@ class AggSigAmount(Condition):
|
|
|
97
97
|
class AggSigPuzzleAmount(Condition):
|
|
98
98
|
pubkey: G1Element
|
|
99
99
|
msg: bytes
|
|
100
|
-
puzzle_hash:
|
|
101
|
-
amount:
|
|
100
|
+
puzzle_hash: bytes32 | None = None
|
|
101
|
+
amount: uint64 | None = None
|
|
102
102
|
|
|
103
103
|
def to_program(self) -> Program:
|
|
104
104
|
condition: Program = Program.to([ConditionOpcode.AGG_SIG_PUZZLE_AMOUNT, self.pubkey.to_bytes(), self.msg])
|
|
@@ -108,8 +108,8 @@ class AggSigPuzzleAmount(Condition):
|
|
|
108
108
|
def from_program(
|
|
109
109
|
cls,
|
|
110
110
|
program: Program,
|
|
111
|
-
puzzle_hash:
|
|
112
|
-
amount:
|
|
111
|
+
puzzle_hash: bytes32 | None = None,
|
|
112
|
+
amount: uint64 | None = None,
|
|
113
113
|
) -> AggSigPuzzleAmount:
|
|
114
114
|
return cls(
|
|
115
115
|
G1Element.from_bytes(program.at("rf").as_atom()),
|
|
@@ -125,8 +125,8 @@ class AggSigPuzzleAmount(Condition):
|
|
|
125
125
|
class AggSigParentAmount(Condition):
|
|
126
126
|
pubkey: G1Element
|
|
127
127
|
msg: bytes
|
|
128
|
-
parent_id:
|
|
129
|
-
amount:
|
|
128
|
+
parent_id: bytes32 | None = None
|
|
129
|
+
amount: uint64 | None = None
|
|
130
130
|
|
|
131
131
|
def to_program(self) -> Program:
|
|
132
132
|
condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT_AMOUNT, self.pubkey.to_bytes(), self.msg])
|
|
@@ -136,8 +136,8 @@ class AggSigParentAmount(Condition):
|
|
|
136
136
|
def from_program(
|
|
137
137
|
cls,
|
|
138
138
|
program: Program,
|
|
139
|
-
parent_id:
|
|
140
|
-
amount:
|
|
139
|
+
parent_id: bytes32 | None = None,
|
|
140
|
+
amount: uint64 | None = None,
|
|
141
141
|
) -> AggSigParentAmount:
|
|
142
142
|
return cls(
|
|
143
143
|
G1Element.from_bytes(program.at("rf").as_atom()),
|
|
@@ -153,8 +153,8 @@ class AggSigParentAmount(Condition):
|
|
|
153
153
|
class AggSigParentPuzzle(Condition):
|
|
154
154
|
pubkey: G1Element
|
|
155
155
|
msg: bytes
|
|
156
|
-
parent_id:
|
|
157
|
-
puzzle_hash:
|
|
156
|
+
parent_id: bytes32 | None = None
|
|
157
|
+
puzzle_hash: bytes32 | None = None
|
|
158
158
|
|
|
159
159
|
def to_program(self) -> Program:
|
|
160
160
|
condition: Program = Program.to([ConditionOpcode.AGG_SIG_PARENT_PUZZLE, self.pubkey.to_bytes(), self.msg])
|
|
@@ -164,8 +164,8 @@ class AggSigParentPuzzle(Condition):
|
|
|
164
164
|
def from_program(
|
|
165
165
|
cls,
|
|
166
166
|
program: Program,
|
|
167
|
-
parent_id:
|
|
168
|
-
puzzle_hash:
|
|
167
|
+
parent_id: bytes32 | None = None,
|
|
168
|
+
puzzle_hash: bytes32 | None = None,
|
|
169
169
|
) -> AggSigParentPuzzle:
|
|
170
170
|
return cls(
|
|
171
171
|
G1Element.from_bytes(program.at("rf").as_atom()),
|
|
@@ -200,8 +200,8 @@ class AggSigUnsafe(Condition):
|
|
|
200
200
|
class AggSigMe(Condition):
|
|
201
201
|
pubkey: G1Element
|
|
202
202
|
msg: bytes
|
|
203
|
-
coin_id:
|
|
204
|
-
additional_data:
|
|
203
|
+
coin_id: bytes32 | None = None
|
|
204
|
+
additional_data: bytes32 | None = None
|
|
205
205
|
|
|
206
206
|
def to_program(self) -> Program:
|
|
207
207
|
condition: Program = Program.to([ConditionOpcode.AGG_SIG_ME, self.pubkey.to_bytes(), self.msg])
|
|
@@ -211,8 +211,8 @@ class AggSigMe(Condition):
|
|
|
211
211
|
def from_program(
|
|
212
212
|
cls,
|
|
213
213
|
program: Program,
|
|
214
|
-
coin_id:
|
|
215
|
-
additional_data:
|
|
214
|
+
coin_id: bytes32 | None = None,
|
|
215
|
+
additional_data: bytes32 | None = None,
|
|
216
216
|
) -> AggSigMe:
|
|
217
217
|
return cls(
|
|
218
218
|
G1Element.from_bytes(program.at("rf").as_atom()),
|
|
@@ -228,7 +228,7 @@ class AggSigMe(Condition):
|
|
|
228
228
|
class CreateCoin(Condition):
|
|
229
229
|
puzzle_hash: bytes32
|
|
230
230
|
amount: uint64
|
|
231
|
-
memos:
|
|
231
|
+
memos: list[bytes] | None = None
|
|
232
232
|
|
|
233
233
|
def to_program(self) -> Program:
|
|
234
234
|
condition_args = [ConditionOpcode.CREATE_COIN, self.puzzle_hash, self.amount]
|
|
@@ -245,12 +245,12 @@ class CreateCoin(Condition):
|
|
|
245
245
|
uint64(program.at("rrf").as_int()),
|
|
246
246
|
(
|
|
247
247
|
None
|
|
248
|
-
if potential_memos == Program.
|
|
248
|
+
if potential_memos == Program.NIL
|
|
249
249
|
else [memo.as_atom() for memo in potential_memos.at("f").as_iter()]
|
|
250
250
|
),
|
|
251
251
|
)
|
|
252
252
|
|
|
253
|
-
def as_condition_args(self) -> list[
|
|
253
|
+
def as_condition_args(self) -> list[bytes32 | uint64 | list[bytes] | None]:
|
|
254
254
|
return [self.puzzle_hash, self.amount, self.memos]
|
|
255
255
|
|
|
256
256
|
|
|
@@ -275,9 +275,9 @@ class ReserveFee(Condition):
|
|
|
275
275
|
@streamable
|
|
276
276
|
@dataclass(frozen=True)
|
|
277
277
|
class AssertCoinAnnouncement(Condition):
|
|
278
|
-
msg:
|
|
279
|
-
asserted_id:
|
|
280
|
-
asserted_msg:
|
|
278
|
+
msg: bytes32 | None = None
|
|
279
|
+
asserted_id: bytes32 | None = None
|
|
280
|
+
asserted_msg: bytes | None = None
|
|
281
281
|
|
|
282
282
|
def __post_init__(self) -> None:
|
|
283
283
|
if self.msg is None and (self.asserted_id is None or self.asserted_msg is None):
|
|
@@ -305,8 +305,8 @@ class AssertCoinAnnouncement(Condition):
|
|
|
305
305
|
def from_program(
|
|
306
306
|
cls,
|
|
307
307
|
program: Program,
|
|
308
|
-
asserted_id:
|
|
309
|
-
asserted_msg:
|
|
308
|
+
asserted_id: bytes32 | None = None,
|
|
309
|
+
asserted_msg: bytes | None = None,
|
|
310
310
|
) -> AssertCoinAnnouncement:
|
|
311
311
|
return cls(
|
|
312
312
|
bytes32(program.at("rf").as_atom()),
|
|
@@ -320,7 +320,7 @@ class AssertCoinAnnouncement(Condition):
|
|
|
320
320
|
@dataclass(frozen=True)
|
|
321
321
|
class CreateCoinAnnouncement(Condition):
|
|
322
322
|
msg: bytes
|
|
323
|
-
coin_id:
|
|
323
|
+
coin_id: bytes32 | None = None
|
|
324
324
|
|
|
325
325
|
def corresponding_assertion(self) -> AssertCoinAnnouncement:
|
|
326
326
|
if self.coin_id is None:
|
|
@@ -333,7 +333,7 @@ class CreateCoinAnnouncement(Condition):
|
|
|
333
333
|
return condition
|
|
334
334
|
|
|
335
335
|
@classmethod
|
|
336
|
-
def from_program(cls, program: Program, coin_id:
|
|
336
|
+
def from_program(cls, program: Program, coin_id: bytes32 | None = None) -> CreateCoinAnnouncement:
|
|
337
337
|
return cls(
|
|
338
338
|
program.at("rf").as_atom(),
|
|
339
339
|
coin_id,
|
|
@@ -344,9 +344,9 @@ class CreateCoinAnnouncement(Condition):
|
|
|
344
344
|
@streamable
|
|
345
345
|
@dataclass(frozen=True)
|
|
346
346
|
class AssertPuzzleAnnouncement(Condition):
|
|
347
|
-
msg:
|
|
348
|
-
asserted_ph:
|
|
349
|
-
asserted_msg:
|
|
347
|
+
msg: bytes32 | None = None
|
|
348
|
+
asserted_ph: bytes32 | None = None
|
|
349
|
+
asserted_msg: bytes | None = None
|
|
350
350
|
|
|
351
351
|
def __post_init__(self) -> None:
|
|
352
352
|
if self.msg is None and (self.asserted_ph is None or self.asserted_msg is None):
|
|
@@ -374,8 +374,8 @@ class AssertPuzzleAnnouncement(Condition):
|
|
|
374
374
|
def from_program(
|
|
375
375
|
cls,
|
|
376
376
|
program: Program,
|
|
377
|
-
asserted_ph:
|
|
378
|
-
asserted_msg:
|
|
377
|
+
asserted_ph: bytes32 | None = None,
|
|
378
|
+
asserted_msg: bytes | None = None,
|
|
379
379
|
) -> AssertPuzzleAnnouncement:
|
|
380
380
|
return cls(
|
|
381
381
|
bytes32(program.at("rf").as_atom()),
|
|
@@ -389,7 +389,7 @@ class AssertPuzzleAnnouncement(Condition):
|
|
|
389
389
|
@dataclass(frozen=True)
|
|
390
390
|
class CreatePuzzleAnnouncement(Condition):
|
|
391
391
|
msg: bytes
|
|
392
|
-
puzzle_hash:
|
|
392
|
+
puzzle_hash: bytes32 | None = None
|
|
393
393
|
|
|
394
394
|
def corresponding_assertion(self) -> AssertPuzzleAnnouncement:
|
|
395
395
|
if self.puzzle_hash is None:
|
|
@@ -402,7 +402,7 @@ class CreatePuzzleAnnouncement(Condition):
|
|
|
402
402
|
return condition
|
|
403
403
|
|
|
404
404
|
@classmethod
|
|
405
|
-
def from_program(cls, program: Program, puzzle_hash:
|
|
405
|
+
def from_program(cls, program: Program, puzzle_hash: bytes32 | None = None) -> CreatePuzzleAnnouncement:
|
|
406
406
|
return cls(
|
|
407
407
|
program.at("rf").as_atom(),
|
|
408
408
|
puzzle_hash,
|
|
@@ -413,11 +413,11 @@ class CreatePuzzleAnnouncement(Condition):
|
|
|
413
413
|
@streamable
|
|
414
414
|
@dataclass(frozen=True)
|
|
415
415
|
class MessageParticipant(Streamable):
|
|
416
|
-
mode_integer:
|
|
417
|
-
parent_id_committed:
|
|
418
|
-
puzzle_hash_committed:
|
|
419
|
-
amount_committed:
|
|
420
|
-
coin_id_committed:
|
|
416
|
+
mode_integer: uint8 | None = None
|
|
417
|
+
parent_id_committed: bytes32 | None = None
|
|
418
|
+
puzzle_hash_committed: bytes32 | None = None
|
|
419
|
+
amount_committed: uint64 | None = None
|
|
420
|
+
coin_id_committed: bytes32 | None = None
|
|
421
421
|
|
|
422
422
|
def __post_init__(self) -> None:
|
|
423
423
|
if (
|
|
@@ -470,7 +470,7 @@ class MessageParticipant(Streamable):
|
|
|
470
470
|
if self.coin_id_committed is not None:
|
|
471
471
|
return uint8(0b111)
|
|
472
472
|
|
|
473
|
-
def convert_noneness_to_bit(maybe_none:
|
|
473
|
+
def convert_noneness_to_bit(maybe_none: Any | None) -> int:
|
|
474
474
|
return 1 if maybe_none is not None else 0
|
|
475
475
|
|
|
476
476
|
return uint8(
|
|
@@ -498,7 +498,7 @@ class MessageParticipant(Streamable):
|
|
|
498
498
|
|
|
499
499
|
@classmethod
|
|
500
500
|
def from_mode_and_maybe_args(
|
|
501
|
-
cls, sender: bool, full_mode: uint8, args:
|
|
501
|
+
cls, sender: bool, full_mode: uint8, args: Iterable[Program] | None = None
|
|
502
502
|
) -> MessageParticipant:
|
|
503
503
|
if sender:
|
|
504
504
|
mode = full_mode >> 3
|
|
@@ -511,12 +511,12 @@ class MessageParticipant(Streamable):
|
|
|
511
511
|
if mode == 0b111:
|
|
512
512
|
return cls(mode_integer=uint8(mode), coin_id_committed=next(bytes32(arg.as_atom()) for arg in args))
|
|
513
513
|
|
|
514
|
-
parent_id_committed:
|
|
515
|
-
puzzle_hash_committed:
|
|
516
|
-
amount_committed:
|
|
514
|
+
parent_id_committed: bytes32 | None = None
|
|
515
|
+
puzzle_hash_committed: bytes32 | None = None
|
|
516
|
+
amount_committed: uint64 | None = None
|
|
517
517
|
# This loop probably looks a little strange
|
|
518
518
|
# It's trying to account for the fact that the arguments may be any 1 or 2 of these arguments in this order
|
|
519
|
-
# Not sure of a more
|
|
519
|
+
# Not sure of a more elegant way to do it
|
|
520
520
|
original_mode = mode
|
|
521
521
|
for arg in args:
|
|
522
522
|
if mode & 0b100:
|
|
@@ -543,14 +543,14 @@ class MessageParticipant(Streamable):
|
|
|
543
543
|
@dataclass(frozen=True)
|
|
544
544
|
class SendMessage(Condition):
|
|
545
545
|
msg: bytes
|
|
546
|
-
var_args:
|
|
547
|
-
mode_integer:
|
|
548
|
-
sender:
|
|
549
|
-
receiver:
|
|
546
|
+
var_args: list[Program] | None = None
|
|
547
|
+
mode_integer: uint8 | None = None
|
|
548
|
+
sender: MessageParticipant | None = None
|
|
549
|
+
receiver: MessageParticipant | None = None
|
|
550
550
|
_other_party_is_receiver: ClassVar[bool] = True
|
|
551
551
|
|
|
552
552
|
@property
|
|
553
|
-
def _other_party(self) ->
|
|
553
|
+
def _other_party(self) -> MessageParticipant | None:
|
|
554
554
|
return self.receiver
|
|
555
555
|
|
|
556
556
|
@property
|
|
@@ -625,7 +625,7 @@ class ReceiveMessage(SendMessage):
|
|
|
625
625
|
_other_party_is_receiver: ClassVar[bool] = False
|
|
626
626
|
|
|
627
627
|
@property
|
|
628
|
-
def _other_party(self) ->
|
|
628
|
+
def _other_party(self) -> MessageParticipant | None:
|
|
629
629
|
return self.sender
|
|
630
630
|
|
|
631
631
|
@property
|
|
@@ -966,9 +966,7 @@ class UnknownCondition(Condition):
|
|
|
966
966
|
|
|
967
967
|
@classmethod
|
|
968
968
|
def from_program(cls, program: Program) -> UnknownCondition:
|
|
969
|
-
return cls(
|
|
970
|
-
program.at("f"), [] if program.at("r") == Program.to(None) else [p for p in program.at("r").as_iter()]
|
|
971
|
-
)
|
|
969
|
+
return cls(program.at("f"), [] if program.at("r") == Program.NIL else [p for p in program.at("r").as_iter()])
|
|
972
970
|
|
|
973
971
|
|
|
974
972
|
# Abstractions
|
|
@@ -979,18 +977,18 @@ class AggSig(Condition):
|
|
|
979
977
|
pubkey: G1Element
|
|
980
978
|
msg: bytes
|
|
981
979
|
opcode: bytes = ConditionOpcode.AGG_SIG_ME.value
|
|
982
|
-
coin_id:
|
|
983
|
-
parent_id:
|
|
984
|
-
puzzle_hash:
|
|
985
|
-
amount:
|
|
986
|
-
additional_data:
|
|
980
|
+
coin_id: bytes32 | None = None
|
|
981
|
+
parent_id: bytes32 | None = None
|
|
982
|
+
puzzle_hash: bytes32 | None = None
|
|
983
|
+
amount: uint64 | None = None
|
|
984
|
+
additional_data: bytes32 | None = None
|
|
987
985
|
|
|
988
986
|
def to_program(self) -> Program:
|
|
989
987
|
# We know we are an agg sig or we want to error
|
|
990
988
|
return CONDITION_DRIVERS[self.opcode](self.pubkey.to_bytes(), self.msg).to_program() # type: ignore[call-arg]
|
|
991
989
|
|
|
992
990
|
@classmethod
|
|
993
|
-
def from_program(cls, program: Program, **kwargs:
|
|
991
|
+
def from_program(cls, program: Program, **kwargs: uint64 | bytes32 | None) -> AggSig:
|
|
994
992
|
opcode: bytes = program.at("f").as_atom()
|
|
995
993
|
condition_driver: Condition = CONDITION_DRIVERS[opcode].from_program(program, **kwargs)
|
|
996
994
|
return cls(
|
|
@@ -1008,7 +1006,7 @@ class AggSig(Condition):
|
|
|
1008
1006
|
class CreateAnnouncement(Condition):
|
|
1009
1007
|
msg: bytes
|
|
1010
1008
|
coin_not_puzzle: bool
|
|
1011
|
-
origin_id:
|
|
1009
|
+
origin_id: bytes32 | None = None
|
|
1012
1010
|
|
|
1013
1011
|
def corresponding_assertion(self) -> AssertAnnouncement:
|
|
1014
1012
|
if self.origin_id is None:
|
|
@@ -1023,14 +1021,14 @@ class CreateAnnouncement(Condition):
|
|
|
1023
1021
|
return CreatePuzzleAnnouncement(self.msg, self.origin_id).to_program()
|
|
1024
1022
|
|
|
1025
1023
|
@classmethod
|
|
1026
|
-
def from_program(cls, program: Program, **kwargs:
|
|
1024
|
+
def from_program(cls, program: Program, **kwargs: bytes32 | None) -> CreateAnnouncement:
|
|
1027
1025
|
if program.at("f").as_atom() == ConditionOpcode.CREATE_COIN_ANNOUNCEMENT:
|
|
1028
1026
|
coin_not_puzzle: bool = True
|
|
1029
|
-
condition:
|
|
1027
|
+
condition: CreateCoinAnnouncement | CreatePuzzleAnnouncement = CreateCoinAnnouncement.from_program(
|
|
1030
1028
|
program, **kwargs
|
|
1031
1029
|
)
|
|
1032
1030
|
assert isinstance(condition, CreateCoinAnnouncement)
|
|
1033
|
-
origin_id:
|
|
1031
|
+
origin_id: bytes32 | None = condition.coin_id
|
|
1034
1032
|
else:
|
|
1035
1033
|
coin_not_puzzle = False
|
|
1036
1034
|
condition = CreatePuzzleAnnouncement.from_program(program, **kwargs)
|
|
@@ -1048,9 +1046,9 @@ class CreateAnnouncement(Condition):
|
|
|
1048
1046
|
@dataclass(frozen=True)
|
|
1049
1047
|
class AssertAnnouncement(Condition):
|
|
1050
1048
|
coin_not_puzzle: bool
|
|
1051
|
-
msg:
|
|
1052
|
-
asserted_origin_id:
|
|
1053
|
-
asserted_msg:
|
|
1049
|
+
msg: bytes32 | None = None
|
|
1050
|
+
asserted_origin_id: bytes32 | None = None
|
|
1051
|
+
asserted_msg: bytes | None = None
|
|
1054
1052
|
|
|
1055
1053
|
def __post_init__(self) -> None:
|
|
1056
1054
|
if self.msg is None and (self.asserted_origin_id is None or self.asserted_msg is None):
|
|
@@ -1077,14 +1075,14 @@ class AssertAnnouncement(Condition):
|
|
|
1077
1075
|
return CreateAnnouncement(self.asserted_msg, self.coin_not_puzzle, self.asserted_origin_id)
|
|
1078
1076
|
|
|
1079
1077
|
@classmethod
|
|
1080
|
-
def from_program(cls, program: Program, **kwargs:
|
|
1078
|
+
def from_program(cls, program: Program, **kwargs: bytes32 | None) -> AssertAnnouncement:
|
|
1081
1079
|
if program.at("f").as_atom() == ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT:
|
|
1082
1080
|
coin_not_puzzle: bool = True
|
|
1083
|
-
condition:
|
|
1081
|
+
condition: AssertCoinAnnouncement | AssertPuzzleAnnouncement = AssertCoinAnnouncement.from_program(
|
|
1084
1082
|
program, **kwargs
|
|
1085
1083
|
)
|
|
1086
1084
|
assert isinstance(condition, AssertCoinAnnouncement)
|
|
1087
|
-
asserted_origin_id:
|
|
1085
|
+
asserted_origin_id: bytes32 | None = condition.asserted_id
|
|
1088
1086
|
else:
|
|
1089
1087
|
coin_not_puzzle = False
|
|
1090
1088
|
condition = AssertPuzzleAnnouncement.from_program(program, **kwargs)
|
|
@@ -1098,16 +1096,16 @@ class AssertAnnouncement(Condition):
|
|
|
1098
1096
|
)
|
|
1099
1097
|
|
|
1100
1098
|
|
|
1101
|
-
TIMELOCK_TYPES =
|
|
1102
|
-
AssertSecondsRelative
|
|
1103
|
-
AssertHeightRelative
|
|
1104
|
-
AssertSecondsAbsolute
|
|
1105
|
-
AssertHeightAbsolute
|
|
1106
|
-
AssertBeforeSecondsRelative
|
|
1107
|
-
AssertBeforeHeightRelative
|
|
1108
|
-
AssertBeforeSecondsAbsolute
|
|
1109
|
-
AssertBeforeHeightAbsolute
|
|
1110
|
-
|
|
1099
|
+
TIMELOCK_TYPES = (
|
|
1100
|
+
AssertSecondsRelative
|
|
1101
|
+
| AssertHeightRelative
|
|
1102
|
+
| AssertSecondsAbsolute
|
|
1103
|
+
| AssertHeightAbsolute
|
|
1104
|
+
| AssertBeforeSecondsRelative
|
|
1105
|
+
| AssertBeforeHeightRelative
|
|
1106
|
+
| AssertBeforeSecondsAbsolute
|
|
1107
|
+
| AssertBeforeHeightAbsolute
|
|
1108
|
+
)
|
|
1111
1109
|
|
|
1112
1110
|
|
|
1113
1111
|
TIMELOCK_DRIVERS: tuple[
|
|
@@ -1375,7 +1373,7 @@ def parse_conditions_non_consensus(
|
|
|
1375
1373
|
def conditions_from_json_dicts(conditions: Iterable[dict[str, Any]]) -> list[Condition]:
|
|
1376
1374
|
final_condition_list: list[Condition] = []
|
|
1377
1375
|
for condition in conditions:
|
|
1378
|
-
opcode_specified:
|
|
1376
|
+
opcode_specified: str | int = condition["opcode"]
|
|
1379
1377
|
if isinstance(opcode_specified, str):
|
|
1380
1378
|
try:
|
|
1381
1379
|
opcode: bytes = ConditionOpcode[opcode_specified]
|
|
@@ -1408,37 +1406,75 @@ def conditions_to_json_dicts(conditions: Iterable[Condition]) -> list[dict[str,
|
|
|
1408
1406
|
|
|
1409
1407
|
@streamable
|
|
1410
1408
|
@dataclass(frozen=True)
|
|
1411
|
-
class
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
max_secs_after_created: Optional[uint64] = None # ASSERT_BEFORE_SECONDS_RELATIVE
|
|
1417
|
-
max_time: Optional[uint64] = None # ASSERT_BEFORE_SECONDS_ABSOLUTE
|
|
1418
|
-
max_blocks_after_created: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_RELATIVE
|
|
1419
|
-
max_height: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_ABSOLUTE
|
|
1409
|
+
class ConditionValidTimesAbsolute(Streamable):
|
|
1410
|
+
min_time: uint64 | None = None # ASSERT_SECONDS_ABSOLUTE
|
|
1411
|
+
min_height: uint32 | None = None # ASSERT_HEIGHT_ABSOLUTE
|
|
1412
|
+
max_time: uint64 | None = None # ASSERT_BEFORE_SECONDS_ABSOLUTE
|
|
1413
|
+
max_height: uint32 | None = None # ASSERT_BEFORE_HEIGHT_ABSOLUTE
|
|
1420
1414
|
|
|
1421
1415
|
def to_conditions(self) -> list[Condition]:
|
|
1422
1416
|
final_condition_list: list[Condition] = []
|
|
1423
|
-
if self.min_secs_since_created is not None:
|
|
1424
|
-
final_condition_list.append(AssertSecondsRelative(self.min_secs_since_created))
|
|
1425
1417
|
if self.min_time is not None:
|
|
1426
1418
|
final_condition_list.append(AssertSecondsAbsolute(self.min_time))
|
|
1427
|
-
if self.min_blocks_since_created is not None:
|
|
1428
|
-
final_condition_list.append(AssertHeightRelative(self.min_blocks_since_created))
|
|
1429
1419
|
if self.min_height is not None:
|
|
1430
1420
|
final_condition_list.append(AssertHeightAbsolute(self.min_height))
|
|
1431
|
-
if self.max_secs_after_created is not None:
|
|
1432
|
-
final_condition_list.append(AssertBeforeSecondsRelative(self.max_secs_after_created))
|
|
1433
1421
|
if self.max_time is not None:
|
|
1434
1422
|
final_condition_list.append(AssertBeforeSecondsAbsolute(self.max_time))
|
|
1435
|
-
if self.max_blocks_after_created is not None:
|
|
1436
|
-
final_condition_list.append(AssertBeforeHeightRelative(self.max_blocks_after_created))
|
|
1437
1423
|
if self.max_height is not None:
|
|
1438
1424
|
final_condition_list.append(AssertBeforeHeightAbsolute(self.max_height))
|
|
1425
|
+
return final_condition_list
|
|
1426
|
+
|
|
1427
|
+
|
|
1428
|
+
@streamable
|
|
1429
|
+
@dataclass(frozen=True)
|
|
1430
|
+
class ConditionValidTimes(ConditionValidTimesAbsolute):
|
|
1431
|
+
min_secs_since_created: uint64 | None = None # ASSERT_SECONDS_RELATIVE
|
|
1432
|
+
min_blocks_since_created: uint32 | None = None # ASSERT_HEIGHT_RELATIVE
|
|
1433
|
+
max_secs_after_created: uint64 | None = None # ASSERT_BEFORE_SECONDS_RELATIVE
|
|
1434
|
+
max_blocks_after_created: uint32 | None = None # ASSERT_BEFORE_HEIGHT_RELATIVE
|
|
1435
|
+
|
|
1436
|
+
@classmethod
|
|
1437
|
+
def streamable_fields(cls) -> StreamableFields:
|
|
1438
|
+
# A hack to serialize the fields in the order before this was inherited
|
|
1439
|
+
order_map = {
|
|
1440
|
+
name: i
|
|
1441
|
+
for i, name in enumerate(
|
|
1442
|
+
[
|
|
1443
|
+
"min_secs_since_created",
|
|
1444
|
+
"min_time",
|
|
1445
|
+
"min_blocks_since_created",
|
|
1446
|
+
"min_height",
|
|
1447
|
+
"max_secs_after_created",
|
|
1448
|
+
"max_time",
|
|
1449
|
+
"max_blocks_after_created",
|
|
1450
|
+
"max_height",
|
|
1451
|
+
]
|
|
1452
|
+
)
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
return tuple(sorted(cls._streamable_fields, key=lambda item: order_map[item.name]))
|
|
1456
|
+
|
|
1457
|
+
def to_conditions(self) -> list[Condition]:
|
|
1458
|
+
final_condition_list = super().to_conditions()
|
|
1459
|
+
if self.min_secs_since_created is not None:
|
|
1460
|
+
final_condition_list.append(AssertSecondsRelative(self.min_secs_since_created))
|
|
1461
|
+
if self.min_blocks_since_created is not None:
|
|
1462
|
+
final_condition_list.append(AssertHeightRelative(self.min_blocks_since_created))
|
|
1463
|
+
if self.max_secs_after_created is not None:
|
|
1464
|
+
final_condition_list.append(AssertBeforeSecondsRelative(self.max_secs_after_created))
|
|
1465
|
+
if self.max_blocks_after_created is not None:
|
|
1466
|
+
final_condition_list.append(AssertBeforeHeightRelative(self.max_blocks_after_created))
|
|
1439
1467
|
|
|
1440
1468
|
return final_condition_list
|
|
1441
1469
|
|
|
1470
|
+
def only_absolutes(self) -> ConditionValidTimesAbsolute:
|
|
1471
|
+
return ConditionValidTimesAbsolute(
|
|
1472
|
+
min_time=self.min_time,
|
|
1473
|
+
min_height=self.min_height,
|
|
1474
|
+
max_time=self.max_time,
|
|
1475
|
+
max_height=self.max_height,
|
|
1476
|
+
)
|
|
1477
|
+
|
|
1442
1478
|
|
|
1443
1479
|
condition_valid_times_hints = get_type_hints(ConditionValidTimes)
|
|
1444
1480
|
condition_valid_times_types: dict[str, type[int]] = {}
|
|
@@ -1494,7 +1530,7 @@ def parse_timelock_info(conditions: Iterable[Condition]) -> ConditionValidTimes:
|
|
|
1494
1530
|
|
|
1495
1531
|
assert len(properties_left) == 1
|
|
1496
1532
|
final_property: str = next(iter(properties_left))
|
|
1497
|
-
current_value:
|
|
1533
|
+
current_value: int | None = getattr(valid_times, final_property)
|
|
1498
1534
|
if current_value is not None:
|
|
1499
1535
|
if min_not_max:
|
|
1500
1536
|
new_value: int = min(current_value, timelock.timestamp)
|