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/util/ws_message.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
from chia_rs.sized_bytes import bytes32
|
|
6
6
|
from typing_extensions import TypedDict
|
|
@@ -47,7 +47,7 @@ def create_payload(command: str, data: dict[str, Any], origin: str, destination:
|
|
|
47
47
|
return dict_to_json_str(response)
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
def create_payload_dict(command: str, data:
|
|
50
|
+
def create_payload_dict(command: str, data: dict[str, Any] | None, origin: str, destination: str) -> WsRpcMessage:
|
|
51
51
|
if data is None:
|
|
52
52
|
data = {}
|
|
53
53
|
|
|
@@ -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.sized_bytes import bytes32
|
|
7
6
|
from chia_rs.sized_ints import uint64
|
|
@@ -16,7 +15,7 @@ from chia.wallet.vc_wallet.cr_cat_drivers import ProofsChecker
|
|
|
16
15
|
@dataclass(frozen=True)
|
|
17
16
|
class CATInfo(Streamable):
|
|
18
17
|
limitations_program_hash: bytes32
|
|
19
|
-
my_tail:
|
|
18
|
+
my_tail: Program | None # this is the program
|
|
20
19
|
|
|
21
20
|
|
|
22
21
|
@streamable
|
|
@@ -41,8 +40,8 @@ class CATCoinData(Streamable):
|
|
|
41
40
|
@dataclass(frozen=True)
|
|
42
41
|
class LegacyCATInfo(Streamable):
|
|
43
42
|
limitations_program_hash: bytes32
|
|
44
|
-
my_tail:
|
|
45
|
-
lineage_proofs: list[tuple[bytes32,
|
|
43
|
+
my_tail: Program | None # this is the program
|
|
44
|
+
lineage_proofs: list[tuple[bytes32, LineageProof | None]] # {coin.name(): lineage_proof}
|
|
46
45
|
|
|
47
46
|
|
|
48
47
|
@streamable
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from collections.abc import Callable
|
|
3
4
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
5
6
|
|
|
6
7
|
from chia_rs import CoinSpend
|
|
7
8
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -23,13 +24,13 @@ from chia.wallet.uncurried_puzzle import UncurriedPuzzle, uncurry_puzzle
|
|
|
23
24
|
|
|
24
25
|
@dataclass(frozen=True)
|
|
25
26
|
class CATOuterPuzzle:
|
|
26
|
-
_match: Callable[[UncurriedPuzzle],
|
|
27
|
+
_match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
|
|
27
28
|
_construct: Callable[[PuzzleInfo, Program], Program]
|
|
28
29
|
_solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
|
|
29
|
-
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle,
|
|
30
|
-
_get_inner_solution: Callable[[PuzzleInfo, Program],
|
|
30
|
+
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
|
|
31
|
+
_get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
|
|
31
32
|
|
|
32
|
-
def match(self, puzzle: UncurriedPuzzle) ->
|
|
33
|
+
def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
|
|
33
34
|
args = match_cat_puzzle(puzzle)
|
|
34
35
|
if args is None:
|
|
35
36
|
return None
|
|
@@ -44,31 +45,31 @@ class CATOuterPuzzle:
|
|
|
44
45
|
return PuzzleInfo(constructor_dict)
|
|
45
46
|
|
|
46
47
|
def get_inner_puzzle(
|
|
47
|
-
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution:
|
|
48
|
-
) ->
|
|
48
|
+
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
|
|
49
|
+
) -> Program | None:
|
|
49
50
|
args = match_cat_puzzle(puzzle_reveal)
|
|
50
51
|
if args is None:
|
|
51
52
|
raise ValueError("This driver is not for the specified puzzle reveal")
|
|
52
53
|
_, _, inner_puzzle = args
|
|
53
54
|
also = constructor.also()
|
|
54
55
|
if also is not None:
|
|
55
|
-
deep_inner_puzzle:
|
|
56
|
+
deep_inner_puzzle: Program | None = self._get_inner_puzzle(
|
|
56
57
|
also, uncurry_puzzle(inner_puzzle), solution.first() if solution is not None else None
|
|
57
58
|
)
|
|
58
59
|
return deep_inner_puzzle
|
|
59
60
|
else:
|
|
60
61
|
return inner_puzzle
|
|
61
62
|
|
|
62
|
-
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) ->
|
|
63
|
+
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
|
|
63
64
|
my_inner_solution: Program = solution.first()
|
|
64
65
|
also = constructor.also()
|
|
65
66
|
if also:
|
|
66
|
-
deep_inner_solution:
|
|
67
|
+
deep_inner_solution: Program | None = self._get_inner_solution(also, my_inner_solution)
|
|
67
68
|
return deep_inner_solution
|
|
68
69
|
else:
|
|
69
70
|
return my_inner_solution
|
|
70
71
|
|
|
71
|
-
def asset_id(self, constructor: PuzzleInfo) ->
|
|
72
|
+
def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
|
|
72
73
|
return bytes32(constructor["tail"])
|
|
73
74
|
|
|
74
75
|
def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
|
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
from collections.abc import Iterator
|
|
5
|
-
from typing import Optional, Union
|
|
6
5
|
|
|
7
6
|
from chia_puzzles_py.programs import CAT_PUZZLE, CAT_PUZZLE_HASH
|
|
8
7
|
from chia_rs import G2Element
|
|
@@ -44,7 +43,7 @@ class SpendableCAT:
|
|
|
44
43
|
limitations_program_reveal: Program = dataclasses.field(default_factory=empty_program)
|
|
45
44
|
|
|
46
45
|
|
|
47
|
-
def match_cat_puzzle(puzzle: UncurriedPuzzle) ->
|
|
46
|
+
def match_cat_puzzle(puzzle: UncurriedPuzzle) -> Iterator[Program] | None:
|
|
48
47
|
"""
|
|
49
48
|
Given the curried puzzle and args, test if it's a CAT and,
|
|
50
49
|
if it is, return the curried arguments
|
|
@@ -67,8 +66,8 @@ def get_innerpuzzle_from_puzzle(puzzle: Program) -> Program:
|
|
|
67
66
|
def construct_cat_puzzle(
|
|
68
67
|
mod_code: Program,
|
|
69
68
|
limitations_program_hash: bytes32,
|
|
70
|
-
inner_puzzle_or_hash:
|
|
71
|
-
mod_code_hash:
|
|
69
|
+
inner_puzzle_or_hash: Program | bytes32,
|
|
70
|
+
mod_code_hash: bytes32 | None = None,
|
|
72
71
|
) -> Program:
|
|
73
72
|
"""
|
|
74
73
|
Given an inner puzzle and a tail hash, calculate a puzzle program for a specific cc.
|
|
@@ -4,7 +4,7 @@ import dataclasses
|
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
6
|
import traceback
|
|
7
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
7
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
8
8
|
|
|
9
9
|
from chia_rs import G1Element
|
|
10
10
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -39,7 +39,6 @@ from chia.wallet.conditions import (
|
|
|
39
39
|
CreateCoin,
|
|
40
40
|
CreateCoinAnnouncement,
|
|
41
41
|
UnknownCondition,
|
|
42
|
-
parse_timelock_info,
|
|
43
42
|
)
|
|
44
43
|
from chia.wallet.derivation_record import DerivationRecord
|
|
45
44
|
from chia.wallet.lineage_proof import LineageProof
|
|
@@ -49,7 +48,6 @@ from chia.wallet.puzzles.tails import ALL_LIMITATIONS_PROGRAMS
|
|
|
49
48
|
from chia.wallet.transaction_record import TransactionRecord
|
|
50
49
|
from chia.wallet.uncurried_puzzle import uncurry_puzzle
|
|
51
50
|
from chia.wallet.util.compute_additions import compute_additions_with_cost
|
|
52
|
-
from chia.wallet.util.compute_memos import compute_memos
|
|
53
51
|
from chia.wallet.util.curry_and_treehash import curry_and_treehash
|
|
54
52
|
from chia.wallet.util.transaction_type import TransactionType
|
|
55
53
|
from chia.wallet.util.wallet_sync_utils import fetch_coin_spend_for_coin_state
|
|
@@ -97,8 +95,8 @@ class CATWallet:
|
|
|
97
95
|
wallet_info_type: ClassVar[type[CATInfo]] = CATInfo
|
|
98
96
|
|
|
99
97
|
@staticmethod
|
|
100
|
-
def default_wallet_name_for_unknown_cat(
|
|
101
|
-
return f"CAT {
|
|
98
|
+
def default_wallet_name_for_unknown_cat(limitations_program_hash: bytes32) -> str:
|
|
99
|
+
return f"CAT {limitations_program_hash.hex()[:16]}..."
|
|
102
100
|
|
|
103
101
|
@staticmethod
|
|
104
102
|
async def create_new_cat_wallet(
|
|
@@ -108,7 +106,7 @@ class CATWallet:
|
|
|
108
106
|
amount: uint64,
|
|
109
107
|
action_scope: WalletActionScope,
|
|
110
108
|
fee: uint64 = uint64(0),
|
|
111
|
-
name:
|
|
109
|
+
name: str | None = None,
|
|
112
110
|
push: bool = True,
|
|
113
111
|
) -> CATWallet:
|
|
114
112
|
self = CATWallet()
|
|
@@ -154,7 +152,7 @@ class CATWallet:
|
|
|
154
152
|
# since we didn't yet know the TAIL. Now we know the TAIL, we can update the name
|
|
155
153
|
# according to the template name for unknown/new CATs.
|
|
156
154
|
if original_name is None:
|
|
157
|
-
name = self.default_wallet_name_for_unknown_cat(self.cat_info.limitations_program_hash
|
|
155
|
+
name = self.default_wallet_name_for_unknown_cat(self.cat_info.limitations_program_hash)
|
|
158
156
|
await self.set_name(name)
|
|
159
157
|
|
|
160
158
|
# Change and actual CAT coin
|
|
@@ -202,30 +200,27 @@ class CATWallet:
|
|
|
202
200
|
cls,
|
|
203
201
|
wallet_state_manager: WalletStateManager,
|
|
204
202
|
wallet: Wallet,
|
|
205
|
-
|
|
206
|
-
name:
|
|
203
|
+
limitations_program_hash: bytes32,
|
|
204
|
+
name: str | None = None,
|
|
207
205
|
) -> Self:
|
|
208
206
|
self = cls()
|
|
209
207
|
self.standard_wallet = wallet
|
|
210
208
|
self.log = logging.getLogger(__name__)
|
|
211
209
|
|
|
212
|
-
limitations_program_hash_hex = bytes32.from_hexstr(limitations_program_hash_hex).hex() # Normalize the format
|
|
213
|
-
|
|
214
210
|
for id, w in wallet_state_manager.wallets.items():
|
|
215
211
|
if w.type() == cls.type():
|
|
216
212
|
assert isinstance(w, cls)
|
|
217
|
-
if w.get_asset_id() ==
|
|
213
|
+
if w.get_asset_id() == limitations_program_hash:
|
|
218
214
|
self.log.warning("Not creating wallet for already existing CAT wallet")
|
|
219
215
|
return w
|
|
220
216
|
|
|
221
217
|
self.wallet_state_manager = wallet_state_manager
|
|
222
|
-
if
|
|
223
|
-
cat_info = DEFAULT_CATS[
|
|
218
|
+
if limitations_program_hash.hex() in DEFAULT_CATS:
|
|
219
|
+
cat_info = DEFAULT_CATS[limitations_program_hash.hex()]
|
|
224
220
|
name = cat_info["name"]
|
|
225
221
|
elif name is None:
|
|
226
|
-
name = self.default_wallet_name_for_unknown_cat(
|
|
222
|
+
name = self.default_wallet_name_for_unknown_cat(limitations_program_hash)
|
|
227
223
|
|
|
228
|
-
limitations_program_hash = bytes32.from_hexstr(limitations_program_hash_hex)
|
|
229
224
|
self.cat_info = cls.wallet_info_type(limitations_program_hash, None)
|
|
230
225
|
info_as_string = bytes(self.cat_info).hex()
|
|
231
226
|
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, self.wallet_type, info_as_string)
|
|
@@ -256,14 +251,14 @@ class CATWallet:
|
|
|
256
251
|
wallet_state_manager: WalletStateManager,
|
|
257
252
|
wallet: Wallet,
|
|
258
253
|
puzzle_driver: PuzzleInfo,
|
|
259
|
-
name:
|
|
254
|
+
name: str | None = None,
|
|
260
255
|
# We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
|
|
261
|
-
potential_subclasses:
|
|
256
|
+
potential_subclasses: dict[AssetType, Any] | None = None,
|
|
262
257
|
) -> Any:
|
|
263
258
|
if potential_subclasses is None:
|
|
264
259
|
potential_subclasses = {}
|
|
265
260
|
|
|
266
|
-
next_layer:
|
|
261
|
+
next_layer: PuzzleInfo | None = puzzle_driver.also()
|
|
267
262
|
if next_layer is not None:
|
|
268
263
|
if AssetType(next_layer.type()) in potential_subclasses:
|
|
269
264
|
return await potential_subclasses[AssetType(next_layer.type())].create_from_puzzle_info(
|
|
@@ -276,7 +271,7 @@ class CATWallet:
|
|
|
276
271
|
return await cls.get_or_create_wallet_for_cat(
|
|
277
272
|
wallet_state_manager,
|
|
278
273
|
wallet,
|
|
279
|
-
puzzle_driver["tail"]
|
|
274
|
+
puzzle_driver["tail"],
|
|
280
275
|
name,
|
|
281
276
|
)
|
|
282
277
|
|
|
@@ -315,7 +310,7 @@ class CATWallet:
|
|
|
315
310
|
def id(self) -> uint32:
|
|
316
311
|
return self.wallet_info.id
|
|
317
312
|
|
|
318
|
-
async def get_confirmed_balance(self, record_list:
|
|
313
|
+
async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
|
|
319
314
|
if record_list is None:
|
|
320
315
|
record_list = await self.wallet_state_manager.coin_store.get_unspent_coins_for_wallet(self.id())
|
|
321
316
|
|
|
@@ -328,7 +323,7 @@ class CATWallet:
|
|
|
328
323
|
self.log.info(f"Confirmed balance for cat wallet {self.id()} is {amount}")
|
|
329
324
|
return uint128(amount)
|
|
330
325
|
|
|
331
|
-
async def get_unconfirmed_balance(self, unspent_records:
|
|
326
|
+
async def get_unconfirmed_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
332
327
|
return await self.wallet_state_manager.get_unconfirmed_balance(self.id(), unspent_records)
|
|
333
328
|
|
|
334
329
|
@property
|
|
@@ -340,15 +335,15 @@ class CATWallet:
|
|
|
340
335
|
# avoid full block TXs
|
|
341
336
|
return int(self.wallet_state_manager.constants.MAX_BLOCK_COST_CLVM / 2 / self.cost_of_single_tx)
|
|
342
337
|
|
|
343
|
-
async def
|
|
344
|
-
|
|
345
|
-
|
|
338
|
+
async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
339
|
+
return uint128(
|
|
340
|
+
sum(
|
|
341
|
+
cr.coin.amount
|
|
342
|
+
for cr in await self.wallet_state_manager.get_spendable_coins_for_wallet(
|
|
343
|
+
self.id(), records, in_one_block=True
|
|
344
|
+
)
|
|
345
|
+
)
|
|
346
346
|
)
|
|
347
|
-
spendable.sort(reverse=True, key=lambda record: record.coin.amount)
|
|
348
|
-
return set(spendable[0 : min(len(spendable), self.max_send_quantity)])
|
|
349
|
-
|
|
350
|
-
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
351
|
-
return uint128(sum(cr.coin.amount for cr in await self.get_max_spendable_coins()))
|
|
352
347
|
|
|
353
348
|
def get_name(self) -> str:
|
|
354
349
|
return self.wallet_info.name
|
|
@@ -358,11 +353,11 @@ class CATWallet:
|
|
|
358
353
|
self.wallet_info = new_info
|
|
359
354
|
await self.wallet_state_manager.user_store.update_wallet(self.wallet_info)
|
|
360
355
|
|
|
361
|
-
def get_asset_id(self) ->
|
|
362
|
-
return
|
|
356
|
+
def get_asset_id(self) -> bytes32:
|
|
357
|
+
return self.cat_info.limitations_program_hash
|
|
363
358
|
|
|
364
359
|
async def coin_added(
|
|
365
|
-
self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data:
|
|
360
|
+
self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data: CATCoinData | None
|
|
366
361
|
) -> None:
|
|
367
362
|
"""Notification from wallet state manager that wallet has been received."""
|
|
368
363
|
self.log.info(f"CAT wallet has been notified that {coin.name().hex()} was added")
|
|
@@ -396,7 +391,7 @@ class CATWallet:
|
|
|
396
391
|
except Exception as e:
|
|
397
392
|
self.log.debug(f"Exception: {e}, traceback: {traceback.format_exc()}")
|
|
398
393
|
|
|
399
|
-
async def puzzle_solution_received(self, coin: Coin, parent_coin_data:
|
|
394
|
+
async def puzzle_solution_received(self, coin: Coin, parent_coin_data: CATCoinData | None) -> None:
|
|
400
395
|
coin_name = coin.parent_coin_info
|
|
401
396
|
if parent_coin_data is not None:
|
|
402
397
|
assert isinstance(parent_coin_data, CATCoinData)
|
|
@@ -443,8 +438,8 @@ class CATWallet:
|
|
|
443
438
|
|
|
444
439
|
return derivation_record.puzzle_hash
|
|
445
440
|
|
|
446
|
-
async def get_spendable_balance(self, records:
|
|
447
|
-
coins = await self.
|
|
441
|
+
async def get_spendable_balance(self, records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
442
|
+
coins = await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), records)
|
|
448
443
|
amount = 0
|
|
449
444
|
for record in coins:
|
|
450
445
|
amount += record.coin.amount
|
|
@@ -477,19 +472,9 @@ class CATWallet:
|
|
|
477
472
|
|
|
478
473
|
return uint64(addition_amount)
|
|
479
474
|
|
|
480
|
-
async def
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
record_list: set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
|
|
484
|
-
self.id(), records
|
|
485
|
-
)
|
|
486
|
-
|
|
487
|
-
for record in record_list:
|
|
488
|
-
lineage = await self.get_lineage_proof_for_coin(record.coin)
|
|
489
|
-
if lineage is not None and not lineage.is_none():
|
|
490
|
-
result.append(record)
|
|
491
|
-
|
|
492
|
-
return list(await self.get_max_spendable_coins(set(result)))
|
|
475
|
+
async def is_coin_spendable(self, record: WalletCoinRecord) -> bool:
|
|
476
|
+
lineage = await self.get_lineage_proof_for_coin(record.coin)
|
|
477
|
+
return lineage is not None and not lineage.is_none()
|
|
493
478
|
|
|
494
479
|
async def select_coins(
|
|
495
480
|
self,
|
|
@@ -501,7 +486,9 @@ class CATWallet:
|
|
|
501
486
|
Note: Must be called under wallet state manager lock
|
|
502
487
|
"""
|
|
503
488
|
spendable_amount: uint128 = await self.get_spendable_balance()
|
|
504
|
-
spendable_coins: list[WalletCoinRecord] =
|
|
489
|
+
spendable_coins: list[WalletCoinRecord] = list(
|
|
490
|
+
await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), in_one_block=True)
|
|
491
|
+
)
|
|
505
492
|
|
|
506
493
|
# Try to use coins from the store, if there isn't enough of "unused"
|
|
507
494
|
# coins use change coins that are not confirmed yet
|
|
@@ -522,24 +509,24 @@ class CATWallet:
|
|
|
522
509
|
return coins
|
|
523
510
|
|
|
524
511
|
async def inner_puzzle_for_cat_puzhash(self, cat_hash: bytes32) -> Program:
|
|
525
|
-
record:
|
|
526
|
-
DerivationRecord
|
|
527
|
-
|
|
512
|
+
record: (
|
|
513
|
+
DerivationRecord | None
|
|
514
|
+
) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(cat_hash)
|
|
528
515
|
if record is None:
|
|
529
516
|
raise RuntimeError(f"Missing Derivation Record for CAT puzzle_hash {cat_hash}")
|
|
530
517
|
inner_puzzle: Program = self.standard_wallet.puzzle_for_pk(record.pubkey)
|
|
531
518
|
return inner_puzzle
|
|
532
519
|
|
|
533
520
|
async def convert_puzzle_hash(self, puzzle_hash: bytes32) -> bytes32:
|
|
534
|
-
record:
|
|
535
|
-
DerivationRecord
|
|
536
|
-
|
|
521
|
+
record: (
|
|
522
|
+
DerivationRecord | None
|
|
523
|
+
) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(puzzle_hash)
|
|
537
524
|
if record is None:
|
|
538
525
|
return puzzle_hash # TODO: check if we have a test for this case!
|
|
539
526
|
else:
|
|
540
527
|
return (await self.inner_puzzle_for_cat_puzhash(puzzle_hash)).get_tree_hash()
|
|
541
528
|
|
|
542
|
-
async def get_lineage_proof_for_coin(self, coin: Coin) ->
|
|
529
|
+
async def get_lineage_proof_for_coin(self, coin: Coin) -> LineageProof | None:
|
|
543
530
|
return await self.lineage_store.get_lineage_proof(coin.parent_coin_info)
|
|
544
531
|
|
|
545
532
|
async def create_tandem_xch_tx(
|
|
@@ -548,13 +535,13 @@ class CATWallet:
|
|
|
548
535
|
amount_to_claim: uint64,
|
|
549
536
|
action_scope: WalletActionScope,
|
|
550
537
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
551
|
-
) ->
|
|
538
|
+
) -> AssertCoinAnnouncement | None:
|
|
552
539
|
"""
|
|
553
540
|
This function creates a non-CAT transaction to pay fees, contribute funds for issuance, and absorb melt value.
|
|
554
541
|
It is meant to be called in `generate_unsigned_spendbundle` and as such should be called under the
|
|
555
542
|
wallet_state_manager lock
|
|
556
543
|
"""
|
|
557
|
-
announcement:
|
|
544
|
+
announcement: AssertCoinAnnouncement | None = None
|
|
558
545
|
async with self.wallet_state_manager.new_action_scope(
|
|
559
546
|
action_scope.config.tx_config, push=False
|
|
560
547
|
) as inner_action_scope:
|
|
@@ -622,8 +609,8 @@ class CATWallet:
|
|
|
622
609
|
payments: list[CreateCoin],
|
|
623
610
|
action_scope: WalletActionScope,
|
|
624
611
|
fee: uint64 = uint64(0),
|
|
625
|
-
cat_discrepancy:
|
|
626
|
-
coins:
|
|
612
|
+
cat_discrepancy: tuple[int, Program, Program] | None = None, # (extra_delta, tail_reveal, tail_solution)
|
|
613
|
+
coins: set[Coin] | None = None,
|
|
627
614
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
628
615
|
) -> WalletSpendBundle:
|
|
629
616
|
if cat_discrepancy is not None:
|
|
@@ -683,7 +670,7 @@ class CATWallet:
|
|
|
683
670
|
cat_condition = UnknownCondition(
|
|
684
671
|
opcode=Program.to(51),
|
|
685
672
|
args=[
|
|
686
|
-
Program.
|
|
673
|
+
Program.NIL,
|
|
687
674
|
Program.to(-113),
|
|
688
675
|
tail_reveal,
|
|
689
676
|
tail_solution,
|
|
@@ -757,13 +744,13 @@ class CATWallet:
|
|
|
757
744
|
puzzle_hashes: list[bytes32],
|
|
758
745
|
action_scope: WalletActionScope,
|
|
759
746
|
fee: uint64 = uint64(0),
|
|
760
|
-
coins:
|
|
761
|
-
memos:
|
|
747
|
+
coins: set[Coin] | None = None,
|
|
748
|
+
memos: list[list[bytes]] | None = None,
|
|
762
749
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
763
750
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
764
751
|
) -> None:
|
|
765
752
|
# (extra_delta, tail_reveal, tail_solution)
|
|
766
|
-
cat_discrepancy:
|
|
753
|
+
cat_discrepancy: tuple[int, Program, Program] | None = kwargs.get("cat_discrepancy", None)
|
|
767
754
|
if memos is None:
|
|
768
755
|
memos = [[] for _ in range(len(puzzle_hashes))]
|
|
769
756
|
|
|
@@ -794,29 +781,20 @@ class CATWallet:
|
|
|
794
781
|
removal for tx in interface.side_effects.transactions for removal in tx.additions
|
|
795
782
|
}
|
|
796
783
|
interface.side_effects.transactions.append(
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
to_puzzle_hash=puzzle_hashes[0],
|
|
801
|
-
to_address=self.wallet_state_manager.encode_puzzle_hash(puzzle_hashes[0]),
|
|
784
|
+
self.wallet_state_manager.new_outgoing_transaction(
|
|
785
|
+
wallet_id=self.id(),
|
|
786
|
+
puzzle_hash=puzzle_hashes[0],
|
|
802
787
|
amount=uint64(payment_sum),
|
|
803
|
-
|
|
804
|
-
confirmed=False,
|
|
805
|
-
sent=uint32(0),
|
|
788
|
+
fee=fee,
|
|
806
789
|
spend_bundle=spend_bundle,
|
|
807
790
|
additions=list(set(spend_bundle.additions()) - other_tx_additions),
|
|
808
791
|
removals=list(set(spend_bundle.removals()) - other_tx_removals),
|
|
809
|
-
wallet_id=self.id(),
|
|
810
|
-
sent_to=[],
|
|
811
|
-
trade_id=None,
|
|
812
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
813
792
|
name=spend_bundle.name(),
|
|
814
|
-
|
|
815
|
-
valid_times=parse_timelock_info(extra_conditions),
|
|
793
|
+
extra_conditions=extra_conditions,
|
|
816
794
|
)
|
|
817
795
|
)
|
|
818
796
|
|
|
819
|
-
async def add_lineage(self, name: bytes32, lineage:
|
|
797
|
+
async def add_lineage(self, name: bytes32, lineage: LineageProof | None) -> None:
|
|
820
798
|
"""
|
|
821
799
|
Lineage proofs are stored as a list of parent coins and the lineage proof you will need if they are the
|
|
822
800
|
parent of the coin you are trying to spend. 'If I'm your parent, here's the info you need to spend yourself'
|
|
@@ -840,16 +818,16 @@ class CATWallet:
|
|
|
840
818
|
async def match_puzzle_info(self, puzzle_driver: PuzzleInfo) -> bool:
|
|
841
819
|
return (
|
|
842
820
|
AssetType(puzzle_driver.type()) == AssetType.CAT
|
|
843
|
-
and puzzle_driver["tail"] ==
|
|
821
|
+
and puzzle_driver["tail"] == self.get_asset_id()
|
|
844
822
|
and puzzle_driver.also() is None
|
|
845
823
|
)
|
|
846
824
|
|
|
847
825
|
async def get_puzzle_info(self, asset_id: bytes32) -> PuzzleInfo:
|
|
848
|
-
return PuzzleInfo({"type": AssetType.CAT.value, "tail": "0x" + self.get_asset_id()})
|
|
826
|
+
return PuzzleInfo({"type": AssetType.CAT.value, "tail": "0x" + self.get_asset_id().hex()})
|
|
849
827
|
|
|
850
828
|
async def get_coins_to_offer(
|
|
851
829
|
self,
|
|
852
|
-
asset_id:
|
|
830
|
+
asset_id: bytes32 | None,
|
|
853
831
|
amount: uint64,
|
|
854
832
|
action_scope: WalletActionScope,
|
|
855
833
|
) -> set[Coin]:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from chia_rs.sized_bytes import bytes32
|
|
7
6
|
|
|
@@ -22,9 +21,9 @@ class CATLineageStore:
|
|
|
22
21
|
table_name: str
|
|
23
22
|
|
|
24
23
|
@classmethod
|
|
25
|
-
async def create(cls, db_wrapper: DBWrapper2, asset_id:
|
|
24
|
+
async def create(cls, db_wrapper: DBWrapper2, asset_id: bytes32) -> CATLineageStore:
|
|
26
25
|
self = cls()
|
|
27
|
-
self.table_name = f"lineage_proofs_{asset_id}"
|
|
26
|
+
self.table_name = f"lineage_proofs_{asset_id.hex()}"
|
|
28
27
|
self.db_wrapper = db_wrapper
|
|
29
28
|
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
30
29
|
await conn.execute(f"CREATE TABLE IF NOT EXISTS {self.table_name}(coin_id text PRIMARY KEY, lineage blob)")
|
|
@@ -46,7 +45,7 @@ class CATLineageStore:
|
|
|
46
45
|
)
|
|
47
46
|
await cursor.close()
|
|
48
47
|
|
|
49
|
-
async def get_lineage_proof(self, coin_id: bytes32) ->
|
|
48
|
+
async def get_lineage_proof(self, coin_id: bytes32) -> LineageProof | None:
|
|
50
49
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
51
50
|
cursor = await conn.execute(
|
|
52
51
|
f"SELECT * FROM {self.table_name} WHERE coin_id=?;",
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from enum import IntEnum
|
|
6
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
7
7
|
|
|
8
8
|
from chia_rs import G1Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -71,8 +71,8 @@ class RCATWallet(CATWallet):
|
|
|
71
71
|
create_new_cat_wallet = None # type: ignore[assignment]
|
|
72
72
|
|
|
73
73
|
@staticmethod
|
|
74
|
-
def default_wallet_name_for_unknown_cat(
|
|
75
|
-
return f"Revocable-CAT {
|
|
74
|
+
def default_wallet_name_for_unknown_cat(limitations_program_hash: bytes32) -> str:
|
|
75
|
+
return f"Revocable-CAT {limitations_program_hash.hex()[:16]}..."
|
|
76
76
|
|
|
77
77
|
# We need to override this with a different signature.
|
|
78
78
|
# It's not immediately clear what is proper here, likely needs a bit of a refactor.
|
|
@@ -81,31 +81,28 @@ class RCATWallet(CATWallet):
|
|
|
81
81
|
cls,
|
|
82
82
|
wallet_state_manager: WalletStateManager,
|
|
83
83
|
wallet: Wallet,
|
|
84
|
-
|
|
84
|
+
limitations_program_hash: bytes32,
|
|
85
85
|
hidden_puzzle_hash: bytes32,
|
|
86
|
-
name:
|
|
86
|
+
name: str | None = None,
|
|
87
87
|
) -> Self:
|
|
88
88
|
self = cls()
|
|
89
89
|
self.standard_wallet = wallet
|
|
90
90
|
self.log = logging.getLogger(__name__)
|
|
91
91
|
|
|
92
|
-
limitations_program_hash_hex = bytes32.from_hexstr(limitations_program_hash_hex).hex() # Normalize the format
|
|
93
|
-
|
|
94
92
|
for id, w in wallet_state_manager.wallets.items():
|
|
95
93
|
if w.type() == cls.type():
|
|
96
94
|
assert isinstance(w, cls)
|
|
97
|
-
if w.get_asset_id() ==
|
|
95
|
+
if w.get_asset_id() == limitations_program_hash:
|
|
98
96
|
self.log.warning("Not creating wallet for already existing CAT wallet")
|
|
99
97
|
return w
|
|
100
98
|
|
|
101
99
|
self.wallet_state_manager = wallet_state_manager
|
|
102
|
-
if
|
|
103
|
-
cat_info = DEFAULT_CATS[
|
|
100
|
+
if limitations_program_hash.hex() in DEFAULT_CATS:
|
|
101
|
+
cat_info = DEFAULT_CATS[limitations_program_hash.hex()]
|
|
104
102
|
name = cat_info["name"]
|
|
105
103
|
elif name is None:
|
|
106
|
-
name = self.default_wallet_name_for_unknown_cat(
|
|
104
|
+
name = self.default_wallet_name_for_unknown_cat(limitations_program_hash)
|
|
107
105
|
|
|
108
|
-
limitations_program_hash = bytes32.from_hexstr(limitations_program_hash_hex)
|
|
109
106
|
self.cat_info = cls.wallet_info_type(limitations_program_hash, None, hidden_puzzle_hash)
|
|
110
107
|
info_as_string = bytes(self.cat_info).hex()
|
|
111
108
|
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, cls.wallet_type, info_as_string)
|
|
@@ -137,20 +134,20 @@ class RCATWallet(CATWallet):
|
|
|
137
134
|
wallet_state_manager: WalletStateManager,
|
|
138
135
|
wallet: Wallet,
|
|
139
136
|
puzzle_driver: PuzzleInfo,
|
|
140
|
-
name:
|
|
137
|
+
name: str | None = None,
|
|
141
138
|
# We're hinting this as Any for mypy by should explore adding this to the wallet protocol and hinting properly
|
|
142
|
-
potential_subclasses:
|
|
139
|
+
potential_subclasses: dict[AssetType, Any] | None = None,
|
|
143
140
|
) -> Any:
|
|
144
141
|
if potential_subclasses is None:
|
|
145
142
|
potential_subclasses = {}
|
|
146
143
|
|
|
147
|
-
rev_layer:
|
|
144
|
+
rev_layer: PuzzleInfo | None = puzzle_driver.also()
|
|
148
145
|
if rev_layer is None:
|
|
149
146
|
raise ValueError("create_from_puzzle_info called on RCATWallet with a non R-CAT puzzle driver")
|
|
150
147
|
return await cls.get_or_create_wallet_for_cat(
|
|
151
148
|
wallet_state_manager,
|
|
152
149
|
wallet,
|
|
153
|
-
puzzle_driver["tail"]
|
|
150
|
+
puzzle_driver["tail"],
|
|
154
151
|
bytes32(rev_layer["hidden_puzzle_hash"]),
|
|
155
152
|
name,
|
|
156
153
|
)
|
|
@@ -165,7 +162,7 @@ class RCATWallet(CATWallet):
|
|
|
165
162
|
cat_wallet: CATWallet,
|
|
166
163
|
hidden_puzzle_hash: bytes32,
|
|
167
164
|
) -> bool:
|
|
168
|
-
if not cat_wallet.lineage_store.is_empty():
|
|
165
|
+
if not await cat_wallet.lineage_store.is_empty():
|
|
169
166
|
cat_wallet.log.error("Received a revocable CAT to a CAT wallet that already has CATs")
|
|
170
167
|
return False
|
|
171
168
|
replace_self = cls()
|
|
@@ -219,9 +216,9 @@ class RCATWallet(CATWallet):
|
|
|
219
216
|
primaries: list[CreateCoin],
|
|
220
217
|
conditions: tuple[Condition, ...] = tuple(),
|
|
221
218
|
) -> Program:
|
|
222
|
-
record:
|
|
223
|
-
DerivationRecord
|
|
224
|
-
|
|
219
|
+
record: (
|
|
220
|
+
DerivationRecord | None
|
|
221
|
+
) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(coin.puzzle_hash)
|
|
225
222
|
if record is None:
|
|
226
223
|
raise RuntimeError(f"Missing Derivation Record for CAT puzzle_hash {coin.puzzle_hash}")
|
|
227
224
|
return solve_revocation_layer(
|
|
@@ -234,7 +231,7 @@ class RCATWallet(CATWallet):
|
|
|
234
231
|
AssetType(puzzle_driver.type()) == AssetType.CAT
|
|
235
232
|
and puzzle_driver["tail"] == self.cat_info.limitations_program_hash
|
|
236
233
|
):
|
|
237
|
-
inner_puzzle_driver:
|
|
234
|
+
inner_puzzle_driver: PuzzleInfo | None = puzzle_driver.also()
|
|
238
235
|
if inner_puzzle_driver is None:
|
|
239
236
|
raise ValueError("Malformed puzzle driver passed to RCATWallet.match_puzzle_info")
|
|
240
237
|
return (
|
|
@@ -247,7 +244,7 @@ class RCATWallet(CATWallet):
|
|
|
247
244
|
return PuzzleInfo(
|
|
248
245
|
{
|
|
249
246
|
"type": AssetType.CAT.value,
|
|
250
|
-
"tail": "0x" + self.get_asset_id(),
|
|
247
|
+
"tail": "0x" + self.get_asset_id().hex(),
|
|
251
248
|
"also": {
|
|
252
249
|
"type": AssetType.REVOCATION_LAYER.value,
|
|
253
250
|
"hidden_puzzle_hash": "0x" + self.cat_info.hidden_puzzle_hash.hex(),
|