chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/blockchain/blockchain_test_utils.py +2 -3
- chia/_tests/blockchain/test_augmented_chain.py +2 -3
- chia/_tests/blockchain/test_blockchain.py +261 -44
- chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
- chia/_tests/blockchain/test_build_chains.py +197 -1
- chia/_tests/blockchain/test_get_block_generator.py +1 -1
- chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +3 -4
- chia/_tests/clvm/test_message_conditions.py +2 -2
- chia/_tests/clvm/test_puzzle_compression.py +2 -3
- chia/_tests/clvm/test_puzzles.py +1 -2
- chia/_tests/clvm/test_singletons.py +2 -3
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +30 -25
- chia/_tests/cmds/test_dev_gh.py +1 -1
- chia/_tests/cmds/test_farm_cmd.py +1 -1
- chia/_tests/cmds/test_show.py +1 -2
- chia/_tests/cmds/wallet/test_did.py +101 -56
- chia/_tests/cmds/wallet/test_nft.py +109 -84
- chia/_tests/cmds/wallet/test_notifications.py +1 -1
- chia/_tests/cmds/wallet/test_offer.toffer +1 -1
- chia/_tests/cmds/wallet/test_vcs.py +8 -8
- chia/_tests/cmds/wallet/test_wallet.py +100 -46
- chia/_tests/conftest.py +31 -20
- chia/_tests/connection_utils.py +1 -1
- chia/_tests/core/consensus/stores/__init__.py +0 -0
- chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
- chia/_tests/core/consensus/test_block_creation.py +2 -31
- chia/_tests/core/consensus/test_pot_iterations.py +38 -3
- chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
- chia/_tests/core/daemon/test_daemon.py +80 -0
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +14 -10
- chia/_tests/core/data_layer/test_data_store.py +5 -5
- chia/_tests/core/farmer/test_farmer_api.py +2 -2
- chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
- chia/_tests/core/full_node/ram_db.py +3 -1
- chia/_tests/core/full_node/stores/test_block_store.py +28 -16
- chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
- chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_address_manager.py +200 -27
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +7 -6
- chia/_tests/core/full_node/test_full_node.py +456 -40
- chia/_tests/core/full_node/test_generator_tools.py +32 -2
- chia/_tests/core/full_node/test_hint_management.py +1 -1
- chia/_tests/core/full_node/test_node_load.py +20 -21
- chia/_tests/core/full_node/test_performance.py +3 -4
- chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
- chia/_tests/core/full_node/test_subscriptions.py +1 -2
- chia/_tests/core/full_node/test_transactions.py +9 -5
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
- chia/_tests/core/large_block.py +1 -2
- chia/_tests/core/make_block_generator.py +3 -4
- chia/_tests/core/mempool/test_mempool.py +36 -86
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
- chia/_tests/core/mempool/test_mempool_manager.py +421 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
- chia/_tests/core/server/flood.py +1 -1
- chia/_tests/core/server/test_dos.py +1 -1
- chia/_tests/core/server/test_node_discovery.py +41 -27
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +1 -1
- chia/_tests/core/services/test_services.py +5 -5
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_cost_calculation.py +6 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_crawler_rpc.py +1 -1
- chia/_tests/core/test_db_conversion.py +3 -1
- chia/_tests/core/test_db_validation.py +5 -3
- chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
- chia/_tests/core/test_filter.py +4 -1
- chia/_tests/core/test_full_node_rpc.py +99 -82
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/util/test_block_cache.py +1 -1
- chia/_tests/core/util/test_keychain.py +2 -2
- chia/_tests/core/util/test_lockfile.py +1 -1
- chia/_tests/core/util/test_log_exceptions.py +5 -5
- chia/_tests/core/util/test_streamable.py +81 -22
- chia/_tests/db/test_db_wrapper.py +1 -3
- chia/_tests/environments/wallet.py +5 -5
- chia/_tests/farmer_harvester/test_farmer.py +9 -7
- chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/generator/test_compression.py +1 -2
- chia/_tests/generator/test_rom.py +8 -4
- chia/_tests/plot_sync/test_plot_sync.py +3 -3
- chia/_tests/plot_sync/test_receiver.py +3 -3
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +3 -3
- chia/_tests/plot_sync/util.py +2 -2
- chia/_tests/pools/test_pool_cmdline.py +48 -21
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
- chia/_tests/pools/test_pool_rpc.py +237 -105
- chia/_tests/pools/test_pool_wallet.py +11 -2
- chia/_tests/pools/test_wallet_pool_store.py +5 -4
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/simulation/test_simulation.py +13 -8
- chia/_tests/simulation/test_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +191 -47
- chia/_tests/timelord/test_timelord.py +1 -1
- chia/_tests/tools/test_full_sync.py +0 -2
- chia/_tests/tools/test_run_block.py +3 -1
- chia/_tests/util/benchmark_cost.py +3 -3
- chia/_tests/util/benchmarks.py +2 -2
- chia/_tests/util/blockchain.py +11 -5
- chia/_tests/util/blockchain_mock.py +1 -4
- chia/_tests/util/coin_store.py +29 -0
- chia/_tests/util/constants.py +2 -18
- chia/_tests/util/full_sync.py +3 -3
- chia/_tests/util/generator_tools_testing.py +2 -3
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +33 -31
- chia/_tests/util/network_protocol_data.py +19 -17
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +3 -1
- chia/_tests/util/run_block.py +2 -2
- chia/_tests/util/setup_nodes.py +7 -7
- chia/_tests/util/spend_sim.py +47 -55
- chia/_tests/util/test_condition_tools.py +5 -4
- chia/_tests/util/test_config.py +2 -2
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +12 -14
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_paginator.py +4 -4
- chia/_tests/util/test_priority_mutex.py +2 -2
- chia/_tests/util/test_replace_str_to_bytes.py +15 -5
- chia/_tests/util/test_ssl_check.py +1 -1
- chia/_tests/util/test_testnet_overrides.py +13 -3
- chia/_tests/util/time_out_assert.py +4 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
- chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
- chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
- chia/_tests/wallet/conftest.py +11 -12
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
- chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
- chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
- chia/_tests/wallet/nft_wallet/config.py +1 -1
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
- chia/_tests/wallet/rpc/test_wallet_rpc.py +495 -265
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
- chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
- chia/_tests/wallet/test_clvm_casts.py +88 -0
- chia/_tests/wallet/test_coin_management.py +1 -1
- chia/_tests/wallet/test_coin_selection.py +1 -1
- chia/_tests/wallet/test_conditions.py +1 -1
- chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
- chia/_tests/wallet/test_notifications.py +5 -3
- chia/_tests/wallet/test_sign_coin_spends.py +6 -6
- chia/_tests/wallet/test_signer_protocol.py +13 -12
- chia/_tests/wallet/test_singleton.py +1 -1
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +108 -29
- chia/_tests/wallet/test_wallet_action_scope.py +9 -2
- chia/_tests/wallet/test_wallet_blockchain.py +2 -3
- chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
- chia/_tests/wallet/test_wallet_node.py +2 -4
- chia/_tests/wallet/test_wallet_retry.py +4 -2
- chia/_tests/wallet/test_wallet_state_manager.py +191 -5
- chia/_tests/wallet/test_wallet_test_framework.py +1 -1
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
- chia/_tests/wallet/wallet_block_tools.py +6 -6
- chia/_tests/weight_proof/test_weight_proof.py +10 -48
- chia/apis.py +1 -1
- chia/cmds/beta.py +1 -1
- chia/cmds/chia.py +9 -9
- chia/cmds/cmd_classes.py +12 -11
- chia/cmds/cmd_helpers.py +1 -1
- chia/cmds/cmds_util.py +12 -9
- chia/cmds/coin_funcs.py +2 -2
- chia/cmds/configure.py +2 -2
- chia/cmds/data.py +0 -2
- chia/cmds/data_funcs.py +1 -1
- chia/cmds/db_validate_func.py +1 -2
- chia/cmds/dev/__init__.py +0 -0
- chia/cmds/dev/data.py +273 -0
- chia/cmds/{gh.py → dev/gh.py} +5 -5
- chia/cmds/dev/main.py +22 -0
- chia/cmds/dev/mempool.py +78 -0
- chia/cmds/dev/mempool_funcs.py +63 -0
- chia/cmds/farm_funcs.py +5 -4
- chia/cmds/init_funcs.py +11 -11
- chia/cmds/keys.py +2 -2
- chia/cmds/keys_funcs.py +4 -4
- chia/cmds/netspace_funcs.py +1 -1
- chia/cmds/peer_funcs.py +2 -2
- chia/cmds/plotnft_funcs.py +72 -26
- chia/cmds/rpc.py +1 -1
- chia/cmds/show_funcs.py +5 -5
- chia/cmds/signer.py +8 -7
- chia/cmds/sim_funcs.py +8 -9
- chia/cmds/wallet.py +2 -2
- chia/cmds/wallet_funcs.py +165 -131
- chia/{util → consensus}/augmented_chain.py +1 -2
- chia/consensus/block_body_validation.py +54 -40
- chia/consensus/block_creation.py +42 -76
- chia/consensus/block_header_validation.py +32 -26
- chia/consensus/block_record.py +0 -3
- chia/consensus/blockchain.py +23 -32
- chia/consensus/blockchain_interface.py +1 -5
- chia/consensus/check_time_locks.py +57 -0
- chia/consensus/coin_store_protocol.py +151 -0
- chia/consensus/coinbase.py +0 -6
- chia/consensus/condition_costs.py +4 -0
- chia/{util → consensus}/condition_tools.py +4 -5
- chia/consensus/cost_calculator.py +1 -1
- chia/consensus/default_constants.py +32 -9
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +1 -2
- chia/consensus/find_fork_point.py +1 -3
- chia/consensus/full_block_to_block_record.py +1 -6
- chia/{util → consensus}/generator_tools.py +1 -3
- chia/consensus/get_block_challenge.py +30 -7
- chia/consensus/make_sub_epoch_summary.py +1 -5
- chia/consensus/multiprocess_validation.py +21 -20
- chia/consensus/pot_iterations.py +74 -13
- chia/{util → consensus}/prev_transaction_block.py +1 -1
- chia/consensus/vdf_info_computation.py +1 -3
- chia/daemon/keychain_proxy.py +5 -5
- chia/daemon/server.py +22 -5
- chia/data_layer/data_layer.py +92 -51
- chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
- chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
- chia/data_layer/data_layer_util.py +4 -6
- chia/data_layer/data_layer_wallet.py +42 -69
- chia/data_layer/dl_wallet_store.py +12 -6
- chia/data_layer/download_data.py +3 -3
- chia/data_layer/s3_plugin_service.py +0 -1
- chia/farmer/farmer.py +3 -4
- chia/farmer/farmer_api.py +11 -7
- chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
- chia/full_node/block_height_map.py +7 -6
- chia/full_node/block_store.py +5 -7
- chia/full_node/bundle_tools.py +1 -2
- chia/full_node/coin_store.py +143 -124
- chia/{types → full_node}/eligible_coin_spends.py +39 -70
- chia/full_node/fee_estimator.py +1 -1
- chia/full_node/fee_estimator_interface.py +0 -8
- chia/full_node/fee_tracker.py +25 -25
- chia/full_node/full_node.py +70 -53
- chia/full_node/full_node_api.py +57 -40
- chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
- chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
- chia/full_node/full_node_store.py +23 -8
- chia/full_node/mempool.py +206 -53
- chia/full_node/mempool_check_conditions.py +20 -63
- chia/full_node/mempool_manager.py +26 -40
- chia/full_node/subscriptions.py +1 -3
- chia/full_node/tx_processing_queue.py +50 -3
- chia/full_node/weight_proof.py +46 -37
- chia/harvester/harvester.py +1 -1
- chia/harvester/harvester_api.py +22 -7
- chia/introducer/introducer.py +1 -1
- chia/introducer/introducer_api.py +1 -1
- chia/plot_sync/exceptions.py +1 -1
- chia/plot_sync/receiver.py +1 -1
- chia/plot_sync/sender.py +2 -2
- chia/pools/pool_puzzles.py +13 -18
- chia/pools/pool_wallet.py +23 -46
- chia/protocols/farmer_protocol.py +11 -3
- chia/protocols/full_node_protocol.py +1 -4
- chia/protocols/harvester_protocol.py +3 -3
- chia/protocols/pool_protocol.py +1 -2
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +1 -3
- chia/protocols/wallet_protocol.py +3 -3
- chia/rpc/rpc_client.py +7 -8
- chia/rpc/rpc_server.py +3 -3
- chia/rpc/util.py +3 -1
- chia/seeder/crawler.py +1 -1
- chia/seeder/crawler_api.py +1 -1
- chia/seeder/dns_server.py +2 -0
- chia/seeder/start_crawler.py +3 -3
- chia/server/address_manager.py +286 -38
- chia/server/address_manager_store.py +0 -215
- chia/{types → server}/aliases.py +7 -7
- chia/server/api_protocol.py +1 -1
- chia/server/chia_policy.py +1 -1
- chia/server/node_discovery.py +76 -113
- chia/server/rate_limits.py +1 -1
- chia/server/resolve_peer_info.py +43 -0
- chia/server/server.py +5 -5
- chia/server/start_data_layer.py +4 -4
- chia/server/start_farmer.py +5 -4
- chia/server/start_full_node.py +5 -4
- chia/server/start_harvester.py +7 -5
- chia/server/start_introducer.py +2 -2
- chia/server/start_service.py +1 -1
- chia/server/start_timelord.py +7 -5
- chia/server/start_wallet.py +7 -5
- chia/server/ws_connection.py +1 -1
- chia/simulator/add_blocks_in_batches.py +2 -2
- chia/simulator/block_tools.py +245 -201
- chia/simulator/full_node_simulator.py +38 -10
- chia/simulator/setup_services.py +12 -12
- chia/simulator/simulator_full_node_rpc_api.py +2 -2
- chia/simulator/simulator_full_node_rpc_client.py +2 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +1 -1
- chia/simulator/wallet_tools.py +10 -18
- chia/ssl/create_ssl.py +1 -1
- chia/timelord/iters_from_block.py +14 -14
- chia/timelord/timelord.py +15 -11
- chia/timelord/timelord_api.py +14 -2
- chia/timelord/timelord_state.py +20 -14
- chia/types/blockchain_format/program.py +53 -10
- chia/types/blockchain_format/proof_of_space.py +73 -19
- chia/types/coin_spend.py +3 -56
- chia/types/generator_types.py +28 -0
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +12 -7
- chia/types/unfinished_header_block.py +1 -2
- chia/types/validation_state.py +1 -2
- chia/types/weight_proof.py +1 -3
- chia/util/action_scope.py +3 -3
- chia/util/block_cache.py +1 -2
- chia/util/byte_types.py +1 -1
- chia/util/casts.py +21 -0
- chia/util/config.py +0 -37
- chia/util/db_wrapper.py +8 -1
- chia/util/errors.py +3 -2
- chia/util/initial-config.yaml +21 -5
- chia/util/keychain.py +6 -7
- chia/util/keyring_wrapper.py +5 -5
- chia/util/limited_semaphore.py +1 -1
- chia/util/priority_mutex.py +1 -1
- chia/util/streamable.py +63 -5
- chia/util/task_timing.py +1 -1
- chia/util/virtual_project_analysis.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +7 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
- chia/wallet/cat_wallet/cat_utils.py +1 -1
- chia/wallet/cat_wallet/cat_wallet.py +44 -36
- chia/wallet/cat_wallet/lineage_store.py +7 -0
- chia/wallet/cat_wallet/r_cat_wallet.py +274 -0
- chia/wallet/conditions.py +5 -10
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
- chia/wallet/derivation_record.py +33 -0
- chia/wallet/derive_keys.py +3 -3
- chia/wallet/did_wallet/did_info.py +12 -3
- chia/wallet/did_wallet/did_wallet.py +132 -101
- chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
- chia/wallet/driver_protocol.py +3 -1
- chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
- chia/wallet/nft_wallet/nft_wallet.py +69 -112
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
- chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
- chia/wallet/nft_wallet/uncurry_nft.py +4 -6
- chia/wallet/notification_manager.py +2 -3
- chia/wallet/outer_puzzles.py +7 -2
- chia/wallet/puzzle_drivers.py +1 -1
- chia/wallet/puzzles/clawback/drivers.py +5 -4
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
- chia/wallet/puzzles/singleton_top_layer.py +2 -1
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
- chia/wallet/puzzles/tails.py +1 -3
- chia/wallet/signer_protocol.py +5 -6
- chia/wallet/singleton.py +5 -4
- chia/wallet/singleton_record.py +1 -1
- chia/wallet/trade_manager.py +18 -20
- chia/wallet/trade_record.py +3 -6
- chia/wallet/trading/offer.py +12 -13
- chia/wallet/uncurried_puzzle.py +2 -2
- chia/wallet/util/compute_additions.py +58 -0
- chia/wallet/util/compute_hints.py +3 -3
- chia/wallet/util/compute_memos.py +4 -4
- chia/wallet/util/curry_and_treehash.py +2 -1
- chia/wallet/util/debug_spend_bundle.py +1 -1
- chia/wallet/util/merkle_tree.py +1 -1
- chia/wallet/util/peer_request_cache.py +1 -2
- chia/wallet/util/tx_config.py +3 -8
- chia/wallet/util/wallet_sync_utils.py +10 -5
- chia/wallet/util/wallet_types.py +1 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
- chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
- chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
- chia/wallet/vc_wallet/vc_drivers.py +50 -8
- chia/wallet/vc_wallet/vc_store.py +3 -5
- chia/wallet/vc_wallet/vc_wallet.py +15 -22
- chia/wallet/wallet.py +36 -46
- chia/wallet/wallet_action_scope.py +73 -4
- chia/wallet/wallet_blockchain.py +1 -3
- chia/wallet/wallet_interested_store.py +1 -1
- chia/wallet/wallet_nft_store.py +3 -3
- chia/wallet/wallet_node.py +17 -16
- chia/wallet/wallet_node_api.py +4 -5
- chia/wallet/wallet_pool_store.py +1 -1
- chia/wallet/wallet_protocol.py +2 -0
- chia/wallet/wallet_puzzle_store.py +1 -1
- chia/{rpc → wallet}/wallet_request_types.py +670 -81
- chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
- chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
- chia/wallet/wallet_singleton_store.py +8 -7
- chia/wallet/wallet_spend_bundle.py +4 -3
- chia/wallet/wallet_state_manager.py +320 -191
- chia/wallet/wallet_weight_proof_handler.py +1 -2
- chia/wallet/wsm_apis.py +98 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/RECORD +443 -436
- mozilla-ca/cacert.pem +3 -165
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
- chia/cmds/dev.py +0 -18
- chia/types/blockchain_format/slots.py +0 -9
- chia/types/blockchain_format/sub_epoch_summary.py +0 -5
- chia/types/end_of_slot_bundle.py +0 -5
- chia/types/full_block.py +0 -5
- chia/types/header_block.py +0 -5
- chia/types/spend_bundle_conditions.py +0 -7
- chia/types/transaction_queue_entry.py +0 -56
- chia/types/unfinished_block.py +0 -5
- /chia/cmds/{installers.py → dev/installers.py} +0 -0
- /chia/cmds/{sim.py → dev/sim.py} +0 -0
- /chia/{util → cmds}/dump_keyring.py +0 -0
- /chia/{full_node → consensus}/signage_point.py +0 -0
- /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
- /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
- /chia/{util → full_node}/full_block_utils.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
- /chia/{full_node → protocols}/fee_estimate.py +0 -0
- /chia/{server → protocols}/outbound_message.py +0 -0
- /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
- /chia/{util → simulator}/vdf_prover.py +0 -0
- /chia/{util → ssl}/ssl_check.py +0 -0
- /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/entry_points.txt +0 -0
|
@@ -4,7 +4,7 @@ import functools
|
|
|
4
4
|
from collections.abc import Iterable
|
|
5
5
|
from dataclasses import dataclass, replace
|
|
6
6
|
from enum import IntEnum
|
|
7
|
-
from typing import Optional
|
|
7
|
+
from typing import Optional
|
|
8
8
|
|
|
9
9
|
from chia_puzzles_py.programs import (
|
|
10
10
|
CONDITIONS_W_FEE_ANNOUNCE,
|
|
@@ -16,13 +16,15 @@ from chia_puzzles_py.programs import (
|
|
|
16
16
|
from chia_puzzles_py.programs import (
|
|
17
17
|
CREDENTIAL_RESTRICTION_HASH as CREDENTIAL_RESTRICTION_HASH_BYTES,
|
|
18
18
|
)
|
|
19
|
+
from chia_rs import CoinSpend
|
|
19
20
|
from chia_rs.sized_bytes import bytes32
|
|
20
21
|
from chia_rs.sized_ints import uint16, uint64
|
|
21
|
-
from
|
|
22
|
+
from typing_extensions import Self
|
|
22
23
|
|
|
23
24
|
from chia.types.blockchain_format.coin import Coin, coin_as_list
|
|
24
25
|
from chia.types.blockchain_format.program import Program
|
|
25
|
-
from chia.types.coin_spend import
|
|
26
|
+
from chia.types.coin_spend import make_spend
|
|
27
|
+
from chia.util.casts import int_to_bytes
|
|
26
28
|
from chia.util.hash import std_hash
|
|
27
29
|
from chia.util.streamable import Streamable, streamable
|
|
28
30
|
from chia.wallet.cat_wallet.cat_utils import CAT_MOD, construct_cat_puzzle
|
|
@@ -165,9 +167,6 @@ def construct_pending_approval_state(puzzle_hash: bytes32, amount: uint64) -> Pr
|
|
|
165
167
|
return PENDING_VC_ANNOUNCEMENT.curry(Program.to([[51, puzzle_hash, amount, [puzzle_hash]]]))
|
|
166
168
|
|
|
167
169
|
|
|
168
|
-
_T_CRCAT = TypeVar("_T_CRCAT", bound="CRCAT")
|
|
169
|
-
|
|
170
|
-
|
|
171
170
|
@dataclass(frozen=True)
|
|
172
171
|
class CRCAT:
|
|
173
172
|
coin: Coin
|
|
@@ -179,7 +178,7 @@ class CRCAT:
|
|
|
179
178
|
|
|
180
179
|
@classmethod
|
|
181
180
|
def launch(
|
|
182
|
-
cls
|
|
181
|
+
cls,
|
|
183
182
|
# General CAT launching info
|
|
184
183
|
origin_coin: Coin,
|
|
185
184
|
payment: CreateCoin,
|
|
@@ -307,12 +306,12 @@ class CRCAT:
|
|
|
307
306
|
return solution.at("f").at("rrrrrrf")
|
|
308
307
|
|
|
309
308
|
@classmethod
|
|
310
|
-
def get_current_from_coin_spend(cls
|
|
309
|
+
def get_current_from_coin_spend(cls, spend: CoinSpend) -> CRCAT: # pragma: no cover
|
|
311
310
|
uncurried_puzzle: UncurriedPuzzle = uncurry_puzzle(spend.puzzle_reveal)
|
|
312
311
|
first_uncurried_cr_layer: UncurriedPuzzle = uncurry_puzzle(uncurried_puzzle.args.at("rrf"))
|
|
313
312
|
second_uncurried_cr_layer: UncurriedPuzzle = uncurry_puzzle(first_uncurried_cr_layer.mod)
|
|
314
313
|
lineage_proof = LineageProof.from_program(
|
|
315
|
-
spend.solution
|
|
314
|
+
Program.from_serialized(spend.solution).at("rf"),
|
|
316
315
|
[LineageProofField.PARENT_NAME, LineageProofField.INNER_PUZZLE_HASH, LineageProofField.AMOUNT],
|
|
317
316
|
)
|
|
318
317
|
return CRCAT(
|
|
@@ -326,7 +325,7 @@ class CRCAT:
|
|
|
326
325
|
|
|
327
326
|
@classmethod
|
|
328
327
|
def get_next_from_coin_spend(
|
|
329
|
-
cls
|
|
328
|
+
cls,
|
|
330
329
|
parent_spend: CoinSpend,
|
|
331
330
|
conditions: Optional[Program] = None, # For optimization purposes, the conditions may already have been run
|
|
332
331
|
) -> list[CRCAT]:
|
|
@@ -338,8 +337,8 @@ class CRCAT:
|
|
|
338
337
|
as the spend output a remark condition that was (REMARK authorized_providers proofs_checker)
|
|
339
338
|
"""
|
|
340
339
|
coin_name: bytes32 = parent_spend.coin.name()
|
|
341
|
-
puzzle
|
|
342
|
-
solution
|
|
340
|
+
puzzle = Program.from_serialized(parent_spend.puzzle_reveal)
|
|
341
|
+
solution = Program.from_serialized(parent_spend.solution)
|
|
343
342
|
|
|
344
343
|
# Get info by uncurrying
|
|
345
344
|
_, tail_hash_as_prog, potential_cr_layer = puzzle.uncurry()[1].as_iter()
|
|
@@ -515,8 +514,8 @@ class CRCAT:
|
|
|
515
514
|
|
|
516
515
|
@classmethod
|
|
517
516
|
def spend_many(
|
|
518
|
-
cls
|
|
519
|
-
inner_spends: list[tuple[
|
|
517
|
+
cls,
|
|
518
|
+
inner_spends: list[tuple[Self, int, Program, Program]], # CRCAT, extra_delta, inner puzzle, inner solution
|
|
520
519
|
# CR layer solving info
|
|
521
520
|
proof_of_inclusions: Program,
|
|
522
521
|
proof_checker_solution: Program,
|
|
@@ -538,7 +537,7 @@ class CRCAT:
|
|
|
538
537
|
def prev_index(index: int) -> int:
|
|
539
538
|
return index - 1
|
|
540
539
|
|
|
541
|
-
sorted_inner_spends: list[tuple[
|
|
540
|
+
sorted_inner_spends: list[tuple[Self, int, Program, Program]] = sorted(
|
|
542
541
|
inner_spends,
|
|
543
542
|
key=lambda spend: spend[0].coin.name(),
|
|
544
543
|
)
|
|
@@ -609,16 +608,16 @@ class CRCATSpend:
|
|
|
609
608
|
@classmethod
|
|
610
609
|
def from_coin_spend(cls, spend: CoinSpend) -> CRCATSpend: # pragma: no cover
|
|
611
610
|
inner_puzzle: Program = CRCAT.get_inner_puzzle(uncurry_puzzle(spend.puzzle_reveal))
|
|
612
|
-
inner_solution: Program = CRCAT.get_inner_solution(spend.solution
|
|
611
|
+
inner_solution: Program = CRCAT.get_inner_solution(Program.from_serialized(spend.solution))
|
|
613
612
|
inner_conditions: Program = inner_puzzle.run(inner_solution)
|
|
614
613
|
return cls(
|
|
615
614
|
CRCAT.get_current_from_coin_spend(spend),
|
|
616
615
|
inner_puzzle,
|
|
617
616
|
inner_solution,
|
|
618
617
|
CRCAT.get_next_from_coin_spend(spend, conditions=inner_conditions),
|
|
619
|
-
spend.solution
|
|
618
|
+
Program.from_serialized(spend.solution).at("f").at("rrrrf") == Program.to(None),
|
|
620
619
|
list(inner_conditions.as_iter()),
|
|
621
|
-
spend.solution
|
|
620
|
+
Program.from_serialized(spend.solution).at("f").at("f"),
|
|
622
621
|
)
|
|
623
622
|
|
|
624
623
|
|
|
@@ -3,17 +3,16 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
import time
|
|
5
5
|
import traceback
|
|
6
|
-
from typing import TYPE_CHECKING, Any, Optional
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional
|
|
7
7
|
|
|
8
|
-
from chia_rs import G1Element, G2Element
|
|
8
|
+
from chia_rs import CoinSpend, G1Element, G2Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
10
10
|
from chia_rs.sized_ints import uint8, uint32, uint64, uint128
|
|
11
|
-
from typing_extensions import Unpack
|
|
11
|
+
from typing_extensions import Self, Unpack
|
|
12
12
|
|
|
13
13
|
from chia.server.ws_connection import WSChiaConnection
|
|
14
14
|
from chia.types.blockchain_format.coin import Coin, coin_as_list
|
|
15
15
|
from chia.types.blockchain_format.program import Program
|
|
16
|
-
from chia.types.coin_spend import CoinSpend
|
|
17
16
|
from chia.util.byte_types import hexstr_to_bytes
|
|
18
17
|
from chia.util.hash import std_hash
|
|
19
18
|
from chia.util.streamable import VersionedBlob
|
|
@@ -69,6 +68,8 @@ class CRCATWallet(CATWallet):
|
|
|
69
68
|
wallet_info: WalletInfo
|
|
70
69
|
info: CRCATInfo
|
|
71
70
|
standard_wallet: Wallet
|
|
71
|
+
wallet_type: ClassVar[WalletType] = WalletType.CRCAT
|
|
72
|
+
wallet_info_type: ClassVar[type[CRCATInfo]] = CRCATInfo
|
|
72
73
|
|
|
73
74
|
@staticmethod
|
|
74
75
|
def default_wallet_name_for_unknown_cat(limitations_program_hash_hex: str) -> str:
|
|
@@ -91,18 +92,19 @@ class CRCATWallet(CATWallet):
|
|
|
91
92
|
) -> CATWallet: # pragma: no cover
|
|
92
93
|
raise NotImplementedError("create_new_cat_wallet is a legacy method and is not available on CR-CAT wallets")
|
|
93
94
|
|
|
94
|
-
@
|
|
95
|
+
@classmethod
|
|
95
96
|
async def get_or_create_wallet_for_cat(
|
|
97
|
+
cls,
|
|
96
98
|
wallet_state_manager: WalletStateManager,
|
|
97
99
|
wallet: Wallet,
|
|
98
100
|
limitations_program_hash_hex: str,
|
|
99
101
|
name: Optional[str] = None,
|
|
100
102
|
authorized_providers: Optional[list[bytes32]] = None,
|
|
101
103
|
proofs_checker: Optional[ProofsChecker] = None,
|
|
102
|
-
) ->
|
|
104
|
+
) -> Self:
|
|
103
105
|
if authorized_providers is None or proofs_checker is None: # pragma: no cover
|
|
104
106
|
raise ValueError("get_or_create_wallet_for_cat was call on CRCATWallet without proper arguments")
|
|
105
|
-
self =
|
|
107
|
+
self = cls()
|
|
106
108
|
self.standard_wallet = wallet
|
|
107
109
|
if name is None:
|
|
108
110
|
name = self.default_wallet_name_for_unknown_cat(limitations_program_hash_hex)
|
|
@@ -111,15 +113,15 @@ class CRCATWallet(CATWallet):
|
|
|
111
113
|
tail_hash = bytes32.from_hexstr(limitations_program_hash_hex)
|
|
112
114
|
|
|
113
115
|
for id, w in wallet_state_manager.wallets.items():
|
|
114
|
-
if w.type() ==
|
|
115
|
-
assert isinstance(w,
|
|
116
|
+
if w.type() == cls.type():
|
|
117
|
+
assert isinstance(w, cls)
|
|
116
118
|
if w.get_asset_id() == limitations_program_hash_hex:
|
|
117
119
|
self.log.warning("Not creating wallet for already existing CR-CAT wallet")
|
|
118
120
|
return w
|
|
119
121
|
|
|
120
122
|
self.wallet_state_manager = wallet_state_manager
|
|
121
123
|
|
|
122
|
-
self.info =
|
|
124
|
+
self.info = cls.wallet_info_type(tail_hash, None, authorized_providers, proofs_checker)
|
|
123
125
|
info_as_string = bytes(self.info).hex()
|
|
124
126
|
self.wallet_info = await wallet_state_manager.user_store.create_wallet(name, WalletType.CRCAT, info_as_string)
|
|
125
127
|
|
|
@@ -160,7 +162,7 @@ class CRCATWallet(CATWallet):
|
|
|
160
162
|
self.wallet_state_manager = wallet_state_manager
|
|
161
163
|
self.wallet_info = wallet_info
|
|
162
164
|
self.standard_wallet = wallet
|
|
163
|
-
self.info =
|
|
165
|
+
self.info = self.wallet_info_type.from_bytes(hexstr_to_bytes(self.wallet_info.data))
|
|
164
166
|
return self
|
|
165
167
|
|
|
166
168
|
@classmethod
|
|
@@ -175,7 +177,7 @@ class CRCATWallet(CATWallet):
|
|
|
175
177
|
replace_self.log = logging.getLogger(cat_wallet.get_name())
|
|
176
178
|
replace_self.log.info(f"Converting CAT wallet {cat_wallet.id()} to CR-CAT wallet")
|
|
177
179
|
replace_self.wallet_state_manager = cat_wallet.wallet_state_manager
|
|
178
|
-
replace_self.info =
|
|
180
|
+
replace_self.info = cls.wallet_info_type(
|
|
179
181
|
cat_wallet.cat_info.limitations_program_hash, None, authorized_providers, proofs_checker
|
|
180
182
|
)
|
|
181
183
|
await cat_wallet.wallet_state_manager.user_store.update_wallet(
|
|
@@ -197,7 +199,7 @@ class CRCATWallet(CATWallet):
|
|
|
197
199
|
return self.wallet_info.id
|
|
198
200
|
|
|
199
201
|
def get_asset_id(self) -> str:
|
|
200
|
-
return self.info.limitations_program_hash.hex()
|
|
202
|
+
return bytes(self.info.limitations_program_hash).hex()
|
|
201
203
|
|
|
202
204
|
async def set_tail_program(self, tail_program: str) -> None: # pragma: no cover
|
|
203
205
|
raise NotImplementedError("set_tail_program is a legacy method and is not available on CR-CAT wallets")
|
|
@@ -449,19 +451,18 @@ class CRCATWallet(CATWallet):
|
|
|
449
451
|
if origin_crcat_record is None:
|
|
450
452
|
raise RuntimeError("A CR-CAT coin was selected that we don't have a record for") # pragma: no cover
|
|
451
453
|
origin_crcat = self.coin_record_to_crcat(origin_crcat_record)
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
)
|
|
456
|
-
).reuse_puzhash:
|
|
457
|
-
change_puzhash = origin_crcat.inner_puzzle_hash
|
|
458
|
-
for payment in payments:
|
|
459
|
-
if change_puzhash == payment.puzzle_hash and change == payment.amount:
|
|
460
|
-
# We cannot create two coins has same id, create a new puzhash for the change
|
|
461
|
-
change_puzhash = await self.standard_wallet.get_puzzle_hash(new=True)
|
|
462
|
-
break
|
|
454
|
+
|
|
455
|
+
if add_authorizations_to_cr_cats:
|
|
456
|
+
change_puzhash = await action_scope.get_puzzle_hash(self.wallet_state_manager)
|
|
463
457
|
else:
|
|
464
|
-
change_puzhash =
|
|
458
|
+
change_puzhash = origin_crcat.inner_puzzle_hash
|
|
459
|
+
for payment in payments:
|
|
460
|
+
if change_puzhash == payment.puzzle_hash and change == payment.amount:
|
|
461
|
+
# We cannot create two coins has same id, create a new puzhash for the change
|
|
462
|
+
change_puzhash = await action_scope.get_puzzle_hash(
|
|
463
|
+
self.wallet_state_manager, override_reuse_puzhash_with=False
|
|
464
|
+
)
|
|
465
|
+
break
|
|
465
466
|
primaries.append(CreateCoin(change_puzhash, uint64(change), [change_puzhash]))
|
|
466
467
|
|
|
467
468
|
# Find the VC Wallet
|
|
@@ -586,7 +587,7 @@ class CRCATWallet(CATWallet):
|
|
|
586
587
|
if add_authorizations_to_cr_cats:
|
|
587
588
|
await vc_wallet.generate_signed_transaction(
|
|
588
589
|
[uint64(1)],
|
|
589
|
-
[await
|
|
590
|
+
[await action_scope.get_puzzle_hash(self.wallet_state_manager)],
|
|
590
591
|
action_scope,
|
|
591
592
|
vc_id=vc.launcher_id,
|
|
592
593
|
extra_conditions=(
|
|
@@ -769,7 +770,7 @@ class CRCATWallet(CATWallet):
|
|
|
769
770
|
# Make the VC TX
|
|
770
771
|
await vc_wallet.generate_signed_transaction(
|
|
771
772
|
[uint64(1)],
|
|
772
|
-
[await
|
|
773
|
+
[await action_scope.get_puzzle_hash(self.wallet_state_manager)],
|
|
773
774
|
action_scope,
|
|
774
775
|
vc_id=vc.launcher_id,
|
|
775
776
|
extra_conditions=(
|
|
@@ -780,6 +781,7 @@ class CRCATWallet(CATWallet):
|
|
|
780
781
|
),
|
|
781
782
|
)
|
|
782
783
|
|
|
784
|
+
to_puzzle_hash = await action_scope.get_puzzle_hash(self.wallet_state_manager, override_reuse_puzhash_with=True)
|
|
783
785
|
async with action_scope.use() as interface:
|
|
784
786
|
other_additions: set[Coin] = {rem for tx in interface.side_effects.transactions for rem in tx.additions}
|
|
785
787
|
other_removals: set[Coin] = {rem for tx in interface.side_effects.transactions for rem in tx.removals}
|
|
@@ -787,7 +789,7 @@ class CRCATWallet(CATWallet):
|
|
|
787
789
|
TransactionRecord(
|
|
788
790
|
confirmed_at_height=uint32(0),
|
|
789
791
|
created_at_time=uint64(int(time.time())),
|
|
790
|
-
to_puzzle_hash=
|
|
792
|
+
to_puzzle_hash=to_puzzle_hash,
|
|
791
793
|
amount=uint64(sum(c.amount for c in coins)),
|
|
792
794
|
fee_amount=fee,
|
|
793
795
|
confirmed=False,
|
|
@@ -19,7 +19,7 @@ class CROuterPuzzle:
|
|
|
19
19
|
_match: Callable[[UncurriedPuzzle], Optional[PuzzleInfo]]
|
|
20
20
|
_construct: Callable[[PuzzleInfo, Program], Program]
|
|
21
21
|
_solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
|
|
22
|
-
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle], Optional[Program]]
|
|
22
|
+
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Optional[Program]], Optional[Program]]
|
|
23
23
|
_get_inner_solution: Callable[[PuzzleInfo, Program], Optional[Program]]
|
|
24
24
|
|
|
25
25
|
def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
|
|
@@ -37,14 +37,16 @@ class CROuterPuzzle:
|
|
|
37
37
|
constructor_dict["also"] = next_constructor.info
|
|
38
38
|
return PuzzleInfo(constructor_dict)
|
|
39
39
|
|
|
40
|
-
def get_inner_puzzle(
|
|
40
|
+
def get_inner_puzzle(
|
|
41
|
+
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
|
|
42
|
+
) -> Optional[Program]:
|
|
41
43
|
args: Optional[tuple[list[bytes32], Program, Program]] = match_cr_layer(puzzle_reveal)
|
|
42
44
|
if args is None:
|
|
43
45
|
raise ValueError("This driver is not for the specified puzzle reveal") # pragma: no cover
|
|
44
46
|
_, _, inner_puzzle = args
|
|
45
47
|
also = constructor.also()
|
|
46
48
|
if also is not None:
|
|
47
|
-
deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle))
|
|
49
|
+
deep_inner_puzzle: Optional[Program] = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
|
|
48
50
|
return deep_inner_puzzle
|
|
49
51
|
else:
|
|
50
52
|
return inner_puzzle
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, replace
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Any, Optional
|
|
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
|
|
@@ -20,16 +20,19 @@ from chia_puzzles_py.programs import REVOCATION_LAYER_HASH as REVOCATION_LAYER_H
|
|
|
20
20
|
from chia_puzzles_py.programs import STANDARD_VC_REVOCATION_PUZZLE as STANDARD_VC_REVOCATION_PUZZLE_BYTES
|
|
21
21
|
from chia_puzzles_py.programs import STD_PARENT_MORPHER as STD_PARENT_MORPHER_BYTES
|
|
22
22
|
from chia_puzzles_py.programs import STD_PARENT_MORPHER_HASH as STD_PARENT_MORPHER_HASH_BYTES
|
|
23
|
+
from chia_rs import CoinSpend
|
|
23
24
|
from chia_rs.sized_bytes import bytes32
|
|
24
25
|
from chia_rs.sized_ints import uint64
|
|
26
|
+
from typing_extensions import Self
|
|
25
27
|
|
|
26
28
|
from chia.types.blockchain_format.coin import Coin
|
|
27
29
|
from chia.types.blockchain_format.program import Program
|
|
28
|
-
from chia.types.coin_spend import
|
|
30
|
+
from chia.types.coin_spend import make_spend
|
|
29
31
|
from chia.util.hash import std_hash
|
|
30
32
|
from chia.util.streamable import Streamable, streamable
|
|
31
33
|
from chia.wallet.conditions import Condition, CreatePuzzleAnnouncement
|
|
32
34
|
from chia.wallet.lineage_proof import LineageProof
|
|
35
|
+
from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
|
|
33
36
|
from chia.wallet.puzzles.singleton_top_layer_v1_1 import (
|
|
34
37
|
SINGLETON_LAUNCHER,
|
|
35
38
|
SINGLETON_LAUNCHER_HASH,
|
|
@@ -40,6 +43,7 @@ from chia.wallet.puzzles.singleton_top_layer_v1_1 import (
|
|
|
40
43
|
solution_for_singleton,
|
|
41
44
|
)
|
|
42
45
|
from chia.wallet.uncurried_puzzle import UncurriedPuzzle, uncurry_puzzle
|
|
46
|
+
from chia.wallet.util.compute_additions import compute_additions
|
|
43
47
|
|
|
44
48
|
# Mods
|
|
45
49
|
EXTIGENT_METADATA_LAYER = Program.from_bytes(EXIGENT_METADATA_LAYER_BYTES)
|
|
@@ -288,7 +292,6 @@ OWNERSHIP_LAYER_LAUNCHER_HASH = OWNERSHIP_LAYER_LAUNCHER.get_tree_hash()
|
|
|
288
292
|
########################
|
|
289
293
|
# Verified Credentials #
|
|
290
294
|
########################
|
|
291
|
-
_T_VerifiedCredential = TypeVar("_T_VerifiedCredential", bound="VerifiedCredential")
|
|
292
295
|
|
|
293
296
|
|
|
294
297
|
@streamable
|
|
@@ -310,14 +313,14 @@ class VerifiedCredential(Streamable):
|
|
|
310
313
|
|
|
311
314
|
@classmethod
|
|
312
315
|
def launch(
|
|
313
|
-
cls
|
|
316
|
+
cls,
|
|
314
317
|
origin_coins: list[Coin],
|
|
315
318
|
provider_id: bytes32,
|
|
316
319
|
new_inner_puzzle_hash: bytes32,
|
|
317
320
|
memos: list[bytes32],
|
|
318
321
|
fee: uint64 = uint64(0),
|
|
319
322
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
320
|
-
) -> tuple[list[Program], list[CoinSpend],
|
|
323
|
+
) -> tuple[list[Program], list[CoinSpend], Self]:
|
|
321
324
|
"""
|
|
322
325
|
Launch a VC.
|
|
323
326
|
|
|
@@ -537,7 +540,7 @@ class VerifiedCredential(Streamable):
|
|
|
537
540
|
return True, ""
|
|
538
541
|
|
|
539
542
|
@classmethod
|
|
540
|
-
def get_next_from_coin_spend(cls
|
|
543
|
+
def get_next_from_coin_spend(cls, parent_spend: CoinSpend) -> Self:
|
|
541
544
|
"""
|
|
542
545
|
Given a coin spend, this will return the next VC that was create as an output of that spend. This is the main
|
|
543
546
|
method to use when syncing. If a spend has been identified as having a VC puzzle reveal, running this method
|
|
@@ -548,7 +551,7 @@ class VerifiedCredential(Streamable):
|
|
|
548
551
|
|
|
549
552
|
# BEGIN CODE
|
|
550
553
|
parent_coin: Coin = parent_spend.coin
|
|
551
|
-
solution
|
|
554
|
+
solution = Program.from_serialized(parent_spend.solution)
|
|
552
555
|
|
|
553
556
|
singleton: UncurriedPuzzle = uncurry_puzzle(parent_spend.puzzle_reveal)
|
|
554
557
|
launcher_id: bytes32 = bytes32(singleton.args.at("frf").as_atom())
|
|
@@ -606,7 +609,7 @@ class VerifiedCredential(Streamable):
|
|
|
606
609
|
parent_proof_hash=None if parent_proof_hash == Program.to(None) else parent_proof_hash,
|
|
607
610
|
)
|
|
608
611
|
|
|
609
|
-
new_vc:
|
|
612
|
+
new_vc: Self = cls(
|
|
610
613
|
coin,
|
|
611
614
|
singleton_lineage_proof,
|
|
612
615
|
eml_lineage_proof,
|
|
@@ -818,3 +821,42 @@ class VerifiedCredential(Streamable):
|
|
|
818
821
|
slightly_incomplete_vc.coin.amount,
|
|
819
822
|
),
|
|
820
823
|
)
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
# This class is sort of unparadigmatic as an outer puzzle.
|
|
827
|
+
# It lives somewhere between outer puzzle and inner puzzle, but the most convenient
|
|
828
|
+
# way to present it in this wallet is as an outer puzzle.
|
|
829
|
+
# This may lead to some peculiarities if use cases are to be expanded beyond simply using this
|
|
830
|
+
# inside of a CAT.
|
|
831
|
+
@dataclass(frozen=True)
|
|
832
|
+
class RevocationOuterPuzzle:
|
|
833
|
+
def match(self, puzzle: UncurriedPuzzle) -> Optional[PuzzleInfo]:
|
|
834
|
+
args = match_revocation_layer(puzzle)
|
|
835
|
+
if args is None:
|
|
836
|
+
return None
|
|
837
|
+
hidden_puzzle_hash, _ = args
|
|
838
|
+
constructor_dict: dict[str, Any] = {
|
|
839
|
+
"type": "revocation layer",
|
|
840
|
+
"hidden_puzzle_hash": "0x" + hidden_puzzle_hash.hex(),
|
|
841
|
+
}
|
|
842
|
+
return PuzzleInfo(constructor_dict)
|
|
843
|
+
|
|
844
|
+
def get_inner_puzzle(
|
|
845
|
+
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Optional[Program] = None
|
|
846
|
+
) -> Optional[Program]:
|
|
847
|
+
if solution is None:
|
|
848
|
+
raise ValueError("Cannot get_inner_puzzle of revocation layer without solution")
|
|
849
|
+
|
|
850
|
+
return solution.at("rf")
|
|
851
|
+
|
|
852
|
+
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Optional[Program]:
|
|
853
|
+
return solution.at("rrf")
|
|
854
|
+
|
|
855
|
+
def asset_id(self, constructor: PuzzleInfo) -> Optional[bytes32]:
|
|
856
|
+
return bytes32(constructor["hidden_puzzle_hash"])
|
|
857
|
+
|
|
858
|
+
def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
|
|
859
|
+
return create_revocation_layer(constructor["hidden_puzzle_hash"], inner_puzzle.get_tree_hash())
|
|
860
|
+
|
|
861
|
+
def solve(self, constructor: PuzzleInfo, solver: Solver, inner_puzzle: Program, inner_solution: Program) -> Program:
|
|
862
|
+
return solve_revocation_layer(inner_puzzle, inner_solution) # deliberately no support for hidden puzzle spends
|
|
@@ -2,11 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
from functools import cmp_to_key
|
|
5
|
-
from typing import Optional
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
7
|
from aiosqlite import Row
|
|
8
8
|
from chia_rs.sized_bytes import bytes32
|
|
9
9
|
from chia_rs.sized_ints import uint32, uint64
|
|
10
|
+
from typing_extensions import Self
|
|
10
11
|
|
|
11
12
|
from chia.types.blockchain_format.coin import Coin
|
|
12
13
|
from chia.types.blockchain_format.program import Program
|
|
@@ -81,9 +82,6 @@ class VCProofs:
|
|
|
81
82
|
return new_tree
|
|
82
83
|
|
|
83
84
|
|
|
84
|
-
_T_VCStore = TypeVar("_T_VCStore", bound="VCStore")
|
|
85
|
-
|
|
86
|
-
|
|
87
85
|
@streamable
|
|
88
86
|
@dataclasses.dataclass(frozen=True)
|
|
89
87
|
class VCRecord(Streamable):
|
|
@@ -114,7 +112,7 @@ class VCStore:
|
|
|
114
112
|
db_wrapper: DBWrapper2
|
|
115
113
|
|
|
116
114
|
@classmethod
|
|
117
|
-
async def create(cls
|
|
115
|
+
async def create(cls, db_wrapper: DBWrapper2) -> Self:
|
|
118
116
|
self = cls()
|
|
119
117
|
|
|
120
118
|
self.db_wrapper = db_wrapper
|
|
@@ -5,18 +5,17 @@ import time
|
|
|
5
5
|
import traceback
|
|
6
6
|
from typing import TYPE_CHECKING, Optional, TypeVar, Union
|
|
7
7
|
|
|
8
|
-
from chia_rs import G1Element, G2Element
|
|
8
|
+
from chia_rs import CoinSpend, CoinState, G1Element, G2Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
10
10
|
from chia_rs.sized_ints import uint32, uint64, uint128
|
|
11
|
-
from clvm.casts import int_to_bytes
|
|
12
11
|
from typing_extensions import Unpack
|
|
13
12
|
|
|
14
|
-
from chia.protocols.wallet_protocol import CoinState
|
|
15
13
|
from chia.server.ws_connection import WSChiaConnection
|
|
16
14
|
from chia.types.blockchain_format.coin import Coin, coin_as_list
|
|
17
15
|
from chia.types.blockchain_format.program import Program
|
|
18
16
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
19
|
-
from chia.types.coin_spend import
|
|
17
|
+
from chia.types.coin_spend import make_spend
|
|
18
|
+
from chia.util.casts import int_to_bytes
|
|
20
19
|
from chia.util.hash import std_hash
|
|
21
20
|
from chia.util.streamable import Streamable
|
|
22
21
|
from chia.wallet.conditions import (
|
|
@@ -187,9 +186,7 @@ class VCWallet:
|
|
|
187
186
|
if len(coins) == 0:
|
|
188
187
|
raise ValueError("Cannot find a coin to mint the verified credential.") # pragma: no cover
|
|
189
188
|
if inner_puzzle_hash is None: # pragma: no cover
|
|
190
|
-
inner_puzzle_hash = await
|
|
191
|
-
new=not action_scope.config.tx_config.reuse_puzhash
|
|
192
|
-
)
|
|
189
|
+
inner_puzzle_hash = await action_scope.get_puzzle_hash(self.wallet_state_manager)
|
|
193
190
|
dpuzs, coin_spends, vc = VerifiedCredential.launch(
|
|
194
191
|
coins,
|
|
195
192
|
provider_did,
|
|
@@ -395,7 +392,7 @@ class VCWallet:
|
|
|
395
392
|
else:
|
|
396
393
|
await self.generate_signed_transaction(
|
|
397
394
|
[uint64(1)],
|
|
398
|
-
[await
|
|
395
|
+
[await action_scope.get_puzzle_hash(self.wallet_state_manager)],
|
|
399
396
|
action_scope,
|
|
400
397
|
fee,
|
|
401
398
|
vc_id=vc.launcher_id,
|
|
@@ -544,15 +541,15 @@ class VCWallet:
|
|
|
544
541
|
spend_to_fix: CoinSpend = spends_to_fix[crcat_spend.crcat.coin.name()]
|
|
545
542
|
other_spends.append(
|
|
546
543
|
spend_to_fix.replace(
|
|
547
|
-
solution=
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
),
|
|
544
|
+
solution=Program.from_serialized(spend_to_fix.solution)
|
|
545
|
+
.replace(
|
|
546
|
+
ff=coin_args[coin_name][0],
|
|
547
|
+
frf=Program.to(None), # not general
|
|
548
|
+
frrf=bytes32.from_hexstr(coin_args[coin_name][2]),
|
|
549
|
+
frrrf=bytes32.from_hexstr(coin_args[coin_name][3]),
|
|
550
|
+
frrrrf=bytes32.from_hexstr(coin_args[coin_name][4]),
|
|
551
|
+
)
|
|
552
|
+
.to_serialized(),
|
|
556
553
|
)
|
|
557
554
|
)
|
|
558
555
|
else:
|
|
@@ -564,11 +561,7 @@ class VCWallet:
|
|
|
564
561
|
for launcher_id, vc in vcs.items():
|
|
565
562
|
await self.generate_signed_transaction(
|
|
566
563
|
[uint64(1)],
|
|
567
|
-
[
|
|
568
|
-
await self.standard_wallet.get_puzzle_hash(
|
|
569
|
-
new=not inner_action_scope.config.tx_config.reuse_puzhash
|
|
570
|
-
)
|
|
571
|
-
],
|
|
564
|
+
[await action_scope.get_puzzle_hash(self.wallet_state_manager)],
|
|
572
565
|
inner_action_scope,
|
|
573
566
|
vc_id=launcher_id,
|
|
574
567
|
extra_conditions=(
|