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
chia/wallet/conditions.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
|
+
from collections.abc import Iterable
|
|
4
5
|
from dataclasses import dataclass, fields, replace
|
|
5
|
-
from typing import Any,
|
|
6
|
+
from typing import Any, ClassVar, Optional, TypeVar, Union, final, get_type_hints
|
|
6
7
|
|
|
7
|
-
from chia_rs import G1Element
|
|
8
|
+
from chia_rs import Coin, G1Element
|
|
8
9
|
from clvm.casts import int_from_bytes, int_to_bytes
|
|
9
10
|
|
|
10
11
|
from chia.types.blockchain_format.program import Program
|
|
@@ -23,7 +24,7 @@ class Condition(Streamable, ABC):
|
|
|
23
24
|
|
|
24
25
|
@classmethod
|
|
25
26
|
@abstractmethod
|
|
26
|
-
def from_program(cls:
|
|
27
|
+
def from_program(cls: type[_T_Condition], program: Program) -> _T_Condition: ...
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
@final
|
|
@@ -226,7 +227,7 @@ class AggSigMe(Condition):
|
|
|
226
227
|
class CreateCoin(Condition):
|
|
227
228
|
puzzle_hash: bytes32
|
|
228
229
|
amount: uint64
|
|
229
|
-
memos: Optional[
|
|
230
|
+
memos: Optional[list[bytes]] = None
|
|
230
231
|
|
|
231
232
|
def to_program(self) -> Program:
|
|
232
233
|
condition_args = [ConditionOpcode.CREATE_COIN, self.puzzle_hash, self.amount]
|
|
@@ -407,45 +408,230 @@ class CreatePuzzleAnnouncement(Condition):
|
|
|
407
408
|
@final
|
|
408
409
|
@streamable
|
|
409
410
|
@dataclass(frozen=True)
|
|
410
|
-
class
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
411
|
+
class MessageParticipant(Streamable):
|
|
412
|
+
mode_integer: Optional[uint8] = None
|
|
413
|
+
parent_id_committed: Optional[bytes32] = None
|
|
414
|
+
puzzle_hash_committed: Optional[bytes32] = None
|
|
415
|
+
amount_committed: Optional[uint64] = None
|
|
416
|
+
coin_id_committed: Optional[bytes32] = None
|
|
414
417
|
|
|
415
|
-
def
|
|
416
|
-
|
|
417
|
-
|
|
418
|
+
def __post_init__(self) -> None:
|
|
419
|
+
if (
|
|
420
|
+
self.parent_id_committed is None
|
|
421
|
+
and self.puzzle_hash_committed is None
|
|
422
|
+
and self.amount_committed is None
|
|
423
|
+
and self.coin_id_committed is None
|
|
424
|
+
and self.mode_integer is None
|
|
425
|
+
):
|
|
426
|
+
raise ValueError("Must specify at least one committment. Anyone-can-send/recieve is not allowed.")
|
|
427
|
+
if self.coin_id_committed is not None:
|
|
428
|
+
if self.parent_id_committed is None or self.puzzle_hash_committed is None or self.amount_committed is None:
|
|
429
|
+
if not (
|
|
430
|
+
self.parent_id_committed is None
|
|
431
|
+
and self.puzzle_hash_committed is None
|
|
432
|
+
and self.amount_committed is None
|
|
433
|
+
):
|
|
434
|
+
raise ValueError(
|
|
435
|
+
"Cannot commit to coin_id and only specify some of the other arguments. "
|
|
436
|
+
"You must specify all or none of them."
|
|
437
|
+
)
|
|
438
|
+
else:
|
|
439
|
+
assert (
|
|
440
|
+
Coin(
|
|
441
|
+
parent_coin_info=self.parent_id_committed,
|
|
442
|
+
puzzle_hash=self.puzzle_hash_committed,
|
|
443
|
+
amount=self.amount_committed,
|
|
444
|
+
).name()
|
|
445
|
+
== self.coin_id_committed
|
|
446
|
+
), "The value for coin_id_committed must be equal to the implied ID of the other three arguments"
|
|
447
|
+
if self.mode_integer is not None:
|
|
448
|
+
assert (
|
|
449
|
+
self.mode == self.mode_integer
|
|
450
|
+
), "If mode_integer is manually specified, you must specify committments that match with the mode"
|
|
451
|
+
|
|
452
|
+
@property
|
|
453
|
+
def _nothing_committed(self) -> bool:
|
|
454
|
+
return (
|
|
455
|
+
self.coin_id_committed is None
|
|
456
|
+
and self.parent_id_committed is None
|
|
457
|
+
and self.puzzle_hash_committed is None
|
|
458
|
+
and self.amount_committed is None
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
@property
|
|
462
|
+
def mode(self) -> uint8:
|
|
463
|
+
if self._nothing_committed:
|
|
464
|
+
# The non-None-ness of this is asserted by __post_init__
|
|
465
|
+
return self.mode_integer # type: ignore[return-value]
|
|
466
|
+
if self.coin_id_committed is not None:
|
|
467
|
+
return uint8(0b111)
|
|
468
|
+
|
|
469
|
+
def convert_noneness_to_bit(maybe_none: Optional[Any]) -> int:
|
|
470
|
+
return 1 if maybe_none is not None else 0
|
|
471
|
+
|
|
472
|
+
return uint8(
|
|
473
|
+
(convert_noneness_to_bit(self.parent_id_committed) << 2)
|
|
474
|
+
| (convert_noneness_to_bit(self.puzzle_hash_committed) << 1)
|
|
475
|
+
| convert_noneness_to_bit(self.amount_committed)
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
@property
|
|
479
|
+
def necessary_args(self) -> list[Program]:
|
|
480
|
+
if self._nothing_committed:
|
|
481
|
+
raise ValueError("Cannot generate necessary_args for a participant without committment information")
|
|
482
|
+
|
|
483
|
+
if self.coin_id_committed:
|
|
484
|
+
return [Program.to(self.coin_id_committed)]
|
|
485
|
+
|
|
486
|
+
condition_args = []
|
|
487
|
+
if self.parent_id_committed is not None:
|
|
488
|
+
condition_args.append(Program.to(self.parent_id_committed))
|
|
489
|
+
if self.puzzle_hash_committed is not None:
|
|
490
|
+
condition_args.append(Program.to(self.puzzle_hash_committed))
|
|
491
|
+
if self.amount_committed is not None:
|
|
492
|
+
condition_args.append(Program.to(self.amount_committed))
|
|
493
|
+
return condition_args
|
|
418
494
|
|
|
419
495
|
@classmethod
|
|
420
|
-
def
|
|
496
|
+
def from_mode_and_maybe_args(
|
|
497
|
+
cls, sender: bool, full_mode: uint8, args: Optional[Iterable[Program]] = None
|
|
498
|
+
) -> MessageParticipant:
|
|
499
|
+
if sender:
|
|
500
|
+
mode = full_mode >> 3
|
|
501
|
+
else:
|
|
502
|
+
mode = full_mode & 0b000111
|
|
503
|
+
|
|
504
|
+
if args is None:
|
|
505
|
+
return cls(mode_integer=uint8(mode))
|
|
506
|
+
|
|
507
|
+
if mode == 0b111:
|
|
508
|
+
return cls(mode_integer=uint8(mode), coin_id_committed=next(bytes32(arg.as_atom()) for arg in args))
|
|
509
|
+
|
|
510
|
+
parent_id_committed: Optional[bytes32] = None
|
|
511
|
+
puzzle_hash_committed: Optional[bytes32] = None
|
|
512
|
+
amount_committed: Optional[uint64] = None
|
|
513
|
+
# This loop probably looks a little strange
|
|
514
|
+
# It's trying to account for the fact that the arguments may be any 1 or 2 of these arguments in this order
|
|
515
|
+
# Not sure of a more elgant way to do it
|
|
516
|
+
original_mode = mode
|
|
517
|
+
for arg in args:
|
|
518
|
+
if mode & 0b100:
|
|
519
|
+
parent_id_committed = bytes32(arg.as_atom())
|
|
520
|
+
mode &= 0b011
|
|
521
|
+
continue
|
|
522
|
+
if mode & 0b010:
|
|
523
|
+
puzzle_hash_committed = bytes32(arg.as_atom())
|
|
524
|
+
mode &= 0b101
|
|
525
|
+
continue
|
|
526
|
+
if mode & 0b001:
|
|
527
|
+
amount_committed = uint64(arg.as_int())
|
|
528
|
+
break
|
|
529
|
+
|
|
421
530
|
return cls(
|
|
422
|
-
uint8(
|
|
423
|
-
|
|
424
|
-
|
|
531
|
+
mode_integer=uint8(original_mode),
|
|
532
|
+
parent_id_committed=parent_id_committed,
|
|
533
|
+
puzzle_hash_committed=puzzle_hash_committed,
|
|
534
|
+
amount_committed=amount_committed,
|
|
425
535
|
)
|
|
426
536
|
|
|
427
537
|
|
|
428
|
-
|
|
538
|
+
_T_MessageCondition = TypeVar("_T_MessageCondition", bound="SendMessage")
|
|
539
|
+
|
|
540
|
+
|
|
429
541
|
@streamable
|
|
430
542
|
@dataclass(frozen=True)
|
|
431
|
-
class
|
|
432
|
-
mode: uint8
|
|
543
|
+
class SendMessage(Condition):
|
|
433
544
|
msg: bytes
|
|
434
|
-
|
|
545
|
+
var_args: Optional[list[Program]] = None
|
|
546
|
+
mode_integer: Optional[uint8] = None
|
|
547
|
+
sender: Optional[MessageParticipant] = None
|
|
548
|
+
receiver: Optional[MessageParticipant] = None
|
|
549
|
+
_other_party_is_receiver: ClassVar[bool] = True
|
|
550
|
+
|
|
551
|
+
@property
|
|
552
|
+
def _other_party(self) -> Optional[MessageParticipant]:
|
|
553
|
+
return self.receiver
|
|
554
|
+
|
|
555
|
+
@property
|
|
556
|
+
def _opcode(self) -> ConditionOpcode:
|
|
557
|
+
return ConditionOpcode.SEND_MESSAGE
|
|
558
|
+
|
|
559
|
+
def __post_init__(self) -> None:
|
|
560
|
+
if self.mode_integer is None and (self.sender is None or self.receiver is None):
|
|
561
|
+
raise ValueError("Must specify either mode_integer or both sender and reciever")
|
|
562
|
+
|
|
563
|
+
if self.mode_integer is not None and self.sender is not None:
|
|
564
|
+
assert (
|
|
565
|
+
self.mode_integer >> 3 == self.sender.mode
|
|
566
|
+
), "The first 3 bits of mode_integer don't match the sender's mode"
|
|
567
|
+
|
|
568
|
+
if self.mode_integer is not None and self.receiver is not None:
|
|
569
|
+
assert (
|
|
570
|
+
self.mode_integer & 0b000111 == self.receiver.mode
|
|
571
|
+
), "The last 3 bits of mode_integer don't match the receiver's mode"
|
|
572
|
+
|
|
573
|
+
if self.var_args is None and self._other_party is None:
|
|
574
|
+
raise ValueError(
|
|
575
|
+
f"Must specify either var_args or {'receiver' if self._other_party_is_receiver else 'sender'}"
|
|
576
|
+
)
|
|
577
|
+
|
|
578
|
+
if self.var_args is not None and self._other_party is not None and not self._other_party._nothing_committed:
|
|
579
|
+
assert (
|
|
580
|
+
self.var_args == self._other_party.necessary_args
|
|
581
|
+
), f"The implied arguments for {self._other_party} do not match the specified arguments {self.var_args}"
|
|
582
|
+
|
|
583
|
+
@property
|
|
584
|
+
def args(self) -> list[Program]:
|
|
585
|
+
if self.var_args is not None:
|
|
586
|
+
return self.var_args
|
|
587
|
+
|
|
588
|
+
# The non-None-ness of this is asserted in __post_init__
|
|
589
|
+
return self._other_party.necessary_args # type: ignore[union-attr]
|
|
590
|
+
|
|
591
|
+
@property
|
|
592
|
+
def mode(self) -> uint8:
|
|
593
|
+
if self.mode_integer is not None:
|
|
594
|
+
return self.mode_integer
|
|
595
|
+
|
|
596
|
+
# The non-None-ness of these are asserted in __post_init__
|
|
597
|
+
return uint8((self.sender.mode << 3) | self.receiver.mode) # type: ignore[union-attr]
|
|
435
598
|
|
|
436
599
|
def to_program(self) -> Program:
|
|
437
|
-
condition: Program = Program.to([
|
|
600
|
+
condition: Program = Program.to([self._opcode, self.mode, self.msg, *self.args])
|
|
438
601
|
return condition
|
|
439
602
|
|
|
440
603
|
@classmethod
|
|
441
|
-
def from_program(cls, program: Program) ->
|
|
604
|
+
def from_program(cls: type[_T_MessageCondition], program: Program) -> _T_MessageCondition:
|
|
605
|
+
full_mode = uint8(program.at("rf").as_int())
|
|
606
|
+
var_args = list(program.at("rrr").as_iter())
|
|
442
607
|
return cls(
|
|
443
|
-
uint8(program.at("rf").as_int()),
|
|
444
608
|
program.at("rrf").as_atom(),
|
|
445
|
-
|
|
609
|
+
var_args,
|
|
610
|
+
full_mode,
|
|
611
|
+
MessageParticipant.from_mode_and_maybe_args(
|
|
612
|
+
True, full_mode, var_args if not cls._other_party_is_receiver else None
|
|
613
|
+
),
|
|
614
|
+
MessageParticipant.from_mode_and_maybe_args(
|
|
615
|
+
False, full_mode, var_args if cls._other_party_is_receiver else None
|
|
616
|
+
),
|
|
446
617
|
)
|
|
447
618
|
|
|
448
619
|
|
|
620
|
+
@final
|
|
621
|
+
@streamable
|
|
622
|
+
@dataclass(frozen=True)
|
|
623
|
+
class ReceiveMessage(SendMessage):
|
|
624
|
+
_other_party_is_receiver: ClassVar[bool] = False
|
|
625
|
+
|
|
626
|
+
@property
|
|
627
|
+
def _other_party(self) -> Optional[MessageParticipant]:
|
|
628
|
+
return self.sender
|
|
629
|
+
|
|
630
|
+
@property
|
|
631
|
+
def _opcode(self) -> ConditionOpcode:
|
|
632
|
+
return ConditionOpcode.RECEIVE_MESSAGE
|
|
633
|
+
|
|
634
|
+
|
|
449
635
|
@final
|
|
450
636
|
@streamable
|
|
451
637
|
@dataclass(frozen=True)
|
|
@@ -736,7 +922,7 @@ class AssertBeforeHeightAbsolute(Condition):
|
|
|
736
922
|
@dataclass(frozen=True)
|
|
737
923
|
class Softfork(Condition):
|
|
738
924
|
cost: uint64
|
|
739
|
-
conditions:
|
|
925
|
+
conditions: list[Program]
|
|
740
926
|
|
|
741
927
|
def to_program(self) -> Program:
|
|
742
928
|
condition: Program = Program.to([ConditionOpcode.SOFTFORK, self.cost, self.conditions])
|
|
@@ -772,7 +958,7 @@ class Remark(Condition):
|
|
|
772
958
|
@dataclass(frozen=True)
|
|
773
959
|
class UnknownCondition(Condition):
|
|
774
960
|
opcode: Program
|
|
775
|
-
args:
|
|
961
|
+
args: list[Program]
|
|
776
962
|
|
|
777
963
|
def to_program(self) -> Program:
|
|
778
964
|
return self.opcode.cons(Program.to(self.args))
|
|
@@ -811,7 +997,7 @@ class AggSig(Condition):
|
|
|
811
997
|
condition_driver.pubkey, # type: ignore[attr-defined]
|
|
812
998
|
condition_driver.msg, # type: ignore[attr-defined]
|
|
813
999
|
opcode,
|
|
814
|
-
**{key: value for key, value in condition_driver.__dict__.items() if key not in
|
|
1000
|
+
**{key: value for key, value in condition_driver.__dict__.items() if key not in {"pubkey", "msg"}},
|
|
815
1001
|
)
|
|
816
1002
|
|
|
817
1003
|
|
|
@@ -923,15 +1109,15 @@ TIMELOCK_TYPES = Union[
|
|
|
923
1109
|
]
|
|
924
1110
|
|
|
925
1111
|
|
|
926
|
-
TIMELOCK_DRIVERS:
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
1112
|
+
TIMELOCK_DRIVERS: tuple[
|
|
1113
|
+
type[TIMELOCK_TYPES],
|
|
1114
|
+
type[TIMELOCK_TYPES],
|
|
1115
|
+
type[TIMELOCK_TYPES],
|
|
1116
|
+
type[TIMELOCK_TYPES],
|
|
1117
|
+
type[TIMELOCK_TYPES],
|
|
1118
|
+
type[TIMELOCK_TYPES],
|
|
1119
|
+
type[TIMELOCK_TYPES],
|
|
1120
|
+
type[TIMELOCK_TYPES],
|
|
935
1121
|
] = (
|
|
936
1122
|
AssertSecondsRelative,
|
|
937
1123
|
AssertHeightRelative,
|
|
@@ -942,46 +1128,46 @@ TIMELOCK_DRIVERS: Tuple[
|
|
|
942
1128
|
AssertBeforeSecondsAbsolute,
|
|
943
1129
|
AssertBeforeHeightAbsolute,
|
|
944
1130
|
)
|
|
945
|
-
SECONDS_TIMELOCK_DRIVERS:
|
|
1131
|
+
SECONDS_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
|
|
946
1132
|
AssertSecondsRelative,
|
|
947
1133
|
AssertSecondsAbsolute,
|
|
948
1134
|
AssertBeforeSecondsRelative,
|
|
949
1135
|
AssertBeforeSecondsAbsolute,
|
|
950
1136
|
}
|
|
951
|
-
HEIGHT_TIMELOCK_DRIVERS:
|
|
1137
|
+
HEIGHT_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
|
|
952
1138
|
AssertHeightRelative,
|
|
953
1139
|
AssertHeightAbsolute,
|
|
954
1140
|
AssertBeforeHeightRelative,
|
|
955
1141
|
AssertBeforeHeightAbsolute,
|
|
956
1142
|
}
|
|
957
|
-
AFTER_TIMELOCK_DRIVERS:
|
|
1143
|
+
AFTER_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
|
|
958
1144
|
AssertSecondsRelative,
|
|
959
1145
|
AssertHeightRelative,
|
|
960
1146
|
AssertSecondsAbsolute,
|
|
961
1147
|
AssertHeightAbsolute,
|
|
962
1148
|
}
|
|
963
|
-
BEFORE_TIMELOCK_DRIVERS:
|
|
1149
|
+
BEFORE_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
|
|
964
1150
|
AssertBeforeSecondsRelative,
|
|
965
1151
|
AssertBeforeHeightRelative,
|
|
966
1152
|
AssertBeforeSecondsAbsolute,
|
|
967
1153
|
AssertBeforeHeightAbsolute,
|
|
968
1154
|
}
|
|
969
|
-
RELATIVE_TIMELOCK_DRIVERS:
|
|
1155
|
+
RELATIVE_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
|
|
970
1156
|
AssertSecondsRelative,
|
|
971
1157
|
AssertHeightRelative,
|
|
972
1158
|
AssertBeforeSecondsRelative,
|
|
973
1159
|
AssertBeforeHeightRelative,
|
|
974
1160
|
}
|
|
975
|
-
ABSOLUTE_TIMELOCK_DRIVERS:
|
|
1161
|
+
ABSOLUTE_TIMELOCK_DRIVERS: set[type[TIMELOCK_TYPES]] = {
|
|
976
1162
|
AssertSecondsAbsolute,
|
|
977
1163
|
AssertHeightAbsolute,
|
|
978
1164
|
AssertBeforeSecondsAbsolute,
|
|
979
1165
|
AssertBeforeHeightAbsolute,
|
|
980
1166
|
}
|
|
981
|
-
TIMELOCK_DRIVERS_SET:
|
|
1167
|
+
TIMELOCK_DRIVERS_SET: set[type[TIMELOCK_TYPES]] = set(TIMELOCK_DRIVERS)
|
|
982
1168
|
|
|
983
1169
|
|
|
984
|
-
TIMELOCK_OPCODES:
|
|
1170
|
+
TIMELOCK_OPCODES: set[bytes] = {
|
|
985
1171
|
ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
|
|
986
1172
|
ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
|
|
987
1173
|
ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
|
|
@@ -991,37 +1177,37 @@ TIMELOCK_OPCODES: Set[bytes] = {
|
|
|
991
1177
|
ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
|
|
992
1178
|
ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
|
|
993
1179
|
}
|
|
994
|
-
SECONDS_TIMELOCK_OPCODES:
|
|
1180
|
+
SECONDS_TIMELOCK_OPCODES: set[bytes] = {
|
|
995
1181
|
ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
|
|
996
1182
|
ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
|
|
997
1183
|
ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
|
|
998
1184
|
ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
|
|
999
1185
|
}
|
|
1000
|
-
HEIGHT_TIMELOCK_OPCODES:
|
|
1186
|
+
HEIGHT_TIMELOCK_OPCODES: set[bytes] = {
|
|
1001
1187
|
ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
|
|
1002
1188
|
ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
|
|
1003
1189
|
ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
|
|
1004
1190
|
ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
|
|
1005
1191
|
}
|
|
1006
|
-
AFTER_TIMELOCK_OPCODES:
|
|
1192
|
+
AFTER_TIMELOCK_OPCODES: set[bytes] = {
|
|
1007
1193
|
ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
|
|
1008
1194
|
ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
|
|
1009
1195
|
ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
|
|
1010
1196
|
ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
|
|
1011
1197
|
}
|
|
1012
|
-
BEFORE_TIMELOCK_OPCODES:
|
|
1198
|
+
BEFORE_TIMELOCK_OPCODES: set[bytes] = {
|
|
1013
1199
|
ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
|
|
1014
1200
|
ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
|
|
1015
1201
|
ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
|
|
1016
1202
|
ConditionOpcode.ASSERT_BEFORE_HEIGHT_ABSOLUTE.value,
|
|
1017
1203
|
}
|
|
1018
|
-
RELATIVE_TIMELOCK_OPCODES:
|
|
1204
|
+
RELATIVE_TIMELOCK_OPCODES: set[bytes] = {
|
|
1019
1205
|
ConditionOpcode.ASSERT_SECONDS_RELATIVE.value,
|
|
1020
1206
|
ConditionOpcode.ASSERT_HEIGHT_RELATIVE.value,
|
|
1021
1207
|
ConditionOpcode.ASSERT_BEFORE_SECONDS_RELATIVE.value,
|
|
1022
1208
|
ConditionOpcode.ASSERT_BEFORE_HEIGHT_RELATIVE.value,
|
|
1023
1209
|
}
|
|
1024
|
-
ABSOLUTE_TIMELOCK_OPCODES:
|
|
1210
|
+
ABSOLUTE_TIMELOCK_OPCODES: set[bytes] = {
|
|
1025
1211
|
ConditionOpcode.ASSERT_SECONDS_ABSOLUTE.value,
|
|
1026
1212
|
ConditionOpcode.ASSERT_HEIGHT_ABSOLUTE.value,
|
|
1027
1213
|
ConditionOpcode.ASSERT_BEFORE_SECONDS_ABSOLUTE.value,
|
|
@@ -1054,7 +1240,7 @@ class Timelock(Condition):
|
|
|
1054
1240
|
else:
|
|
1055
1241
|
potential_drivers -= SECONDS_TIMELOCK_DRIVERS
|
|
1056
1242
|
|
|
1057
|
-
driver:
|
|
1243
|
+
driver: type[TIMELOCK_TYPES] = next(iter(potential_drivers))
|
|
1058
1244
|
|
|
1059
1245
|
if self.seconds_not_height:
|
|
1060
1246
|
# Semantics here mean that we're assuredly passing a uint64 to a class that expects it
|
|
@@ -1089,7 +1275,7 @@ class Timelock(Condition):
|
|
|
1089
1275
|
)
|
|
1090
1276
|
|
|
1091
1277
|
|
|
1092
|
-
CONDITION_DRIVERS:
|
|
1278
|
+
CONDITION_DRIVERS: dict[bytes, type[Condition]] = {
|
|
1093
1279
|
ConditionOpcode.AGG_SIG_PARENT.value: AggSigParent,
|
|
1094
1280
|
ConditionOpcode.AGG_SIG_PUZZLE.value: AggSigPuzzle,
|
|
1095
1281
|
ConditionOpcode.AGG_SIG_AMOUNT.value: AggSigAmount,
|
|
@@ -1126,10 +1312,10 @@ CONDITION_DRIVERS: Dict[bytes, Type[Condition]] = {
|
|
|
1126
1312
|
ConditionOpcode.SOFTFORK.value: Softfork,
|
|
1127
1313
|
ConditionOpcode.REMARK.value: Remark,
|
|
1128
1314
|
}
|
|
1129
|
-
DRIVERS_TO_OPCODES:
|
|
1315
|
+
DRIVERS_TO_OPCODES: dict[type[Condition], bytes] = {v: k for k, v in CONDITION_DRIVERS.items()}
|
|
1130
1316
|
|
|
1131
1317
|
|
|
1132
|
-
CONDITION_DRIVERS_W_ABSTRACTIONS:
|
|
1318
|
+
CONDITION_DRIVERS_W_ABSTRACTIONS: dict[bytes, type[Condition]] = {
|
|
1133
1319
|
ConditionOpcode.AGG_SIG_PARENT.value: AggSig,
|
|
1134
1320
|
ConditionOpcode.AGG_SIG_PUZZLE.value: AggSig,
|
|
1135
1321
|
ConditionOpcode.AGG_SIG_AMOUNT.value: AggSig,
|
|
@@ -1171,11 +1357,11 @@ CONDITION_DRIVERS_W_ABSTRACTIONS: Dict[bytes, Type[Condition]] = {
|
|
|
1171
1357
|
def parse_conditions_non_consensus(
|
|
1172
1358
|
conditions: Iterable[Program],
|
|
1173
1359
|
abstractions: bool = True, # Use abstractions like *Announcement or Timelock instead of specific condition class
|
|
1174
|
-
) ->
|
|
1175
|
-
driver_dictionary:
|
|
1360
|
+
) -> list[Condition]:
|
|
1361
|
+
driver_dictionary: dict[bytes, type[Condition]] = (
|
|
1176
1362
|
CONDITION_DRIVERS_W_ABSTRACTIONS if abstractions else CONDITION_DRIVERS
|
|
1177
1363
|
)
|
|
1178
|
-
final_condition_list:
|
|
1364
|
+
final_condition_list: list[Condition] = []
|
|
1179
1365
|
for condition in conditions:
|
|
1180
1366
|
try:
|
|
1181
1367
|
final_condition_list.append(driver_dictionary[condition.at("f").as_atom()].from_program(condition))
|
|
@@ -1185,8 +1371,8 @@ def parse_conditions_non_consensus(
|
|
|
1185
1371
|
return final_condition_list
|
|
1186
1372
|
|
|
1187
1373
|
|
|
1188
|
-
def conditions_from_json_dicts(conditions: Iterable[
|
|
1189
|
-
final_condition_list:
|
|
1374
|
+
def conditions_from_json_dicts(conditions: Iterable[dict[str, Any]]) -> list[Condition]:
|
|
1375
|
+
final_condition_list: list[Condition] = []
|
|
1190
1376
|
for condition in conditions:
|
|
1191
1377
|
opcode_specified: Union[str, int] = condition["opcode"]
|
|
1192
1378
|
if isinstance(opcode_specified, str):
|
|
@@ -1209,7 +1395,7 @@ def conditions_from_json_dicts(conditions: Iterable[Dict[str, Any]]) -> List[Con
|
|
|
1209
1395
|
return final_condition_list
|
|
1210
1396
|
|
|
1211
1397
|
|
|
1212
|
-
def conditions_to_json_dicts(conditions: Iterable[Condition]) ->
|
|
1398
|
+
def conditions_to_json_dicts(conditions: Iterable[Condition]) -> list[dict[str, Any]]:
|
|
1213
1399
|
return [
|
|
1214
1400
|
{
|
|
1215
1401
|
"opcode": int_from_bytes(DRIVERS_TO_OPCODES[condition.__class__]),
|
|
@@ -1231,8 +1417,8 @@ class ConditionValidTimes(Streamable):
|
|
|
1231
1417
|
max_blocks_after_created: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_RELATIVE
|
|
1232
1418
|
max_height: Optional[uint32] = None # ASSERT_BEFORE_HEIGHT_ABSOLUTE
|
|
1233
1419
|
|
|
1234
|
-
def to_conditions(self) ->
|
|
1235
|
-
final_condition_list:
|
|
1420
|
+
def to_conditions(self) -> list[Condition]:
|
|
1421
|
+
final_condition_list: list[Condition] = []
|
|
1236
1422
|
if self.min_secs_since_created is not None:
|
|
1237
1423
|
final_condition_list.append(AssertSecondsRelative(self.min_secs_since_created))
|
|
1238
1424
|
if self.min_time is not None:
|
|
@@ -1254,7 +1440,7 @@ class ConditionValidTimes(Streamable):
|
|
|
1254
1440
|
|
|
1255
1441
|
|
|
1256
1442
|
condition_valid_times_hints = get_type_hints(ConditionValidTimes)
|
|
1257
|
-
condition_valid_times_types:
|
|
1443
|
+
condition_valid_times_types: dict[str, type[int]] = {}
|
|
1258
1444
|
for field in fields(ConditionValidTimes):
|
|
1259
1445
|
hint = condition_valid_times_hints[field.name]
|
|
1260
1446
|
[type_] = [type_ for type_ in hint.__args__ if type_ is not type(None)]
|
|
@@ -1262,23 +1448,23 @@ for field in fields(ConditionValidTimes):
|
|
|
1262
1448
|
|
|
1263
1449
|
|
|
1264
1450
|
# Properties of the dataclass above, grouped by their property
|
|
1265
|
-
SECONDS_PROPERTIES:
|
|
1266
|
-
HEIGHT_PROPERTIES:
|
|
1267
|
-
AFTER_PROPERTIES:
|
|
1268
|
-
BEFORE_PROPERTIES:
|
|
1269
|
-
RELATIVE_PROPERTIES:
|
|
1451
|
+
SECONDS_PROPERTIES: set[str] = {"min_secs_since_created", "min_time", "max_secs_after_created", "max_time"}
|
|
1452
|
+
HEIGHT_PROPERTIES: set[str] = {"min_blocks_since_created", "min_height", "max_blocks_after_created", "max_height"}
|
|
1453
|
+
AFTER_PROPERTIES: set[str] = {"min_blocks_since_created", "min_height", "min_secs_since_created", "min_time"}
|
|
1454
|
+
BEFORE_PROPERTIES: set[str] = {"max_blocks_after_created", "max_height", "max_secs_after_created", "max_time"}
|
|
1455
|
+
RELATIVE_PROPERTIES: set[str] = {
|
|
1270
1456
|
"min_blocks_since_created",
|
|
1271
1457
|
"min_secs_since_created",
|
|
1272
1458
|
"max_secs_after_created",
|
|
1273
1459
|
"max_blocks_after_created",
|
|
1274
1460
|
}
|
|
1275
|
-
ABSOLUTE_PROPERTIES:
|
|
1276
|
-
ALL_PROPERTIES:
|
|
1461
|
+
ABSOLUTE_PROPERTIES: set[str] = {"min_time", "max_time", "min_height", "max_height"}
|
|
1462
|
+
ALL_PROPERTIES: set[str] = SECONDS_PROPERTIES | HEIGHT_PROPERTIES
|
|
1277
1463
|
|
|
1278
1464
|
|
|
1279
1465
|
def parse_timelock_info(conditions: Iterable[Condition]) -> ConditionValidTimes:
|
|
1280
1466
|
valid_times: ConditionValidTimes = ConditionValidTimes()
|
|
1281
|
-
properties:
|
|
1467
|
+
properties: set[str] = ALL_PROPERTIES.copy()
|
|
1282
1468
|
for condition in conditions:
|
|
1283
1469
|
if isinstance(condition, TIMELOCK_DRIVERS):
|
|
1284
1470
|
timelock: Timelock = Timelock.from_program(condition.to_program())
|
|
@@ -1319,7 +1505,7 @@ def parse_timelock_info(conditions: Iterable[Condition]) -> ConditionValidTimes:
|
|
|
1319
1505
|
new_value = timelock.timestamp
|
|
1320
1506
|
|
|
1321
1507
|
final_type = condition_valid_times_types[final_property]
|
|
1322
|
-
replacement:
|
|
1508
|
+
replacement: dict[str, int] = {final_property: final_type(new_value)}
|
|
1323
1509
|
# the type is enforced above
|
|
1324
1510
|
valid_times = replace(valid_times, **replacement) # type: ignore[arg-type]
|
|
1325
1511
|
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from enum import Enum
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
7
|
from chia.types.blockchain_format.coin import Coin
|
|
8
8
|
from chia.types.blockchain_format.program import Program
|
|
@@ -33,13 +33,13 @@ class DAOInfo(Streamable):
|
|
|
33
33
|
treasury_id: bytes32
|
|
34
34
|
cat_wallet_id: uint32
|
|
35
35
|
dao_cat_wallet_id: uint32
|
|
36
|
-
proposals_list:
|
|
37
|
-
parent_info:
|
|
36
|
+
proposals_list: list[ProposalInfo]
|
|
37
|
+
parent_info: list[tuple[bytes32, Optional[LineageProof]]] # {coin.name(): LineageProof}
|
|
38
38
|
current_treasury_coin: Optional[Coin]
|
|
39
39
|
current_treasury_innerpuz: Optional[Program]
|
|
40
40
|
singleton_block_height: uint32 # the block height that the current treasury singleton was created in
|
|
41
41
|
filter_below_vote_amount: uint64 # we ignore proposals with fewer votes than this - defaults to 1
|
|
42
|
-
assets:
|
|
42
|
+
assets: list[Optional[bytes32]]
|
|
43
43
|
current_height: uint64
|
|
44
44
|
|
|
45
45
|
|