chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- 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.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
+
from collections.abc import Iterator
|
|
4
5
|
from itertools import chain
|
|
5
|
-
from typing import Any,
|
|
6
|
+
from typing import Any, Optional, Union
|
|
6
7
|
|
|
7
8
|
from clvm.EvalError import EvalError
|
|
8
9
|
|
|
@@ -217,7 +218,7 @@ def get_p2_singleton_puzhash(treasury_id: bytes32, asset_id: Optional[bytes32] =
|
|
|
217
218
|
|
|
218
219
|
def get_lockup_puzzle(
|
|
219
220
|
cat_tail_hash: Union[bytes32, Program],
|
|
220
|
-
previous_votes_list: Union[
|
|
221
|
+
previous_votes_list: Union[list[Optional[bytes32]], Program],
|
|
221
222
|
innerpuz: Optional[Program],
|
|
222
223
|
) -> Program:
|
|
223
224
|
self_hash: Program = DAO_LOCKUP_MOD.curry(
|
|
@@ -240,13 +241,13 @@ def add_proposal_to_active_list(
|
|
|
240
241
|
) -> Program:
|
|
241
242
|
curried_args, c_a = uncurry_lockup(lockup_puzzle)
|
|
242
243
|
(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
244
|
+
_SINGLETON_MOD_HASH,
|
|
245
|
+
_SINGLETON_LAUNCHER_PUZHASH,
|
|
246
|
+
_DAO_FINISHED_STATE_HASH,
|
|
247
|
+
_CAT_MOD_HASH,
|
|
247
248
|
CAT_TAIL_HASH,
|
|
248
249
|
) = c_a.as_iter()
|
|
249
|
-
(
|
|
250
|
+
(_SELF_HASH, ACTIVE_VOTES, INNERPUZ) = curried_args.as_iter()
|
|
250
251
|
new_active_votes = Program.to(proposal_id).cons(ACTIVE_VOTES) # (c proposal_id ACTIVE_VOTES)
|
|
251
252
|
if inner_puzzle is None:
|
|
252
253
|
inner_puzzle = INNERPUZ
|
|
@@ -263,7 +264,7 @@ def get_active_votes_from_lockup_puzzle(lockup_puzzle: Program) -> Program:
|
|
|
263
264
|
_CAT_TAIL_HASH,
|
|
264
265
|
) = list(c_a.as_iter())
|
|
265
266
|
(
|
|
266
|
-
|
|
267
|
+
_self_hash,
|
|
267
268
|
ACTIVE_VOTES,
|
|
268
269
|
_INNERPUZ,
|
|
269
270
|
) = curried_args.as_iter()
|
|
@@ -284,7 +285,7 @@ def get_innerpuz_from_lockup_puzzle(lockup_puzzle: Program) -> Optional[Program]
|
|
|
284
285
|
_CAT_TAIL_HASH,
|
|
285
286
|
) = list(c_a.as_iter())
|
|
286
287
|
(
|
|
287
|
-
|
|
288
|
+
_self_hash,
|
|
288
289
|
_ACTIVE_VOTES,
|
|
289
290
|
INNERPUZ,
|
|
290
291
|
) = list(curried_args.as_iter())
|
|
@@ -394,10 +395,10 @@ def get_treasury_rules_from_puzzle(puzzle_reveal: Optional[Program]) -> DAORules
|
|
|
394
395
|
) = curried_args
|
|
395
396
|
curried_args_prg = uncurry_proposal_validator(proposal_validator)
|
|
396
397
|
(
|
|
397
|
-
|
|
398
|
-
|
|
398
|
+
_SINGLETON_STRUCT,
|
|
399
|
+
_PROPOSAL_SELF_HASH,
|
|
399
400
|
PROPOSAL_MINIMUM_AMOUNT,
|
|
400
|
-
|
|
401
|
+
_PAYOUT_PUZHASH,
|
|
401
402
|
) = curried_args_prg.as_iter()
|
|
402
403
|
return DAORules(
|
|
403
404
|
uint64(proposal_timelock.as_int()),
|
|
@@ -419,7 +420,7 @@ def get_new_puzzle_from_treasury_solution(puzzle_reveal: Program, solution: Prog
|
|
|
419
420
|
if mod == DAO_UPDATE_PROPOSAL_MOD:
|
|
420
421
|
(
|
|
421
422
|
DAO_TREASURY_MOD_HASH,
|
|
422
|
-
|
|
423
|
+
_DAO_VALIDATOR_MOD_HASH,
|
|
423
424
|
TREASURY_SINGLETON_STRUCT,
|
|
424
425
|
PROPOSAL_SELF_HASH,
|
|
425
426
|
proposal_minimum_amount,
|
|
@@ -462,19 +463,19 @@ def get_new_puzzle_from_proposal_solution(puzzle_reveal: Program, solution: Prog
|
|
|
462
463
|
c_a, curried_args = uncurry_proposal(puzzle_reveal)
|
|
463
464
|
assert isinstance(curried_args, Program)
|
|
464
465
|
(
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
466
|
+
_DAO_PROPOSAL_TIMER_MOD_HASH,
|
|
467
|
+
_SINGLETON_MOD_HASH,
|
|
468
|
+
_SINGLETON_LAUNCHER_PUZHASH,
|
|
469
|
+
_CAT_MOD_HASH,
|
|
470
|
+
_DAO_FINISHED_STATE_HASH,
|
|
471
|
+
_DAO_TREASURY_MOD_HASH,
|
|
472
|
+
_lockup_self_hash,
|
|
472
473
|
cat_tail_hash,
|
|
473
474
|
treasury_id,
|
|
474
475
|
) = curried_args.as_iter()
|
|
475
476
|
assert isinstance(c_a, Program)
|
|
476
477
|
(
|
|
477
|
-
|
|
478
|
+
_curry_one,
|
|
478
479
|
proposal_id,
|
|
479
480
|
proposed_puzzle_hash,
|
|
480
481
|
yes_votes,
|
|
@@ -508,25 +509,25 @@ def get_new_puzzle_from_proposal_solution(puzzle_reveal: Program, solution: Prog
|
|
|
508
509
|
if mod.uncurry()[0] == DAO_PROPOSAL_MOD:
|
|
509
510
|
c_a, curried_args = uncurry_proposal(puzzle_reveal)
|
|
510
511
|
(
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
512
|
+
_DAO_PROPOSAL_TIMER_MOD_HASH,
|
|
513
|
+
_SINGLETON_MOD_HASH,
|
|
514
|
+
_SINGLETON_LAUNCHER_PUZHASH,
|
|
515
|
+
_CAT_MOD_HASH,
|
|
516
|
+
_DAO_FINISHED_STATE_HASH,
|
|
517
|
+
_DAO_TREASURY_MOD_HASH,
|
|
518
|
+
_lockup_self_hash,
|
|
518
519
|
cat_tail_hash,
|
|
519
520
|
treasury_id,
|
|
520
521
|
) = curried_args.as_iter()
|
|
521
522
|
(
|
|
522
|
-
|
|
523
|
+
_curry_one,
|
|
523
524
|
proposal_id,
|
|
524
525
|
proposed_puzzle_hash,
|
|
525
526
|
yes_votes,
|
|
526
527
|
total_votes,
|
|
527
528
|
) = c_a.as_iter()
|
|
528
529
|
else: # pragma: no cover
|
|
529
|
-
SINGLETON_STRUCT,
|
|
530
|
+
SINGLETON_STRUCT, _dao_finished_hash = currieds.as_iter()
|
|
530
531
|
proposal_id = SINGLETON_STRUCT.rest().first()
|
|
531
532
|
return get_finished_state_inner_puzzle(bytes32(proposal_id.as_atom()))
|
|
532
533
|
|
|
@@ -570,7 +571,7 @@ def uncurry_proposal_validator(proposal_validator_program: Program) -> Program:
|
|
|
570
571
|
return curried_args
|
|
571
572
|
|
|
572
573
|
|
|
573
|
-
def uncurry_treasury(treasury_puzzle: Program) ->
|
|
574
|
+
def uncurry_treasury(treasury_puzzle: Program) -> list[Program]:
|
|
574
575
|
try:
|
|
575
576
|
mod, curried_args = treasury_puzzle.uncurry()
|
|
576
577
|
except ValueError as e: # pragma: no cover
|
|
@@ -582,7 +583,7 @@ def uncurry_treasury(treasury_puzzle: Program) -> List[Program]:
|
|
|
582
583
|
return list(curried_args.as_iter())
|
|
583
584
|
|
|
584
585
|
|
|
585
|
-
def uncurry_proposal(proposal_puzzle: Program) ->
|
|
586
|
+
def uncurry_proposal(proposal_puzzle: Program) -> tuple[Program, Program]:
|
|
586
587
|
try:
|
|
587
588
|
mod, curried_args = proposal_puzzle.uncurry()
|
|
588
589
|
except ValueError as e: # pragma: no cover
|
|
@@ -598,7 +599,7 @@ def uncurry_proposal(proposal_puzzle: Program) -> Tuple[Program, Program]:
|
|
|
598
599
|
return curried_args, c_a
|
|
599
600
|
|
|
600
601
|
|
|
601
|
-
def uncurry_lockup(lockup_puzzle: Program) ->
|
|
602
|
+
def uncurry_lockup(lockup_puzzle: Program) -> tuple[Program, Program]:
|
|
602
603
|
try:
|
|
603
604
|
mod, curried_args = lockup_puzzle.uncurry()
|
|
604
605
|
except ValueError as e: # pragma: no cover
|
|
@@ -615,7 +616,7 @@ def uncurry_lockup(lockup_puzzle: Program) -> Tuple[Program, Program]:
|
|
|
615
616
|
|
|
616
617
|
|
|
617
618
|
# This is the proposed puzzle
|
|
618
|
-
def get_proposal_args(puzzle: Program) ->
|
|
619
|
+
def get_proposal_args(puzzle: Program) -> tuple[ProposalType, Program]:
|
|
619
620
|
try:
|
|
620
621
|
mod, curried_args = puzzle.uncurry()
|
|
621
622
|
except ValueError as e: # pragma: no cover
|
|
@@ -697,7 +698,7 @@ def match_finished_puzzle(mod: Program, curried_args: Program) -> Optional[Itera
|
|
|
697
698
|
|
|
698
699
|
# This is used in WSM to determine whether we have a dao funding spend
|
|
699
700
|
def match_funding_puzzle(
|
|
700
|
-
uncurried: UncurriedPuzzle, solution: Program, coin: Coin, dao_ids:
|
|
701
|
+
uncurried: UncurriedPuzzle, solution: Program, coin: Coin, dao_ids: list[bytes32] = []
|
|
701
702
|
) -> Optional[bool]:
|
|
702
703
|
if not dao_ids:
|
|
703
704
|
return None
|
|
@@ -710,7 +711,7 @@ def match_funding_puzzle(
|
|
|
710
711
|
inner_puz, _ = uncurried.args.at("rf").uncurry()
|
|
711
712
|
if inner_puz == DAO_TREASURY_MOD:
|
|
712
713
|
delegated_puz = solution.at("rrfrrf")
|
|
713
|
-
|
|
714
|
+
_delegated_mod, delegated_args = delegated_puz.uncurry()
|
|
714
715
|
if delegated_puz.uncurry()[0] == SPEND_P2_SINGLETON_MOD:
|
|
715
716
|
if coin.puzzle_hash == delegated_args.at("rrrrf").as_atom(): # pragma: no cover
|
|
716
717
|
return True
|
|
@@ -744,19 +745,19 @@ def match_dao_cat_puzzle(uncurried: UncurriedPuzzle) -> Optional[Iterator[Progra
|
|
|
744
745
|
|
|
745
746
|
def generate_simple_proposal_innerpuz(
|
|
746
747
|
treasury_id: bytes32,
|
|
747
|
-
recipient_puzhashes:
|
|
748
|
-
amounts:
|
|
749
|
-
asset_types:
|
|
748
|
+
recipient_puzhashes: list[bytes32],
|
|
749
|
+
amounts: list[uint64],
|
|
750
|
+
asset_types: list[Optional[bytes32]] = [None],
|
|
750
751
|
) -> Program:
|
|
751
752
|
if len(recipient_puzhashes) != len(amounts) != len(asset_types): # pragma: no cover
|
|
752
753
|
raise ValueError("Mismatch in the number of recipients, amounts, or asset types")
|
|
753
|
-
xch_conds:
|
|
754
|
-
cat_conds:
|
|
754
|
+
xch_conds: list[Any] = []
|
|
755
|
+
cat_conds: list[Any] = []
|
|
755
756
|
seen_assets = set()
|
|
756
757
|
for recipient_puzhash, amount, asset_type in zip(recipient_puzhashes, amounts, asset_types):
|
|
757
758
|
if asset_type:
|
|
758
759
|
if asset_type in seen_assets:
|
|
759
|
-
asset_conds =
|
|
760
|
+
asset_conds = next(x for x in cat_conds if x[0] == asset_type)
|
|
760
761
|
asset_conds[1].append([51, recipient_puzhash, amount, [recipient_puzhash]])
|
|
761
762
|
else:
|
|
762
763
|
cat_conds.append([asset_type, [[51, recipient_puzhash, amount, [recipient_puzhash]]]])
|
|
@@ -6,7 +6,7 @@ import json
|
|
|
6
6
|
import logging
|
|
7
7
|
import re
|
|
8
8
|
import time
|
|
9
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
9
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast
|
|
10
10
|
|
|
11
11
|
from chia_rs import AugSchemeMPL, G1Element, G2Element
|
|
12
12
|
from clvm.casts import int_from_bytes
|
|
@@ -21,9 +21,13 @@ from chia.types.coin_spend import CoinSpend, make_spend
|
|
|
21
21
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
22
22
|
from chia.util.ints import uint32, uint64, uint128
|
|
23
23
|
from chia.wallet import singleton
|
|
24
|
-
from chia.wallet.cat_wallet.cat_utils import
|
|
24
|
+
from chia.wallet.cat_wallet.cat_utils import (
|
|
25
|
+
CAT_MOD,
|
|
26
|
+
SpendableCAT,
|
|
27
|
+
construct_cat_puzzle,
|
|
28
|
+
unsigned_spend_bundle_for_spendable_cats,
|
|
29
|
+
)
|
|
25
30
|
from chia.wallet.cat_wallet.cat_utils import get_innerpuzzle_from_puzzle as get_innerpuzzle_from_cat_puzzle
|
|
26
|
-
from chia.wallet.cat_wallet.cat_utils import unsigned_spend_bundle_for_spendable_cats
|
|
27
31
|
from chia.wallet.cat_wallet.cat_wallet import CATWallet
|
|
28
32
|
from chia.wallet.cat_wallet.dao_cat_wallet import DAOCATWallet
|
|
29
33
|
from chia.wallet.coin_selection import select_coins
|
|
@@ -152,7 +156,7 @@ class DAOWallet:
|
|
|
152
156
|
raise ValueError(f"Your balance of {bal} mojos is not enough to create {amount_of_cats} CATs")
|
|
153
157
|
|
|
154
158
|
self.dao_info = DAOInfo(
|
|
155
|
-
treasury_id=bytes32
|
|
159
|
+
treasury_id=bytes32.zeros,
|
|
156
160
|
cat_wallet_id=uint32(0),
|
|
157
161
|
dao_cat_wallet_id=uint32(0),
|
|
158
162
|
proposals_list=[],
|
|
@@ -180,7 +184,7 @@ class DAOWallet:
|
|
|
180
184
|
fee_for_cat=fee_for_cat,
|
|
181
185
|
)
|
|
182
186
|
except Exception as e_info: # pragma: no cover
|
|
183
|
-
await wallet_state_manager.
|
|
187
|
+
await wallet_state_manager.delete_wallet(self.id())
|
|
184
188
|
self.log.exception(f"Failed to create dao wallet: {e_info}")
|
|
185
189
|
raise
|
|
186
190
|
|
|
@@ -326,14 +330,14 @@ class DAOWallet:
|
|
|
326
330
|
parent_info = ccparent
|
|
327
331
|
return parent_info
|
|
328
332
|
|
|
329
|
-
async def get_max_send_amount(self, records: Optional[
|
|
333
|
+
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
330
334
|
return uint128(0) # pragma: no cover
|
|
331
335
|
|
|
332
|
-
async def get_spendable_balance(self, unspent_records: Optional[
|
|
336
|
+
async def get_spendable_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
333
337
|
# No spendable or receivable value
|
|
334
338
|
return uint128(1)
|
|
335
339
|
|
|
336
|
-
async def get_confirmed_balance(self, record_list: Optional[
|
|
340
|
+
async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
337
341
|
# No spendable or receivable value
|
|
338
342
|
return uint128(1)
|
|
339
343
|
|
|
@@ -341,7 +345,7 @@ class DAOWallet:
|
|
|
341
345
|
self,
|
|
342
346
|
amount: uint64,
|
|
343
347
|
action_scope: WalletActionScope,
|
|
344
|
-
) ->
|
|
348
|
+
) -> set[Coin]:
|
|
345
349
|
"""
|
|
346
350
|
Returns a set of coins that can be used for generating a new transaction.
|
|
347
351
|
Note: Must be called under wallet state manager lock
|
|
@@ -353,13 +357,13 @@ class DAOWallet:
|
|
|
353
357
|
self.log.warning(f"Can't select {amount}, from spendable {spendable_amount} for wallet id {self.id()}")
|
|
354
358
|
return set()
|
|
355
359
|
|
|
356
|
-
spendable_coins:
|
|
360
|
+
spendable_coins: list[WalletCoinRecord] = list(
|
|
357
361
|
await self.wallet_state_manager.get_spendable_coins_for_wallet(self.wallet_info.id)
|
|
358
362
|
)
|
|
359
363
|
|
|
360
364
|
# Try to use coins from the store, if there isn't enough of "unused"
|
|
361
365
|
# coins use change coins that are not confirmed yet
|
|
362
|
-
unconfirmed_removals:
|
|
366
|
+
unconfirmed_removals: dict[bytes32, Coin] = await self.wallet_state_manager.unconfirmed_removals_for_wallet(
|
|
363
367
|
self.wallet_info.id
|
|
364
368
|
)
|
|
365
369
|
async with action_scope.use() as interface:
|
|
@@ -379,7 +383,7 @@ class DAOWallet:
|
|
|
379
383
|
# No spendable or receivable value
|
|
380
384
|
return uint64(0)
|
|
381
385
|
|
|
382
|
-
async def get_unconfirmed_balance(self, record_list: Optional[
|
|
386
|
+
async def get_unconfirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
383
387
|
# No spendable or receivable value
|
|
384
388
|
return uint128(1)
|
|
385
389
|
|
|
@@ -392,7 +396,7 @@ class DAOWallet:
|
|
|
392
396
|
# if asset_id == None: then we get normal XCH
|
|
393
397
|
async def select_coins_for_asset_type(
|
|
394
398
|
self, amount: uint64, action_scope: WalletActionScope, asset_id: Optional[bytes32] = None
|
|
395
|
-
) ->
|
|
399
|
+
) -> list[Coin]:
|
|
396
400
|
puzhash = get_p2_singleton_puzhash(self.dao_info.treasury_id, asset_id=asset_id)
|
|
397
401
|
records = await self.wallet_state_manager.coin_store.get_coin_records_by_puzzle_hash(puzhash)
|
|
398
402
|
unspent_records = [r for r in records if not r.spent]
|
|
@@ -446,7 +450,6 @@ class DAOWallet:
|
|
|
446
450
|
self.log.info(f"DAO funding coin added: {coin.name().hex()}:{coin}. Asset ID: {asset_id}")
|
|
447
451
|
except Exception as e: # pragma: no cover
|
|
448
452
|
self.log.exception(f"Error occurred during dao wallet coin addition: {e}")
|
|
449
|
-
return
|
|
450
453
|
|
|
451
454
|
def get_cat_tail_hash(self) -> bytes32:
|
|
452
455
|
cat_wallet: CATWallet = self.wallet_state_manager.wallets[self.dao_info.cat_wallet_id]
|
|
@@ -467,7 +470,6 @@ class DAOWallet:
|
|
|
467
470
|
]
|
|
468
471
|
dao_info = dataclasses.replace(self.dao_info, proposals_list=new_list)
|
|
469
472
|
await self.save_info(dao_info)
|
|
470
|
-
return
|
|
471
473
|
|
|
472
474
|
async def resync_treasury_state(self) -> None:
|
|
473
475
|
"""
|
|
@@ -490,7 +492,7 @@ class DAOWallet:
|
|
|
490
492
|
if len(children) == 0:
|
|
491
493
|
break
|
|
492
494
|
|
|
493
|
-
children_state_list:
|
|
495
|
+
children_state_list: list[CoinState] = [child for child in children if child.coin.amount % 2 == 1]
|
|
494
496
|
# ensure children_state_list has only one odd amount coin (the treasury)
|
|
495
497
|
if (len(children_state_list) == 0) or (len(children_state_list) > 1): # pragma: no cover
|
|
496
498
|
raise RuntimeError("Could not retrieve child_state")
|
|
@@ -604,8 +606,6 @@ class DAOWallet:
|
|
|
604
606
|
response: Optional[RespondBlockHeader] = await peer.call_api(FullNodeAPI.request_block_header, request)
|
|
605
607
|
await wallet_node.sync_from_untrusted_close_to_peak(response.header_block, peer)
|
|
606
608
|
|
|
607
|
-
return
|
|
608
|
-
|
|
609
609
|
async def generate_new_dao(
|
|
610
610
|
self,
|
|
611
611
|
amount_of_cats_to_create: Optional[uint64],
|
|
@@ -613,7 +613,7 @@ class DAOWallet:
|
|
|
613
613
|
cat_tail_hash: Optional[bytes32] = None,
|
|
614
614
|
fee: uint64 = uint64(0),
|
|
615
615
|
fee_for_cat: uint64 = uint64(0),
|
|
616
|
-
extra_conditions:
|
|
616
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
617
617
|
) -> None:
|
|
618
618
|
"""
|
|
619
619
|
Create a new DAO treasury using the dao_rules object. This does the first spend to create the launcher
|
|
@@ -846,7 +846,7 @@ class DAOWallet:
|
|
|
846
846
|
action_scope: WalletActionScope,
|
|
847
847
|
vote_amount: Optional[uint64] = None,
|
|
848
848
|
fee: uint64 = uint64(0),
|
|
849
|
-
extra_conditions:
|
|
849
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
850
850
|
) -> None:
|
|
851
851
|
dao_rules = get_treasury_rules_from_puzzle(self.dao_info.current_treasury_innerpuz)
|
|
852
852
|
coins = await self.standard_wallet.select_coins(
|
|
@@ -1027,7 +1027,7 @@ class DAOWallet:
|
|
|
1027
1027
|
is_yes_vote: bool,
|
|
1028
1028
|
action_scope: WalletActionScope,
|
|
1029
1029
|
fee: uint64 = uint64(0),
|
|
1030
|
-
extra_conditions:
|
|
1030
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1031
1031
|
) -> None:
|
|
1032
1032
|
self.log.info(f"Trying to create a proposal close spend with ID: {proposal_id}")
|
|
1033
1033
|
proposal_info = None
|
|
@@ -1145,7 +1145,7 @@ class DAOWallet:
|
|
|
1145
1145
|
genesis_id: Optional[bytes32] = None,
|
|
1146
1146
|
fee: uint64 = uint64(0),
|
|
1147
1147
|
self_destruct: bool = False,
|
|
1148
|
-
extra_conditions:
|
|
1148
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1149
1149
|
) -> None:
|
|
1150
1150
|
self.log.info(f"Trying to create a proposal close spend with ID: {proposal_id}")
|
|
1151
1151
|
proposal_info = None
|
|
@@ -1215,8 +1215,8 @@ class DAOWallet:
|
|
|
1215
1215
|
)
|
|
1216
1216
|
c_a, curried_args_prg = uncurry_proposal(proposal_info.current_innerpuz)
|
|
1217
1217
|
(
|
|
1218
|
-
|
|
1219
|
-
|
|
1218
|
+
_SELF_HASH,
|
|
1219
|
+
_PROPOSAL_ID,
|
|
1220
1220
|
PROPOSED_PUZ_HASH,
|
|
1221
1221
|
YES_VOTES,
|
|
1222
1222
|
TOTAL_VOTES,
|
|
@@ -1257,11 +1257,11 @@ class DAOWallet:
|
|
|
1257
1257
|
proposal_type, curried_args_prg = get_proposal_args(puzzle_reveal)
|
|
1258
1258
|
if proposal_type == ProposalType.SPEND:
|
|
1259
1259
|
(
|
|
1260
|
-
|
|
1261
|
-
|
|
1260
|
+
_TREASURY_SINGLETON_STRUCT,
|
|
1261
|
+
_CAT_MOD_HASH,
|
|
1262
1262
|
CONDITIONS,
|
|
1263
1263
|
LIST_OF_TAILHASH_CONDITIONS,
|
|
1264
|
-
|
|
1264
|
+
_P2_SINGLETON_VIA_DELEGATED_PUZZLE_PUZHASH,
|
|
1265
1265
|
) = curried_args_prg.as_iter()
|
|
1266
1266
|
|
|
1267
1267
|
sum = 0
|
|
@@ -1421,18 +1421,18 @@ class DAOWallet:
|
|
|
1421
1421
|
|
|
1422
1422
|
elif proposal_type == ProposalType.UPDATE:
|
|
1423
1423
|
(
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1424
|
+
_TREASURY_MOD_HASH,
|
|
1425
|
+
_VALIDATOR_MOD_HASH,
|
|
1426
|
+
_SINGLETON_STRUCT,
|
|
1427
|
+
_PROPOSAL_SELF_HASH,
|
|
1428
|
+
_PROPOSAL_MINIMUM_AMOUNT,
|
|
1429
|
+
_PROPOSAL_EXCESS_PAYOUT_PUZHASH,
|
|
1430
|
+
_PROPOSAL_LENGTH,
|
|
1431
|
+
_PROPOSAL_SOFTCLOSE_LENGTH,
|
|
1432
|
+
_ATTENDANCE_REQUIRED,
|
|
1433
|
+
_PASS_MARGIN,
|
|
1434
|
+
_PROPOSAL_SELF_DESTRUCT_TIME,
|
|
1435
|
+
_ORACLE_SPEND_DELAY,
|
|
1436
1436
|
) = curried_args_prg.as_iter()
|
|
1437
1437
|
coin_spends = []
|
|
1438
1438
|
treasury_inner_puzhash = self.dao_info.current_treasury_innerpuz.get_tree_hash()
|
|
@@ -1473,7 +1473,6 @@ class DAOWallet:
|
|
|
1473
1473
|
spend_bundle = WalletSpendBundle([proposal_cs, treasury_cs], AugSchemeMPL.aggregate([]))
|
|
1474
1474
|
else:
|
|
1475
1475
|
# TODO: maybe we can refactor this to provide clarity around timer_cs having been defined
|
|
1476
|
-
# pylint: disable-next=E0606
|
|
1477
1476
|
spend_bundle = WalletSpendBundle([proposal_cs, timer_cs, treasury_cs], AugSchemeMPL.aggregate([]))
|
|
1478
1477
|
if fee > 0:
|
|
1479
1478
|
await self.standard_wallet.create_tandem_xch_tx(fee, action_scope)
|
|
@@ -1536,7 +1535,7 @@ class DAOWallet:
|
|
|
1536
1535
|
amount: uint64,
|
|
1537
1536
|
action_scope: WalletActionScope,
|
|
1538
1537
|
fee: uint64 = uint64(0),
|
|
1539
|
-
extra_conditions:
|
|
1538
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1540
1539
|
) -> None:
|
|
1541
1540
|
if funding_wallet.type() == WalletType.STANDARD_WALLET.value:
|
|
1542
1541
|
p2_singleton_puzhash = get_p2_singleton_puzhash(self.dao_info.treasury_id, asset_id=None)
|
|
@@ -1569,7 +1568,7 @@ class DAOWallet:
|
|
|
1569
1568
|
action_scope: WalletActionScope,
|
|
1570
1569
|
fee: uint64 = uint64(0),
|
|
1571
1570
|
funding_wallet_id: uint32 = uint32(1),
|
|
1572
|
-
extra_conditions:
|
|
1571
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1573
1572
|
) -> None:
|
|
1574
1573
|
# set up the p2_singleton
|
|
1575
1574
|
funding_wallet = self.wallet_state_manager.wallets[funding_wallet_id]
|
|
@@ -1594,7 +1593,7 @@ class DAOWallet:
|
|
|
1594
1593
|
self,
|
|
1595
1594
|
action_scope: WalletActionScope,
|
|
1596
1595
|
fee: uint64 = uint64(0),
|
|
1597
|
-
extra_conditions:
|
|
1596
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1598
1597
|
) -> None:
|
|
1599
1598
|
dao_cat_wallet: DAOCATWallet = self.wallet_state_manager.wallets[self.dao_info.dao_cat_wallet_id]
|
|
1600
1599
|
spends = []
|
|
@@ -1648,7 +1647,7 @@ class DAOWallet:
|
|
|
1648
1647
|
async with action_scope.use() as interface:
|
|
1649
1648
|
interface.side_effects.transactions.append(record)
|
|
1650
1649
|
|
|
1651
|
-
async def parse_proposal(self, proposal_id: bytes32) ->
|
|
1650
|
+
async def parse_proposal(self, proposal_id: bytes32) -> dict[str, Any]:
|
|
1652
1651
|
for prop_info in self.dao_info.proposals_list:
|
|
1653
1652
|
if prop_info.proposal_id == proposal_id:
|
|
1654
1653
|
state = await self.get_proposal_state(proposal_id)
|
|
@@ -1657,11 +1656,11 @@ class DAOWallet:
|
|
|
1657
1656
|
if proposal_type == ProposalType.SPEND:
|
|
1658
1657
|
cat_launcher = create_cat_launcher_for_singleton_id(self.dao_info.treasury_id)
|
|
1659
1658
|
(
|
|
1660
|
-
|
|
1661
|
-
|
|
1659
|
+
_TREASURY_SINGLETON_STRUCT,
|
|
1660
|
+
_CAT_MOD_HASH,
|
|
1662
1661
|
CONDITIONS,
|
|
1663
1662
|
LIST_OF_TAILHASH_CONDITIONS,
|
|
1664
|
-
|
|
1663
|
+
_P2_SINGLETON_VIA_DELEGATED_PUZZLE_PUZHASH,
|
|
1665
1664
|
) = curried_args.as_iter()
|
|
1666
1665
|
mint_amount = None
|
|
1667
1666
|
new_cat_puzhash = None
|
|
@@ -1675,10 +1674,10 @@ class DAOWallet:
|
|
|
1675
1674
|
cc = {"puzzle_hash": cond.at("rf").as_atom(), "amount": cond.at("rrf").as_int()}
|
|
1676
1675
|
xch_created_coins.append(cc)
|
|
1677
1676
|
|
|
1678
|
-
asset_create_coins:
|
|
1677
|
+
asset_create_coins: list[dict[Any, Any]] = []
|
|
1679
1678
|
for asset in LIST_OF_TAILHASH_CONDITIONS.as_iter():
|
|
1680
1679
|
if asset == Program.to(0): # pragma: no cover
|
|
1681
|
-
asset_dict: Optional[
|
|
1680
|
+
asset_dict: Optional[dict[str, Any]] = None
|
|
1682
1681
|
else:
|
|
1683
1682
|
asset_id = asset.first().as_atom()
|
|
1684
1683
|
cc_list = []
|
|
@@ -1691,7 +1690,7 @@ class DAOWallet:
|
|
|
1691
1690
|
# cc_list.append([asset_id, asset_dict])
|
|
1692
1691
|
cc_list.append(asset_dict)
|
|
1693
1692
|
asset_create_coins.append({"asset_id": asset_id, "conditions": cc_list})
|
|
1694
|
-
dictionary:
|
|
1693
|
+
dictionary: dict[str, Any] = {
|
|
1695
1694
|
"state": state,
|
|
1696
1695
|
"proposal_type": proposal_type.value,
|
|
1697
1696
|
"proposed_puzzle_reveal": proposed_puzzle_reveal,
|
|
@@ -1761,7 +1760,7 @@ class DAOWallet:
|
|
|
1761
1760
|
self,
|
|
1762
1761
|
amount: uint64,
|
|
1763
1762
|
action_scope: WalletActionScope,
|
|
1764
|
-
) ->
|
|
1763
|
+
) -> list[TransactionRecord]:
|
|
1765
1764
|
dao_cat_wallet: DAOCATWallet = self.wallet_state_manager.wallets[self.dao_info.dao_cat_wallet_id]
|
|
1766
1765
|
return await dao_cat_wallet.enter_dao_cat_voting_mode(amount, action_scope)
|
|
1767
1766
|
|
|
@@ -1823,7 +1822,7 @@ class DAOWallet:
|
|
|
1823
1822
|
)
|
|
1824
1823
|
await self.add_parent(new_state.coin.name(), future_parent)
|
|
1825
1824
|
return
|
|
1826
|
-
index
|
|
1825
|
+
index += 1
|
|
1827
1826
|
|
|
1828
1827
|
# check if we are the finished state
|
|
1829
1828
|
if current_innerpuz == get_finished_state_inner_puzzle(singleton_id):
|
|
@@ -1831,26 +1830,26 @@ class DAOWallet:
|
|
|
1831
1830
|
|
|
1832
1831
|
c_a, curried_args = uncurry_proposal(puzzle)
|
|
1833
1832
|
(
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1833
|
+
_DAO_PROPOSAL_TIMER_MOD_HASH,
|
|
1834
|
+
_SINGLETON_MOD_HASH,
|
|
1835
|
+
_SINGLETON_LAUNCHER_PUZHASH,
|
|
1836
|
+
_CAT_MOD_HASH,
|
|
1837
|
+
_DAO_FINISHED_STATE_HASH,
|
|
1839
1838
|
_DAO_TREASURY_MOD_HASH,
|
|
1840
|
-
|
|
1839
|
+
_lockup_self_hash,
|
|
1841
1840
|
cat_tail_hash,
|
|
1842
|
-
|
|
1841
|
+
_treasury_id,
|
|
1843
1842
|
) = curried_args.as_iter()
|
|
1844
1843
|
(
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1844
|
+
_curry_one,
|
|
1845
|
+
_proposal_id,
|
|
1846
|
+
_proposed_puzzle_hash,
|
|
1848
1847
|
yes_votes,
|
|
1849
1848
|
total_votes,
|
|
1850
1849
|
) = c_a.as_iter()
|
|
1851
1850
|
|
|
1852
1851
|
if current_coin is None: # pragma: no cover
|
|
1853
|
-
raise RuntimeError("get_most_recent_singleton_coin_from_coin_spend({new_state}) failed")
|
|
1852
|
+
raise RuntimeError(f"get_most_recent_singleton_coin_from_coin_spend({new_state}) failed")
|
|
1854
1853
|
|
|
1855
1854
|
timer_coin = None
|
|
1856
1855
|
if solution.at("rrrrrrf").as_int() == 0:
|
|
@@ -1907,7 +1906,7 @@ class DAOWallet:
|
|
|
1907
1906
|
)
|
|
1908
1907
|
await self.add_parent(new_state.coin.name(), future_parent)
|
|
1909
1908
|
return
|
|
1910
|
-
index
|
|
1909
|
+
index += 1
|
|
1911
1910
|
|
|
1912
1911
|
# Search for the timer coin
|
|
1913
1912
|
if not ended:
|
|
@@ -2002,9 +2001,9 @@ class DAOWallet:
|
|
|
2002
2001
|
)
|
|
2003
2002
|
await self.add_parent(new_state.coin.name(), future_parent)
|
|
2004
2003
|
return
|
|
2005
|
-
index
|
|
2004
|
+
index += 1
|
|
2006
2005
|
|
|
2007
|
-
async def get_proposal_state(self, proposal_id: bytes32) ->
|
|
2006
|
+
async def get_proposal_state(self, proposal_id: bytes32) -> dict[str, Union[int, bool]]:
|
|
2008
2007
|
"""
|
|
2009
2008
|
Use this to figure out whether a proposal has passed or failed and whether it can be closed
|
|
2010
2009
|
Given a proposal_id:
|
|
@@ -2084,7 +2083,6 @@ class DAOWallet:
|
|
|
2084
2083
|
uint64(new_state.coin.amount),
|
|
2085
2084
|
)
|
|
2086
2085
|
await self.add_parent(new_state.coin.name(), future_parent)
|
|
2087
|
-
return
|
|
2088
2086
|
|
|
2089
2087
|
async def apply_state_transition(self, new_state: CoinSpend, block_height: uint32) -> bool:
|
|
2090
2088
|
"""
|
|
@@ -2105,7 +2103,7 @@ class DAOWallet:
|
|
|
2105
2103
|
puzzle = get_inner_puzzle_from_singleton(new_state.puzzle_reveal)
|
|
2106
2104
|
assert puzzle
|
|
2107
2105
|
try:
|
|
2108
|
-
mod,
|
|
2106
|
+
mod, _curried_args = puzzle.uncurry()
|
|
2109
2107
|
except ValueError as e: # pragma: no cover
|
|
2110
2108
|
self.log.warning("Cannot uncurry puzzle in DAO Wallet: error: %s", e)
|
|
2111
2109
|
raise e
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Iterator
|
|
4
|
+
from typing import Union
|
|
4
5
|
|
|
5
|
-
from chia.types.blockchain_format.program import Program
|
|
6
|
+
from chia.types.blockchain_format.program import INFINITE_COST, Program
|
|
6
7
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
7
8
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
8
9
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
@@ -40,7 +41,7 @@ def create_host_layer_puzzle(innerpuz: Union[Program, bytes32], current_root: by
|
|
|
40
41
|
)
|
|
41
42
|
|
|
42
43
|
|
|
43
|
-
def match_dl_singleton(puzzle: Union[Program, SerializedProgram]) ->
|
|
44
|
+
def match_dl_singleton(puzzle: Union[Program, SerializedProgram]) -> tuple[bool, Iterator[Program]]:
|
|
44
45
|
"""
|
|
45
46
|
Given a puzzle test if it's a CAT and, if it is, return the curried arguments
|
|
46
47
|
"""
|
|
@@ -56,7 +57,7 @@ def match_dl_singleton(puzzle: Union[Program, SerializedProgram]) -> Tuple[bool,
|
|
|
56
57
|
return False, iter(())
|
|
57
58
|
|
|
58
59
|
|
|
59
|
-
def launch_solution_to_singleton_info(launch_solution: Program) ->
|
|
60
|
+
def launch_solution_to_singleton_info(launch_solution: Program) -> tuple[bytes32, uint64, bytes32, bytes32]:
|
|
60
61
|
solution = launch_solution.as_python()
|
|
61
62
|
try:
|
|
62
63
|
full_puzzle_hash = bytes32(solution[0])
|
|
@@ -77,7 +78,7 @@ def launcher_to_struct(launcher_id: bytes32) -> Program:
|
|
|
77
78
|
|
|
78
79
|
|
|
79
80
|
def create_graftroot_offer_puz(
|
|
80
|
-
launcher_ids:
|
|
81
|
+
launcher_ids: list[bytes32], values_to_prove: list[list[bytes32]], inner_puzzle: Program
|
|
81
82
|
) -> Program:
|
|
82
83
|
return GRAFTROOT_DL_OFFERS.curry(
|
|
83
84
|
inner_puzzle,
|
|
@@ -94,14 +95,17 @@ def create_mirror_puzzle() -> Program:
|
|
|
94
95
|
MIRROR_PUZZLE_HASH = create_mirror_puzzle().get_tree_hash()
|
|
95
96
|
|
|
96
97
|
|
|
97
|
-
def get_mirror_info(
|
|
98
|
-
|
|
98
|
+
def get_mirror_info(
|
|
99
|
+
parent_puzzle: Union[Program, SerializedProgram], parent_solution: Union[Program, SerializedProgram]
|
|
100
|
+
) -> tuple[bytes32, list[bytes]]:
|
|
101
|
+
assert type(parent_puzzle) is type(parent_solution)
|
|
102
|
+
_, conditions = parent_puzzle.run_with_cost(INFINITE_COST, parent_solution)
|
|
99
103
|
for condition in conditions.as_iter():
|
|
100
104
|
if (
|
|
101
105
|
condition.first().as_python() == ConditionOpcode.CREATE_COIN
|
|
102
106
|
and condition.at("rf").as_python() == create_mirror_puzzle().get_tree_hash()
|
|
103
107
|
):
|
|
104
|
-
memos:
|
|
108
|
+
memos: list[bytes] = condition.at("rrrf").as_python()
|
|
105
109
|
launcher_id = bytes32(memos[0])
|
|
106
110
|
return launcher_id, [url for url in memos[1:]]
|
|
107
111
|
raise ValueError("The provided puzzle and solution do not create a mirror coin")
|