chia-blockchain 2.5.7rc3__py3-none-any.whl → 2.5.8rc1__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_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 +59 -30
- 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 +225 -62
- 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 +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- 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 +963 -839
- 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 +8 -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 +43 -47
- 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 +4 -6
- 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 +14 -14
- 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 +372 -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 +16 -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 +42 -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 +12 -7
- 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 +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- 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 +34 -13
- 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 +16 -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 +3 -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 +22 -8
- 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 +120 -105
- 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.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- 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.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc3.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
|
@@ -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.sized_bytes import bytes32
|
|
7
8
|
from chia_rs.sized_ints import uint64
|
|
@@ -16,14 +17,14 @@ from chia.wallet.vc_wallet.cr_cat_drivers import PROOF_FLAGS_CHECKER, construct_
|
|
|
16
17
|
|
|
17
18
|
@dataclass(frozen=True)
|
|
18
19
|
class CROuterPuzzle:
|
|
19
|
-
_match: Callable[[UncurriedPuzzle],
|
|
20
|
+
_match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
|
|
20
21
|
_construct: Callable[[PuzzleInfo, Program], Program]
|
|
21
22
|
_solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
|
|
22
|
-
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle,
|
|
23
|
-
_get_inner_solution: Callable[[PuzzleInfo, Program],
|
|
23
|
+
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
|
|
24
|
+
_get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
|
|
24
25
|
|
|
25
|
-
def match(self, puzzle: UncurriedPuzzle) ->
|
|
26
|
-
args:
|
|
26
|
+
def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
|
|
27
|
+
args: tuple[list[bytes32], Program, Program] | None = match_cr_layer(puzzle)
|
|
27
28
|
if args is None:
|
|
28
29
|
return None
|
|
29
30
|
authorized_providers, proofs_checker, inner_puzzle = args
|
|
@@ -38,29 +39,29 @@ class CROuterPuzzle:
|
|
|
38
39
|
return PuzzleInfo(constructor_dict)
|
|
39
40
|
|
|
40
41
|
def get_inner_puzzle(
|
|
41
|
-
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution:
|
|
42
|
-
) ->
|
|
43
|
-
args:
|
|
42
|
+
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
|
|
43
|
+
) -> Program | None:
|
|
44
|
+
args: tuple[list[bytes32], Program, Program] | None = match_cr_layer(puzzle_reveal)
|
|
44
45
|
if args is None:
|
|
45
46
|
raise ValueError("This driver is not for the specified puzzle reveal") # pragma: no cover
|
|
46
47
|
_, _, inner_puzzle = args
|
|
47
48
|
also = constructor.also()
|
|
48
49
|
if also is not None:
|
|
49
|
-
deep_inner_puzzle:
|
|
50
|
+
deep_inner_puzzle: Program | None = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
|
|
50
51
|
return deep_inner_puzzle
|
|
51
52
|
else:
|
|
52
53
|
return inner_puzzle
|
|
53
54
|
|
|
54
|
-
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) ->
|
|
55
|
+
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
|
|
55
56
|
my_inner_solution: Program = solution.at("rrrrrrf")
|
|
56
57
|
also = constructor.also()
|
|
57
58
|
if also:
|
|
58
|
-
deep_inner_solution:
|
|
59
|
+
deep_inner_solution: Program | None = self._get_inner_solution(also, my_inner_solution)
|
|
59
60
|
return deep_inner_solution
|
|
60
61
|
else:
|
|
61
62
|
return my_inner_solution
|
|
62
63
|
|
|
63
|
-
def asset_id(self, constructor: PuzzleInfo) ->
|
|
64
|
+
def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
|
|
64
65
|
return None
|
|
65
66
|
|
|
66
67
|
def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, replace
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from chia_puzzles_py.programs import ACS_TRANSFER_PROGRAM as ACS_TRANSFER_PROGRAM_BYTES
|
|
7
7
|
from chia_puzzles_py.programs import COVENANT_LAYER as COVENANT_LAYER_BYTES
|
|
@@ -89,7 +89,7 @@ def create_covenant_layer(initial_puzzle_hash: bytes32, parent_morpher: Program,
|
|
|
89
89
|
)
|
|
90
90
|
|
|
91
91
|
|
|
92
|
-
def match_covenant_layer(uncurried_puzzle: UncurriedPuzzle) ->
|
|
92
|
+
def match_covenant_layer(uncurried_puzzle: UncurriedPuzzle) -> tuple[bytes32, Program, Program] | None:
|
|
93
93
|
if uncurried_puzzle.mod == COVENANT_LAYER:
|
|
94
94
|
return (
|
|
95
95
|
bytes32(uncurried_puzzle.args.at("f").as_atom()),
|
|
@@ -129,7 +129,7 @@ def create_tp_covenant_adapter(covenant_layer: Program) -> Program:
|
|
|
129
129
|
return EML_TP_COVENANT_ADAPTER.curry(covenant_layer)
|
|
130
130
|
|
|
131
131
|
|
|
132
|
-
def match_tp_covenant_adapter(uncurried_puzzle: UncurriedPuzzle) ->
|
|
132
|
+
def match_tp_covenant_adapter(uncurried_puzzle: UncurriedPuzzle) -> Program | None: # pragma: no cover
|
|
133
133
|
if uncurried_puzzle.mod == EML_TP_COVENANT_ADAPTER:
|
|
134
134
|
return uncurried_puzzle.args.at("f")
|
|
135
135
|
else:
|
|
@@ -152,7 +152,7 @@ def create_did_tp(
|
|
|
152
152
|
EML_DID_TP_FULL_HASH = create_did_tp().get_tree_hash()
|
|
153
153
|
|
|
154
154
|
|
|
155
|
-
def match_did_tp(uncurried_puzzle: UncurriedPuzzle) ->
|
|
155
|
+
def match_did_tp(uncurried_puzzle: UncurriedPuzzle) -> tuple[()] | None:
|
|
156
156
|
if uncurried_puzzle.mod == EML_DID_TP:
|
|
157
157
|
return ()
|
|
158
158
|
else:
|
|
@@ -184,7 +184,7 @@ def create_revocation_layer(hidden_puzzle_hash: bytes32, inner_puzzle_hash: byte
|
|
|
184
184
|
)
|
|
185
185
|
|
|
186
186
|
|
|
187
|
-
def match_revocation_layer(uncurried_puzzle: UncurriedPuzzle) ->
|
|
187
|
+
def match_revocation_layer(uncurried_puzzle: UncurriedPuzzle) -> tuple[bytes32, bytes32] | None:
|
|
188
188
|
if uncurried_puzzle.mod == REVOCATION_LAYER:
|
|
189
189
|
return bytes32(uncurried_puzzle.args.at("rf").as_atom()), bytes32(uncurried_puzzle.args.at("rrf").as_atom())
|
|
190
190
|
else:
|
|
@@ -223,7 +223,7 @@ def create_eml_covenant_morpher(
|
|
|
223
223
|
|
|
224
224
|
|
|
225
225
|
def construct_exigent_metadata_layer(
|
|
226
|
-
metadata:
|
|
226
|
+
metadata: Program | None, transfer_program: Program, inner_puzzle: Program
|
|
227
227
|
) -> Program:
|
|
228
228
|
return EXTIGENT_METADATA_LAYER.curry(
|
|
229
229
|
EXTIGENT_METADATA_LAYER_HASH, metadata, transfer_program, transfer_program.get_tree_hash(), inner_puzzle
|
|
@@ -237,7 +237,7 @@ class VCLineageProof(LineageProof, Streamable):
|
|
|
237
237
|
The covenant layer for exigent metadata layers requires to be passed the previous parent's metadata too
|
|
238
238
|
"""
|
|
239
239
|
|
|
240
|
-
parent_proof_hash:
|
|
240
|
+
parent_proof_hash: bytes32 | None = None
|
|
241
241
|
|
|
242
242
|
|
|
243
243
|
def solve_std_vc_backdoor(
|
|
@@ -249,7 +249,7 @@ def solve_std_vc_backdoor(
|
|
|
249
249
|
eml_lineage_proof: VCLineageProof,
|
|
250
250
|
provider_innerpuzhash: bytes32,
|
|
251
251
|
coin_id: bytes32,
|
|
252
|
-
announcement_nonce:
|
|
252
|
+
announcement_nonce: bytes32 | None = None,
|
|
253
253
|
) -> Program:
|
|
254
254
|
"""
|
|
255
255
|
Solution to the STANDARD_BRICK_PUZZLE above. Requires proof info about pretty much the whole puzzle stack.
|
|
@@ -309,7 +309,7 @@ class VerifiedCredential(Streamable):
|
|
|
309
309
|
launcher_id: bytes32
|
|
310
310
|
inner_puzzle_hash: bytes32
|
|
311
311
|
proof_provider: bytes32
|
|
312
|
-
proof_hash:
|
|
312
|
+
proof_hash: bytes32 | None
|
|
313
313
|
|
|
314
314
|
@classmethod
|
|
315
315
|
def launch(
|
|
@@ -562,7 +562,7 @@ class VerifiedCredential(Streamable):
|
|
|
562
562
|
amount=uint64(parent_coin.amount),
|
|
563
563
|
)
|
|
564
564
|
if layer_below_singleton == OWNERSHIP_LAYER_LAUNCHER:
|
|
565
|
-
proof_hash:
|
|
565
|
+
proof_hash: bytes32 | None = None
|
|
566
566
|
eml_lineage_proof: VCLineageProof = VCLineageProof(
|
|
567
567
|
parent_name=parent_coin.parent_coin_info, amount=uint64(parent_coin.amount)
|
|
568
568
|
)
|
|
@@ -587,14 +587,14 @@ class VerifiedCredential(Streamable):
|
|
|
587
587
|
)
|
|
588
588
|
inner_puzzle_hash = bytes32(new_singleton_condition.at("rf").as_atom())
|
|
589
589
|
magic_condition = next(c for c in conditions if c.at("f").as_int() == -10)
|
|
590
|
-
if magic_condition.at("rrrf") == Program.
|
|
590
|
+
if magic_condition.at("rrrf") == Program.NIL:
|
|
591
591
|
proof_hash_as_prog: Program = metadata_layer.args.at("rfr")
|
|
592
592
|
elif magic_condition.at("rrrf").atom is not None:
|
|
593
593
|
raise ValueError("Specified VC was cleared")
|
|
594
594
|
else:
|
|
595
595
|
proof_hash_as_prog = magic_condition.at("rrrfrrf")
|
|
596
596
|
|
|
597
|
-
proof_hash = None if proof_hash_as_prog == Program.
|
|
597
|
+
proof_hash = None if proof_hash_as_prog == Program.NIL else bytes32(proof_hash_as_prog.as_atom())
|
|
598
598
|
|
|
599
599
|
proof_provider = bytes32(metadata_layer.args.at("rff").as_atom())
|
|
600
600
|
|
|
@@ -606,7 +606,7 @@ class VerifiedCredential(Streamable):
|
|
|
606
606
|
bytes32(uncurry_puzzle(metadata_layer.args.at("rrrrf")).args.at("rrf").as_atom()),
|
|
607
607
|
).get_tree_hash(),
|
|
608
608
|
amount=uint64(parent_coin.amount),
|
|
609
|
-
parent_proof_hash=None if parent_proof_hash == Program.
|
|
609
|
+
parent_proof_hash=None if parent_proof_hash == Program.NIL else parent_proof_hash,
|
|
610
610
|
)
|
|
611
611
|
|
|
612
612
|
new_vc: Self = cls(
|
|
@@ -627,9 +627,9 @@ class VerifiedCredential(Streamable):
|
|
|
627
627
|
# The methods in this section are useful for spending an existing VC
|
|
628
628
|
def magic_condition_for_new_proofs(
|
|
629
629
|
self,
|
|
630
|
-
new_proof_hash:
|
|
630
|
+
new_proof_hash: bytes32 | None,
|
|
631
631
|
provider_innerpuzhash: bytes32,
|
|
632
|
-
new_proof_provider:
|
|
632
|
+
new_proof_provider: bytes32 | None = None,
|
|
633
633
|
) -> Program:
|
|
634
634
|
"""
|
|
635
635
|
Returns the 'magic' condition that can update the metadata with a new proof hash. Returning this condition from
|
|
@@ -690,9 +690,9 @@ class VerifiedCredential(Streamable):
|
|
|
690
690
|
self,
|
|
691
691
|
inner_puzzle: Program,
|
|
692
692
|
inner_solution: Program,
|
|
693
|
-
new_proof_hash:
|
|
694
|
-
new_proof_provider:
|
|
695
|
-
) -> tuple[
|
|
693
|
+
new_proof_hash: bytes32 | None = None,
|
|
694
|
+
new_proof_provider: bytes32 | None = None,
|
|
695
|
+
) -> tuple[CreatePuzzleAnnouncement | None, CoinSpend, VerifiedCredential]:
|
|
696
696
|
"""
|
|
697
697
|
Given an inner puzzle reveal and solution, spend the VC (potentially updating the proofs in the process).
|
|
698
698
|
Note that the inner puzzle is already expected to output the 'magic' condition (which can be created above).
|
|
@@ -714,7 +714,7 @@ class VerifiedCredential(Streamable):
|
|
|
714
714
|
)
|
|
715
715
|
|
|
716
716
|
if new_proof_hash is not None:
|
|
717
|
-
expected_announcement:
|
|
717
|
+
expected_announcement: CreatePuzzleAnnouncement | None = CreatePuzzleAnnouncement(
|
|
718
718
|
std_hash(
|
|
719
719
|
self.coin.name()
|
|
720
720
|
+ Program.to(new_proof_hash).get_tree_hash()
|
|
@@ -744,7 +744,7 @@ class VerifiedCredential(Streamable):
|
|
|
744
744
|
)
|
|
745
745
|
|
|
746
746
|
def activate_backdoor(
|
|
747
|
-
self, provider_innerpuzhash: bytes32, announcement_nonce:
|
|
747
|
+
self, provider_innerpuzhash: bytes32, announcement_nonce: bytes32 | None = None
|
|
748
748
|
) -> tuple[CreatePuzzleAnnouncement, CoinSpend]:
|
|
749
749
|
"""
|
|
750
750
|
Activates the backdoor in the VC to revoke the credentials and remove the provider's DID.
|
|
@@ -778,7 +778,7 @@ class VerifiedCredential(Streamable):
|
|
|
778
778
|
)
|
|
779
779
|
|
|
780
780
|
expected_announcement: CreatePuzzleAnnouncement = CreatePuzzleAnnouncement(
|
|
781
|
-
std_hash(self.coin.name() + Program.
|
|
781
|
+
std_hash(self.coin.name() + Program.NIL.get_tree_hash() + ACS_TRANSFER_PROGRAM.get_tree_hash())
|
|
782
782
|
)
|
|
783
783
|
|
|
784
784
|
return (
|
|
@@ -789,7 +789,7 @@ class VerifiedCredential(Streamable):
|
|
|
789
789
|
####################################################################################################################
|
|
790
790
|
|
|
791
791
|
def _next_vc(
|
|
792
|
-
self, next_inner_puzzle_hash: bytes32, new_proof_hash:
|
|
792
|
+
self, next_inner_puzzle_hash: bytes32, new_proof_hash: bytes32 | None, next_amount: uint64
|
|
793
793
|
) -> VerifiedCredential:
|
|
794
794
|
"""
|
|
795
795
|
Private method that creates the next VC class instance.
|
|
@@ -830,7 +830,7 @@ class VerifiedCredential(Streamable):
|
|
|
830
830
|
# inside of a CAT.
|
|
831
831
|
@dataclass(frozen=True)
|
|
832
832
|
class RevocationOuterPuzzle:
|
|
833
|
-
def match(self, puzzle: UncurriedPuzzle) ->
|
|
833
|
+
def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
|
|
834
834
|
args = match_revocation_layer(puzzle)
|
|
835
835
|
if args is None:
|
|
836
836
|
return None
|
|
@@ -842,17 +842,17 @@ class RevocationOuterPuzzle:
|
|
|
842
842
|
return PuzzleInfo(constructor_dict)
|
|
843
843
|
|
|
844
844
|
def get_inner_puzzle(
|
|
845
|
-
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution:
|
|
846
|
-
) ->
|
|
845
|
+
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
|
|
846
|
+
) -> Program | None:
|
|
847
847
|
if solution is None:
|
|
848
848
|
raise ValueError("Cannot get_inner_puzzle of revocation layer without solution")
|
|
849
849
|
|
|
850
850
|
return solution.at("rf")
|
|
851
851
|
|
|
852
|
-
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) ->
|
|
852
|
+
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
|
|
853
853
|
return solution.at("rrf")
|
|
854
854
|
|
|
855
|
-
def asset_id(self, constructor: PuzzleInfo) ->
|
|
855
|
+
def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
|
|
856
856
|
return bytes32(constructor["hidden_puzzle_hash"])
|
|
857
857
|
|
|
858
858
|
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 functools import cmp_to_key
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
from aiosqlite import Row
|
|
8
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -24,7 +23,7 @@ class VCProofs:
|
|
|
24
23
|
|
|
25
24
|
def as_program(self) -> Program:
|
|
26
25
|
def byte_sort_pairs(f1: tuple[str, str], f2: tuple[str, str]) -> int:
|
|
27
|
-
return 1 if Program.to([10, (1, f1[0]), (1, f2[0])]).run([]) == Program.
|
|
26
|
+
return 1 if Program.to([10, (1, f1[0]), (1, f2[0])]).run([]) == Program.NIL else -1
|
|
28
27
|
|
|
29
28
|
prog: Program = Program.to(
|
|
30
29
|
list_to_binary_tree(
|
|
@@ -55,7 +54,7 @@ class VCProofs:
|
|
|
55
54
|
else:
|
|
56
55
|
raise ValueError("Malformatted VCProofs program") # pragma: no cover
|
|
57
56
|
|
|
58
|
-
def prove_keys(self, keys: list[str], tree:
|
|
57
|
+
def prove_keys(self, keys: list[str], tree: Program | None = None) -> Program:
|
|
59
58
|
if tree is None:
|
|
60
59
|
tree = self.as_program()
|
|
61
60
|
|
|
@@ -177,7 +176,7 @@ class VCStore:
|
|
|
177
176
|
),
|
|
178
177
|
)
|
|
179
178
|
|
|
180
|
-
async def get_vc_record(self, launcher_id: bytes32) ->
|
|
179
|
+
async def get_vc_record(self, launcher_id: bytes32) -> VCRecord | None:
|
|
181
180
|
"""
|
|
182
181
|
Checks DB for VC with specified launcher_id and returns it.
|
|
183
182
|
"""
|
|
@@ -235,7 +234,7 @@ class VCStore:
|
|
|
235
234
|
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
236
235
|
await (await conn.execute("DELETE FROM vc_records WHERE launcher_id=?", (launcher_id.hex(),))).close()
|
|
237
236
|
|
|
238
|
-
async def get_vc_record_by_coin_id(self, coin_id: bytes32) ->
|
|
237
|
+
async def get_vc_record_by_coin_id(self, coin_id: bytes32) -> VCRecord | None:
|
|
239
238
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
240
239
|
cursor = await conn.execute("SELECT * from vc_records WHERE coin_id=? LIMIT 1000", (coin_id.hex(),))
|
|
241
240
|
row = await cursor.fetchone()
|
|
@@ -250,7 +249,7 @@ class VCStore:
|
|
|
250
249
|
"INSERT OR IGNORE INTO vc_proofs VALUES(?, ?)", (vc_proofs.root().hex(), bytes(vc_proofs.as_program()))
|
|
251
250
|
)
|
|
252
251
|
|
|
253
|
-
async def get_proofs_for_root(self, root: bytes32) ->
|
|
252
|
+
async def get_proofs_for_root(self, root: bytes32) -> VCProofs | None:
|
|
254
253
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
255
254
|
cursor = await conn.execute("SELECT proofs FROM vc_proofs WHERE root=?", (root.hex(),))
|
|
256
255
|
row = await cursor.fetchone()
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
import time
|
|
5
4
|
import traceback
|
|
6
|
-
from typing import TYPE_CHECKING,
|
|
5
|
+
from typing import TYPE_CHECKING, TypeVar
|
|
7
6
|
|
|
8
7
|
from chia_rs import CoinSpend, CoinState, G1Element, G2Element
|
|
9
8
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -17,7 +16,6 @@ from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
|
17
16
|
from chia.types.coin_spend import make_spend
|
|
18
17
|
from chia.util.casts import int_to_bytes
|
|
19
18
|
from chia.util.hash import std_hash
|
|
20
|
-
from chia.util.streamable import Streamable
|
|
21
19
|
from chia.wallet.conditions import (
|
|
22
20
|
AssertCoinAnnouncement,
|
|
23
21
|
Condition,
|
|
@@ -25,16 +23,12 @@ from chia.wallet.conditions import (
|
|
|
25
23
|
CreateCoinAnnouncement,
|
|
26
24
|
CreatePuzzleAnnouncement,
|
|
27
25
|
UnknownCondition,
|
|
28
|
-
parse_timelock_info,
|
|
29
26
|
)
|
|
30
27
|
from chia.wallet.did_wallet.did_wallet import DIDWallet
|
|
31
28
|
from chia.wallet.puzzle_drivers import Solver
|
|
32
29
|
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import solution_for_delegated_puzzle
|
|
33
30
|
from chia.wallet.trading.offer import Offer
|
|
34
|
-
from chia.wallet.transaction_record import TransactionRecord
|
|
35
31
|
from chia.wallet.uncurried_puzzle import uncurry_puzzle
|
|
36
|
-
from chia.wallet.util.compute_memos import compute_memos
|
|
37
|
-
from chia.wallet.util.transaction_type import TransactionType
|
|
38
32
|
from chia.wallet.util.wallet_sync_utils import fetch_coin_spend_for_coin_state
|
|
39
33
|
from chia.wallet.util.wallet_types import WalletType
|
|
40
34
|
from chia.wallet.vc_wallet.cr_cat_drivers import CRCAT, CRCATSpend, ProofsChecker, construct_pending_approval_state
|
|
@@ -65,7 +59,7 @@ class VCWallet:
|
|
|
65
59
|
cls: type[_T_VCWallet],
|
|
66
60
|
wallet_state_manager: WalletStateManager,
|
|
67
61
|
wallet: Wallet,
|
|
68
|
-
name:
|
|
62
|
+
name: str | None = None,
|
|
69
63
|
) -> _T_VCWallet:
|
|
70
64
|
name = "VCWallet" if name is None else name
|
|
71
65
|
new_wallet: _T_VCWallet = await cls.create(
|
|
@@ -83,7 +77,7 @@ class VCWallet:
|
|
|
83
77
|
wallet_state_manager: WalletStateManager,
|
|
84
78
|
wallet: Wallet,
|
|
85
79
|
wallet_info: WalletInfo,
|
|
86
|
-
name:
|
|
80
|
+
name: str | None = None,
|
|
87
81
|
) -> _T_VCWallet:
|
|
88
82
|
self = cls()
|
|
89
83
|
self.wallet_state_manager = wallet_state_manager
|
|
@@ -100,16 +94,14 @@ class VCWallet:
|
|
|
100
94
|
def id(self) -> uint32:
|
|
101
95
|
return self.wallet_info.id
|
|
102
96
|
|
|
103
|
-
async def coin_added(
|
|
104
|
-
self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: Optional[Streamable]
|
|
105
|
-
) -> None:
|
|
97
|
+
async def coin_added(self, coin: Coin, height: uint32, peer: WSChiaConnection, coin_data: object | None) -> None:
|
|
106
98
|
"""
|
|
107
99
|
An unspent coin has arrived to our wallet. Get the parent spend to construct the current VerifiedCredential
|
|
108
100
|
representation of the coin and add it to the DB if it's the newest version of the singleton.
|
|
109
101
|
"""
|
|
110
102
|
# TODO Use coin_data instead of calling peer API
|
|
111
103
|
wallet_node = self.wallet_state_manager.wallet_node
|
|
112
|
-
coin_states:
|
|
104
|
+
coin_states: list[CoinState] | None = await wallet_node.get_coin_state([coin.parent_coin_info], peer=peer)
|
|
113
105
|
if coin_states is None:
|
|
114
106
|
self.log.error(
|
|
115
107
|
f"Cannot find parent coin of the verified credential coin: {coin.name().hex()}"
|
|
@@ -142,7 +134,7 @@ class VCWallet:
|
|
|
142
134
|
:param height:
|
|
143
135
|
:return:
|
|
144
136
|
"""
|
|
145
|
-
vc_record:
|
|
137
|
+
vc_record: VCRecord | None = await self.store.get_vc_record_by_coin_id(coin.name())
|
|
146
138
|
if vc_record is not None:
|
|
147
139
|
await self.store.delete_vc_record(vc_record.vc.launcher_id)
|
|
148
140
|
self.wallet_state_manager.state_changed(
|
|
@@ -162,7 +154,7 @@ class VCWallet:
|
|
|
162
154
|
self,
|
|
163
155
|
provider_did: bytes32,
|
|
164
156
|
action_scope: WalletActionScope,
|
|
165
|
-
inner_puzzle_hash:
|
|
157
|
+
inner_puzzle_hash: bytes32 | None = None,
|
|
166
158
|
fee: uint64 = uint64(0),
|
|
167
159
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
168
160
|
) -> VCRecord:
|
|
@@ -196,35 +188,25 @@ class VCWallet:
|
|
|
196
188
|
extra_conditions=extra_conditions,
|
|
197
189
|
)
|
|
198
190
|
for dpuz, coin in zip(dpuzs, coins):
|
|
199
|
-
solution = solution_for_delegated_puzzle(dpuz, Program.
|
|
191
|
+
solution = solution_for_delegated_puzzle(dpuz, Program.NIL)
|
|
200
192
|
puzzle = await self.standard_wallet.puzzle_for_puzzle_hash(coin.puzzle_hash)
|
|
201
193
|
coin_spends.append(make_spend(coin, puzzle, solution))
|
|
202
194
|
spend_bundle = WalletSpendBundle(coin_spends, G2Element())
|
|
203
|
-
now = uint64(time.time())
|
|
204
195
|
add_list: list[Coin] = list(spend_bundle.additions())
|
|
205
196
|
rem_list: list[Coin] = list(spend_bundle.removals())
|
|
206
197
|
vc_record: VCRecord = VCRecord(vc, uint32(0))
|
|
207
198
|
async with action_scope.use() as interface:
|
|
208
199
|
interface.side_effects.transactions.append(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
to_puzzle_hash=inner_puzzle_hash,
|
|
213
|
-
to_address=self.wallet_state_manager.encode_puzzle_hash(inner_puzzle_hash),
|
|
200
|
+
self.wallet_state_manager.new_outgoing_transaction(
|
|
201
|
+
wallet_id=uint32(1),
|
|
202
|
+
puzzle_hash=inner_puzzle_hash,
|
|
214
203
|
amount=uint64(1),
|
|
215
|
-
|
|
216
|
-
confirmed=False,
|
|
217
|
-
sent=uint32(0),
|
|
204
|
+
fee=fee,
|
|
218
205
|
spend_bundle=spend_bundle,
|
|
219
206
|
additions=add_list,
|
|
220
207
|
removals=rem_list,
|
|
221
|
-
wallet_id=uint32(1),
|
|
222
|
-
sent_to=[],
|
|
223
|
-
trade_id=None,
|
|
224
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
225
208
|
name=spend_bundle.name(),
|
|
226
|
-
|
|
227
|
-
valid_times=parse_timelock_info(extra_conditions),
|
|
209
|
+
extra_conditions=extra_conditions,
|
|
228
210
|
)
|
|
229
211
|
)
|
|
230
212
|
|
|
@@ -236,17 +218,17 @@ class VCWallet:
|
|
|
236
218
|
puzzle_hashes: list[bytes32],
|
|
237
219
|
action_scope: WalletActionScope,
|
|
238
220
|
fee: uint64 = uint64(0),
|
|
239
|
-
coins:
|
|
240
|
-
memos:
|
|
221
|
+
coins: set[Coin] | None = None,
|
|
222
|
+
memos: list[list[bytes]] | None = None,
|
|
241
223
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
242
224
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
243
225
|
) -> None:
|
|
244
|
-
new_proof_hash:
|
|
226
|
+
new_proof_hash: bytes32 | None = kwargs.get(
|
|
245
227
|
"new_proof_hash", None
|
|
246
228
|
) # Requires that this key possesses the DID to update the specified VC
|
|
247
|
-
provider_inner_puzhash:
|
|
248
|
-
self_revoke:
|
|
249
|
-
potential_vc_id:
|
|
229
|
+
provider_inner_puzhash: bytes32 | None = kwargs.get("provider_inner_puzhash", None)
|
|
230
|
+
self_revoke: bool | None = kwargs.get("self_revoke", False)
|
|
231
|
+
potential_vc_id: bytes32 | None = kwargs.get("vc_id", None)
|
|
250
232
|
"""
|
|
251
233
|
Entry point for two standard actions:
|
|
252
234
|
- Cycle the singleton and make an announcement authorizing something
|
|
@@ -340,29 +322,19 @@ class VCWallet:
|
|
|
340
322
|
) # pragma: no cover
|
|
341
323
|
add_list: list[Coin] = list(spend_bundle.additions())
|
|
342
324
|
rem_list: list[Coin] = list(spend_bundle.removals())
|
|
343
|
-
now = uint64(time.time())
|
|
344
325
|
|
|
345
326
|
async with action_scope.use() as interface:
|
|
346
327
|
interface.side_effects.transactions.append(
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
to_puzzle_hash=puzzle_hashes[0],
|
|
351
|
-
to_address=self.wallet_state_manager.encode_puzzle_hash(puzzle_hashes[0]),
|
|
328
|
+
self.wallet_state_manager.new_outgoing_transaction(
|
|
329
|
+
wallet_id=self.id(),
|
|
330
|
+
puzzle_hash=puzzle_hashes[0],
|
|
352
331
|
amount=uint64(1),
|
|
353
|
-
|
|
354
|
-
confirmed=False,
|
|
355
|
-
sent=uint32(0),
|
|
332
|
+
fee=fee,
|
|
356
333
|
spend_bundle=spend_bundle,
|
|
357
334
|
additions=add_list,
|
|
358
335
|
removals=rem_list,
|
|
359
|
-
wallet_id=self.id(),
|
|
360
|
-
sent_to=[],
|
|
361
|
-
trade_id=None,
|
|
362
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
363
336
|
name=spend_bundle.name(),
|
|
364
|
-
|
|
365
|
-
valid_times=parse_timelock_info(extra_conditions),
|
|
337
|
+
extra_conditions=extra_conditions,
|
|
366
338
|
)
|
|
367
339
|
)
|
|
368
340
|
|
|
@@ -408,7 +380,7 @@ class VCWallet:
|
|
|
408
380
|
if fee > 0:
|
|
409
381
|
coins.update(await self.standard_wallet.select_coins(fee, action_scope))
|
|
410
382
|
sorted_coins: list[Coin] = sorted(coins, key=Coin.name)
|
|
411
|
-
sorted_coin_list: list[list[
|
|
383
|
+
sorted_coin_list: list[list[bytes32 | uint64]] = [coin_as_list(c) for c in sorted_coins]
|
|
412
384
|
nonce: bytes32 = SerializedProgram.to(sorted_coin_list).get_tree_hash()
|
|
413
385
|
vc_announcement: AssertCoinAnnouncement = AssertCoinAnnouncement(asserted_id=vc.coin.name(), asserted_msg=nonce)
|
|
414
386
|
|
|
@@ -497,7 +469,7 @@ class VCWallet:
|
|
|
497
469
|
bytes32(cc.at("rf").as_atom()) == crcat_spend.crcat.inner_puzzle_hash
|
|
498
470
|
)
|
|
499
471
|
or ( # it's going to the pending state
|
|
500
|
-
cc.at("rrr") != Program.
|
|
472
|
+
cc.at("rrr") != Program.NIL
|
|
501
473
|
and cc.at("rrrf").atom is None
|
|
502
474
|
and bytes32(cc.at("rf").as_atom())
|
|
503
475
|
== construct_pending_approval_state(
|
|
@@ -542,7 +514,7 @@ class VCWallet:
|
|
|
542
514
|
solution=Program.from_serialized(spend_to_fix.solution)
|
|
543
515
|
.replace(
|
|
544
516
|
ff=coin_args[coin_name][0],
|
|
545
|
-
frf=Program.
|
|
517
|
+
frf=Program.NIL, # not general
|
|
546
518
|
frrf=bytes32.from_hexstr(coin_args[coin_name][2]),
|
|
547
519
|
frrrf=bytes32.from_hexstr(coin_args[coin_name][3]),
|
|
548
520
|
frrrrf=bytes32.from_hexstr(coin_args[coin_name][4]),
|
|
@@ -604,7 +576,7 @@ class VCWallet:
|
|
|
604
576
|
for rec in vc_records:
|
|
605
577
|
if rec.vc.proof_hash is None:
|
|
606
578
|
continue # pragma: no cover
|
|
607
|
-
vc_proofs:
|
|
579
|
+
vc_proofs: VCProofs | None = await self.store.get_proofs_for_root(rec.vc.proof_hash)
|
|
608
580
|
if vc_proofs is None:
|
|
609
581
|
continue # pragma: no cover
|
|
610
582
|
if all(proof in vc_proofs.key_value_pairs for proof in proofs):
|
|
@@ -612,7 +584,7 @@ class VCWallet:
|
|
|
612
584
|
raise ValueError(f"No authorized VC has the correct proofs: {proofs}") # pragma: no cover
|
|
613
585
|
|
|
614
586
|
async def proof_of_inclusions_for_root_and_keys(self, root: bytes32, keys: list[str]) -> Program:
|
|
615
|
-
vc_proofs:
|
|
587
|
+
vc_proofs: VCProofs | None = await self.store.get_proofs_for_root(root)
|
|
616
588
|
if vc_proofs is None:
|
|
617
589
|
raise RuntimeError(f"No proofs exist for VC root: {root.hex()}") # pragma: no cover
|
|
618
590
|
else:
|
|
@@ -625,22 +597,22 @@ class VCWallet:
|
|
|
625
597
|
) -> set[Coin]:
|
|
626
598
|
raise RuntimeError("VCWallet does not support select_coins()") # pragma: no cover
|
|
627
599
|
|
|
628
|
-
async def get_confirmed_balance(self, record_list:
|
|
600
|
+
async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
|
|
629
601
|
"""The VC wallet doesn't really have a balance."""
|
|
630
602
|
return uint128(0) # pragma: no cover
|
|
631
603
|
|
|
632
|
-
async def get_unconfirmed_balance(self, record_list:
|
|
604
|
+
async def get_unconfirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
|
|
633
605
|
"""The VC wallet doesn't really have a balance."""
|
|
634
606
|
return uint128(0) # pragma: no cover
|
|
635
607
|
|
|
636
|
-
async def get_spendable_balance(self, unspent_records:
|
|
608
|
+
async def get_spendable_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
637
609
|
"""The VC wallet doesn't really have a balance."""
|
|
638
610
|
return uint128(0) # pragma: no cover
|
|
639
611
|
|
|
640
612
|
async def get_pending_change_balance(self) -> uint64:
|
|
641
613
|
return uint64(0) # pragma: no cover
|
|
642
614
|
|
|
643
|
-
async def get_max_send_amount(self, records:
|
|
615
|
+
async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
644
616
|
"""This is the confirmed balance, which we set to 0 as the VC wallet doesn't have one."""
|
|
645
617
|
return uint128(0) # pragma: no cover
|
|
646
618
|
|