chia-blockchain 2.5.2rc2__py3-none-any.whl → 2.5.3rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +7 -0
- chia/_tests/blockchain/blockchain_test_utils.py +1 -1
- chia/_tests/blockchain/test_augmented_chain.py +54 -5
- chia/_tests/blockchain/test_blockchain.py +5 -12
- chia/_tests/blockchain/test_blockchain_transactions.py +3 -5
- chia/_tests/blockchain/test_get_block_generator.py +2 -2
- chia/_tests/blockchain/test_lookup_fork_chain.py +2 -2
- chia/_tests/clvm/benchmark_costs.py +2 -1
- chia/_tests/clvm/coin_store.py +4 -3
- chia/_tests/clvm/test_chialisp_deserialization.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +1 -1
- chia/_tests/clvm/test_puzzle_compression.py +2 -2
- chia/_tests/clvm/test_puzzles.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -2
- chia/_tests/clvm/test_spend_sim.py +1 -1
- chia/_tests/cmds/cmd_test_utils.py +2 -2
- chia/_tests/cmds/test_click_types.py +2 -2
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_show.py +4 -3
- chia/_tests/cmds/test_tx_config_args.py +1 -1
- chia/_tests/cmds/testing_classes.py +2 -2
- chia/_tests/cmds/wallet/test_consts.py +2 -2
- chia/_tests/cmds/wallet/test_did.py +2 -2
- chia/_tests/cmds/wallet/test_nft.py +2 -2
- chia/_tests/cmds/wallet/test_notifications.py +3 -2
- chia/_tests/cmds/wallet/test_vcs.py +2 -2
- chia/_tests/cmds/wallet/test_wallet.py +4 -8
- chia/_tests/conftest.py +4 -3
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_keys.py +1 -2
- chia/_tests/core/cmds/test_wallet.py +2 -2
- chia/_tests/core/consensus/test_block_creation.py +2 -2
- chia/_tests/core/consensus/test_pot_iterations.py +1 -1
- chia/_tests/core/custom_types/test_coin.py +2 -2
- chia/_tests/core/custom_types/test_proof_of_space.py +2 -2
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -2
- chia/_tests/core/data_layer/conftest.py +1 -1
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +2 -2
- chia/_tests/core/data_layer/test_data_store.py +1 -1
- chia/_tests/core/data_layer/test_data_store_schema.py +1 -1
- chia/_tests/core/data_layer/util.py +2 -1
- chia/_tests/core/farmer/test_farmer_api.py +1 -1
- chia/_tests/core/full_node/full_sync/test_full_sync.py +1 -7
- chia/_tests/core/full_node/ram_db.py +2 -1
- chia/_tests/core/full_node/stores/test_block_store.py +2 -2
- chia/_tests/core/full_node/stores/test_coin_store.py +2 -2
- chia/_tests/core/full_node/stores/test_full_node_store.py +3 -3
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/stores/test_sync_store.py +1 -1
- chia/_tests/core/full_node/test_address_manager.py +1 -1
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +1 -1
- chia/_tests/core/full_node/test_full_node.py +346 -164
- chia/_tests/core/full_node/test_generator_tools.py +3 -2
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -15
- chia/_tests/core/full_node/test_subscriptions.py +1 -1
- chia/_tests/core/full_node/test_transactions.py +186 -185
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -1
- chia/_tests/core/make_block_generator.py +2 -2
- chia/_tests/core/mempool/test_mempool.py +165 -22
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +1 -1
- chia/_tests/core/mempool/test_mempool_manager.py +476 -66
- chia/_tests/core/mempool/test_mempool_performance.py +2 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +19 -25
- chia/_tests/core/node_height.py +2 -1
- chia/_tests/core/server/test_capabilities.py +1 -1
- chia/_tests/core/server/test_dos.py +36 -28
- chia/_tests/core/server/test_loop.py +3 -3
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +2 -2
- chia/_tests/core/services/test_services.py +1 -1
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_coins.py +2 -1
- chia/_tests/core/test_cost_calculation.py +2 -2
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +2 -2
- chia/_tests/core/test_db_validation.py +26 -13
- chia/_tests/core/test_farmer_harvester_rpc.py +2 -2
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +2 -2
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/test_rpc_util.py +1 -1
- chia/_tests/core/test_seeder.py +1 -1
- chia/_tests/core/util/test_block_cache.py +3 -3
- chia/_tests/core/util/test_jsonify.py +3 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_streamable.py +3 -4
- chia/_tests/environments/wallet.py +3 -2
- chia/_tests/farmer_harvester/test_farmer.py +3 -4
- chia/_tests/farmer_harvester/test_farmer_harvester.py +2 -2
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +2 -2
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +3 -4
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -1
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +2 -2
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +3 -4
- chia/_tests/generator/test_compression.py +20 -10
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -2
- chia/_tests/plot_sync/test_plot_sync.py +2 -2
- chia/_tests/plot_sync/test_receiver.py +2 -2
- chia/_tests/plot_sync/test_sender.py +2 -2
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +3 -2
- chia/_tests/plotting/test_plot_manager.py +1 -1
- chia/_tests/pools/test_pool_cli_parsing.py +3 -2
- chia/_tests/pools/test_pool_cmdline.py +2 -2
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +3 -3
- chia/_tests/pools/test_pool_rpc.py +4 -5
- chia/_tests/pools/test_pool_wallet.py +1 -1
- chia/_tests/pools/test_wallet_pool_store.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/rpc/test_rpc_server.py +1 -1
- chia/_tests/simulation/test_simulation.py +36 -8
- chia/_tests/simulation/test_simulator.py +5 -5
- chia/_tests/simulation/test_start_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +2 -2
- chia/_tests/tools/test_run_block.py +3 -2
- chia/_tests/util/benchmark_cost.py +2 -2
- chia/_tests/util/benchmarks.py +17 -6
- chia/_tests/util/blockchain.py +2 -1
- chia/_tests/util/blockchain_mock.py +9 -5
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/constants.py +2 -1
- chia/_tests/util/full_sync.py +6 -3
- chia/_tests/util/gen_ssl_certs.py +2 -2
- chia/_tests/util/generator_tools_testing.py +4 -3
- chia/_tests/util/get_name_puzzle_conditions.py +2 -2
- chia/_tests/util/misc.py +16 -2
- chia/_tests/util/network_protocol_data.py +17 -7
- chia/_tests/util/run_block.py +6 -8
- chia/_tests/util/setup_nodes.py +4 -3
- chia/_tests/util/spend_sim.py +9 -5
- chia/_tests/util/test_condition_tools.py +2 -2
- chia/_tests/util/test_config.py +2 -1
- chia/_tests/util/test_errors.py +2 -1
- chia/_tests/util/test_full_block_utils.py +17 -7
- chia/_tests/util/test_misc.py +1 -1
- chia/_tests/util/test_network_protocol_test.py +24 -24
- chia/_tests/util/test_replace_str_to_bytes.py +2 -2
- chia/_tests/util/test_trusted_peer.py +1 -1
- chia/_tests/util/time_out_assert.py +20 -7
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +5 -6
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +17 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +2 -2
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -2
- chia/_tests/wallet/clawback/test_clawback_metadata.py +2 -2
- chia/_tests/wallet/conftest.py +3 -3
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +3 -5
- chia/_tests/wallet/db_wallet/test_dl_offers.py +2 -2
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +433 -384
- chia/_tests/wallet/did_wallet/test_did.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +2 -2
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +2 -2
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +3 -4
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +1293 -703
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +28 -30
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +2 -2
- chia/_tests/wallet/rpc/config.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +2 -2
- chia/_tests/wallet/rpc/test_wallet_rpc.py +20 -77
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +9 -7
- chia/_tests/wallet/sync/test_wallet_sync.py +79 -31
- chia/_tests/wallet/test_clvm_streamable.py +2 -2
- chia/_tests/wallet/test_coin_management.py +7 -7
- chia/_tests/wallet/test_coin_selection.py +20 -2
- chia/_tests/wallet/test_conditions.py +2 -2
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +2 -2
- chia/_tests/wallet/test_nft_store.py +2 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_puzzle_store.py +2 -2
- chia/_tests/wallet/test_sign_coin_spends.py +2 -2
- chia/_tests/wallet/test_signer_protocol.py +3 -3
- chia/_tests/wallet/test_singleton.py +3 -11
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +12 -13
- chia/_tests/wallet/test_singleton_store.py +2 -4
- chia/_tests/wallet/test_transaction_store.py +2 -2
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +53 -49
- chia/_tests/wallet/test_wallet_action_scope.py +24 -6
- chia/_tests/wallet/test_wallet_blockchain.py +1 -1
- chia/_tests/wallet/test_wallet_coin_store.py +2 -2
- chia/_tests/wallet/test_wallet_interested_store.py +2 -2
- chia/_tests/wallet/test_wallet_node.py +3 -3
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +8 -8
- chia/_tests/wallet/test_wallet_test_framework.py +1 -1
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +2 -2
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -2
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +15 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +5 -3
- chia/_tests/wallet/wallet_block_tools.py +15 -7
- chia/_tests/weight_proof/test_weight_proof.py +3 -3
- chia/cmds/chia.py +0 -2
- chia/cmds/cmd_classes.py +3 -3
- chia/cmds/cmd_helpers.py +4 -4
- chia/cmds/cmds_util.py +2 -2
- chia/cmds/coin_funcs.py +3 -2
- chia/cmds/coins.py +1 -1
- chia/cmds/data.py +2 -2
- chia/cmds/data_funcs.py +3 -2
- chia/cmds/db_upgrade_func.py +2 -2
- chia/cmds/db_validate_func.py +15 -8
- chia/cmds/farm.py +2 -4
- chia/cmds/keys.py +0 -2
- chia/cmds/keys_funcs.py +1 -1
- chia/cmds/netspace_funcs.py +2 -1
- chia/cmds/param_types.py +2 -2
- chia/cmds/plotnft.py +2 -2
- chia/cmds/plotnft_funcs.py +2 -2
- chia/cmds/rpc.py +1 -1
- chia/cmds/show.py +1 -2
- chia/cmds/show_funcs.py +6 -3
- chia/cmds/signer.py +1 -2
- chia/cmds/sim.py +1 -2
- chia/cmds/sim_funcs.py +2 -2
- chia/cmds/wallet.py +2 -2
- chia/cmds/wallet_funcs.py +4 -11
- chia/consensus/block_body_validation.py +3 -4
- chia/consensus/block_creation.py +10 -6
- chia/consensus/block_header_validation.py +3 -4
- chia/consensus/block_record.py +2 -3
- chia/consensus/block_rewards.py +1 -1
- chia/consensus/blockchain.py +20 -17
- chia/consensus/blockchain_interface.py +5 -4
- chia/consensus/coinbase.py +2 -2
- chia/consensus/constants.py +1 -1
- chia/consensus/cost_calculator.py +2 -1
- chia/consensus/default_constants.py +4 -3
- chia/consensus/deficit.py +3 -2
- chia/consensus/difficulty_adjustment.py +8 -9
- chia/consensus/find_fork_point.py +4 -3
- chia/consensus/full_block_to_block_record.py +4 -3
- chia/consensus/get_block_challenge.py +4 -3
- chia/consensus/get_block_generator.py +3 -2
- chia/consensus/make_sub_epoch_summary.py +3 -2
- chia/consensus/multiprocess_validation.py +9 -4
- chia/consensus/pos_quality.py +1 -1
- chia/consensus/pot_iterations.py +4 -3
- chia/consensus/vdf_info_computation.py +4 -3
- chia/daemon/client.py +1 -1
- chia/daemon/keychain_server.py +1 -1
- chia/daemon/server.py +1 -1
- chia/daemon/windows_signal.py +1 -1
- chia/data_layer/data_layer.py +4 -3
- chia/data_layer/data_layer_errors.py +1 -1
- chia/data_layer/data_layer_util.py +2 -2
- chia/data_layer/data_layer_wallet.py +47 -69
- chia/data_layer/data_store.py +1 -1
- chia/data_layer/dl_wallet_store.py +5 -6
- chia/data_layer/download_data.py +1 -1
- chia/data_layer/s3_plugin_service.py +4 -4
- chia/data_layer/singleton_record.py +23 -0
- chia/data_layer/util/benchmark.py +2 -1
- chia/farmer/farmer.py +4 -6
- chia/farmer/farmer_api.py +4 -6
- chia/full_node/bitcoin_fee_estimator.py +2 -1
- chia/full_node/block_height_map.py +2 -2
- chia/full_node/block_store.py +8 -9
- chia/{util → full_node}/check_fork_next_block.py +2 -1
- chia/full_node/coin_store.py +10 -10
- chia/full_node/fee_estimate.py +2 -1
- chia/full_node/fee_estimation.py +2 -1
- chia/full_node/fee_estimator.py +2 -1
- chia/full_node/fee_estimator_interface.py +1 -1
- chia/full_node/fee_history.py +2 -1
- chia/full_node/fee_tracker.py +2 -1
- chia/full_node/full_node.py +15 -13
- chia/full_node/full_node_api.py +12 -32
- chia/full_node/full_node_store.py +4 -3
- chia/full_node/hint_management.py +2 -1
- chia/full_node/hint_store.py +3 -3
- chia/full_node/mempool.py +80 -12
- chia/full_node/mempool_check_conditions.py +6 -7
- chia/full_node/mempool_manager.py +168 -21
- chia/full_node/pending_tx_cache.py +2 -2
- chia/full_node/subscriptions.py +2 -2
- chia/full_node/sync_store.py +2 -3
- chia/full_node/tx_processing_queue.py +2 -1
- chia/full_node/weight_proof.py +5 -8
- chia/harvester/harvester.py +5 -3
- chia/harvester/harvester_api.py +2 -2
- chia/introducer/introducer.py +30 -2
- chia/introducer/introducer_api.py +9 -1
- chia/legacy/keyring.py +1 -2
- chia/plot_sync/exceptions.py +2 -1
- chia/plot_sync/receiver.py +2 -2
- chia/plot_sync/sender.py +1 -1
- chia/plotting/cache.py +2 -2
- chia/plotting/check_plots.py +4 -2
- chia/plotting/create_plots.py +1 -1
- chia/plotting/manager.py +3 -3
- chia/plotting/util.py +2 -2
- chia/pools/pool_config.py +1 -1
- chia/pools/pool_puzzles.py +23 -17
- chia/pools/pool_wallet.py +22 -9
- chia/pools/pool_wallet_info.py +2 -2
- chia/protocols/farmer_protocol.py +3 -6
- chia/protocols/full_node_protocol.py +3 -2
- chia/protocols/harvester_protocol.py +3 -4
- chia/protocols/pool_protocol.py +2 -2
- chia/protocols/shared_protocol.py +2 -1
- chia/protocols/timelord_protocol.py +4 -4
- chia/protocols/wallet_protocol.py +2 -2
- chia/rpc/data_layer_rpc_api.py +3 -4
- chia/rpc/data_layer_rpc_client.py +3 -2
- chia/rpc/farmer_rpc_api.py +2 -2
- chia/rpc/farmer_rpc_client.py +2 -1
- chia/rpc/full_node_rpc_api.py +3 -2
- chia/rpc/full_node_rpc_client.py +3 -2
- chia/rpc/harvester_rpc_api.py +2 -1
- chia/rpc/rpc_client.py +2 -2
- chia/rpc/rpc_server.py +1 -1
- chia/rpc/wallet_request_types.py +2 -62
- chia/rpc/wallet_rpc_api.py +98 -628
- chia/rpc/wallet_rpc_client.py +5 -253
- chia/seeder/crawl_store.py +1 -1
- chia/seeder/crawler.py +2 -2
- chia/seeder/peer_record.py +2 -1
- chia/seeder/start_crawler.py +3 -1
- chia/server/address_manager.py +2 -1
- chia/server/address_manager_store.py +1 -1
- chia/server/capabilities.py +2 -1
- chia/server/introducer_peers.py +2 -1
- chia/server/node_discovery.py +1 -1
- chia/server/outbound_message.py +2 -1
- chia/server/server.py +2 -2
- chia/server/start_data_layer.py +2 -1
- chia/server/start_farmer.py +3 -1
- chia/server/start_full_node.py +4 -2
- chia/server/start_harvester.py +3 -1
- chia/server/start_introducer.py +12 -1
- chia/server/start_service.py +2 -1
- chia/server/start_timelord.py +3 -1
- chia/server/start_wallet.py +3 -1
- chia/server/upnp.py +1 -2
- chia/server/ws_connection.py +3 -4
- chia/simulator/add_blocks_in_batches.py +5 -3
- chia/simulator/block_tools.py +16 -12
- chia/simulator/full_node_simulator.py +9 -14
- chia/simulator/setup_services.py +5 -3
- chia/simulator/simulator_full_node_rpc_api.py +3 -2
- chia/simulator/simulator_full_node_rpc_client.py +3 -2
- chia/simulator/simulator_protocol.py +3 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +3 -2
- chia/simulator/wallet_tools.py +3 -4
- chia/timelord/iters_from_block.py +4 -4
- chia/timelord/timelord.py +7 -12
- chia/timelord/timelord_api.py +3 -3
- chia/timelord/timelord_state.py +4 -3
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +2 -2
- chia/types/blockchain_format/program.py +1 -1
- chia/types/blockchain_format/proof_of_space.py +3 -4
- chia/types/blockchain_format/tree_hash.py +1 -1
- chia/types/blockchain_format/vdf.py +3 -4
- chia/types/clvm_cost.py +1 -1
- chia/types/coin_record.py +4 -3
- chia/types/coin_spend.py +1 -1
- chia/types/eligible_coin_spends.py +9 -5
- chia/types/fee_rate.py +1 -1
- chia/types/generator_types.py +3 -3
- chia/types/internal_mempool_item.py +3 -2
- chia/types/mempool_item.py +10 -3
- chia/types/mempool_submission_status.py +2 -1
- chia/types/mojos.py +1 -1
- chia/types/peer_info.py +2 -1
- chia/types/transaction_queue_entry.py +2 -1
- chia/types/unfinished_header_block.py +4 -4
- chia/types/validation_state.py +2 -1
- chia/types/weight_proof.py +1 -9
- chia/util/augmented_chain.py +20 -9
- chia/util/block_cache.py +8 -4
- chia/util/condition_tools.py +2 -2
- chia/util/full_block_utils.py +3 -4
- chia/util/generator_tools.py +2 -2
- chia/util/initial-config.yaml +2 -11
- chia/util/network.py +2 -2
- chia/util/prev_transaction_block.py +2 -1
- chia/util/task_timing.py +1 -1
- chia/util/vdf_prover.py +3 -3
- chia/util/ws_message.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +3 -2
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -2
- chia/wallet/cat_wallet/cat_utils.py +6 -4
- chia/wallet/cat_wallet/cat_wallet.py +16 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -1
- chia/wallet/coin_selection.py +5 -5
- chia/wallet/conditions.py +22 -16
- chia/wallet/db_wallet/db_wallet_puzzles.py +15 -15
- chia/wallet/derivation_record.py +2 -2
- chia/wallet/derive_keys.py +2 -2
- chia/wallet/did_wallet/did_info.py +3 -2
- chia/wallet/did_wallet/did_wallet.py +41 -19
- chia/wallet/did_wallet/did_wallet_puzzles.py +18 -12
- chia/wallet/driver_protocol.py +1 -1
- chia/wallet/lineage_proof.py +3 -2
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +6 -7
- chia/wallet/nft_wallet/nft_info.py +5 -5
- chia/wallet/nft_wallet/nft_puzzle_utils.py +293 -0
- chia/wallet/nft_wallet/nft_puzzles.py +21 -298
- chia/wallet/nft_wallet/nft_wallet.py +47 -62
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +4 -8
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +3 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +6 -10
- chia/wallet/nft_wallet/uncurry_nft.py +6 -8
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +3 -2
- chia/wallet/outer_puzzles.py +2 -1
- chia/wallet/puzzles/clawback/drivers.py +21 -8
- chia/wallet/puzzles/clawback/metadata.py +3 -2
- chia/wallet/puzzles/clawback/puzzle_decorator.py +5 -4
- chia/wallet/puzzles/deployed_puzzle_hashes.json +0 -10
- chia/wallet/puzzles/p2_conditions.py +3 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +3 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +3 -2
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -3
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +3 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +4 -3
- chia/wallet/puzzles/puzzle_utils.py +3 -2
- chia/wallet/puzzles/singleton_top_layer.py +26 -10
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +21 -9
- chia/wallet/puzzles/tails.py +21 -129
- chia/wallet/signer_protocol.py +3 -2
- chia/wallet/singleton.py +12 -6
- chia/wallet/singleton_record.py +3 -2
- chia/wallet/trade_manager.py +31 -55
- chia/wallet/trade_record.py +3 -2
- chia/wallet/trading/offer.py +14 -13
- chia/wallet/trading/trade_store.py +3 -4
- chia/wallet/transaction_record.py +2 -2
- chia/wallet/util/blind_signer_tl.py +3 -2
- chia/wallet/util/compute_hints.py +3 -2
- chia/wallet/util/compute_memos.py +2 -2
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +1 -1
- chia/wallet/util/merkle_utils.py +1 -1
- chia/wallet/util/new_peak_queue.py +2 -1
- chia/wallet/util/notifications.py +5 -4
- chia/wallet/util/peer_request_cache.py +3 -2
- chia/wallet/util/puzzle_compression.py +6 -4
- chia/wallet/util/puzzle_decorator.py +6 -4
- chia/wallet/util/query_filter.py +3 -2
- chia/wallet/util/tx_config.py +3 -3
- chia/wallet/util/wallet_sync_utils.py +2 -2
- chia/wallet/util/wallet_types.py +2 -3
- chia/wallet/vc_wallet/cr_cat_drivers.py +18 -22
- chia/wallet/vc_wallet/cr_cat_wallet.py +14 -10
- chia/wallet/vc_wallet/cr_outer_puzzle.py +2 -2
- chia/wallet/vc_wallet/vc_drivers.py +50 -68
- chia/wallet/vc_wallet/vc_store.py +2 -2
- chia/wallet/vc_wallet/vc_wallet.py +47 -15
- chia/wallet/wallet.py +51 -46
- chia/wallet/wallet_action_scope.py +4 -0
- chia/wallet/wallet_blockchain.py +12 -7
- chia/wallet/wallet_coin_record.py +3 -2
- chia/wallet/wallet_coin_store.py +3 -2
- chia/wallet/wallet_info.py +2 -1
- chia/wallet/wallet_interested_store.py +3 -2
- chia/wallet/wallet_nft_store.py +4 -4
- chia/wallet/wallet_node.py +3 -4
- chia/wallet/wallet_pool_store.py +3 -4
- chia/wallet/wallet_protocol.py +19 -5
- chia/wallet/wallet_puzzle_store.py +2 -2
- chia/wallet/wallet_retry_store.py +3 -6
- chia/wallet/wallet_singleton_store.py +2 -2
- chia/wallet/wallet_state_manager.py +20 -197
- chia/wallet/wallet_transaction_store.py +2 -2
- chia/wallet/wallet_user_store.py +2 -1
- chia/wallet/wallet_weight_proof_handler.py +3 -2
- {chia_blockchain-2.5.2rc2.dist-info → chia_blockchain-2.5.3rc2.dist-info}/METADATA +3 -2
- chia_blockchain-2.5.3rc2.dist-info/RECORD +891 -0
- mozilla-ca/cacert.pem +64 -33
- chia/_tests/clvm/test_condition_codes.py +0 -13
- chia/_tests/cmds/wallet/test_dao.py +0 -565
- chia/_tests/wallet/dao_wallet/__init__.py +0 -0
- chia/_tests/wallet/dao_wallet/config.py +0 -3
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +0 -1330
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +0 -3488
- chia/cmds/dao.py +0 -1064
- chia/cmds/dao_funcs.py +0 -598
- chia/consensus/puzzles/__init__.py +0 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp +0 -69
- chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +0 -1
- chia/consensus/puzzles/rom_bootstrap_generator.clsp +0 -37
- chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +0 -1
- chia/full_node/puzzles/__init__.py +0 -0
- chia/full_node/puzzles/block_program_zero.clsp +0 -14
- chia/full_node/puzzles/block_program_zero.clsp.hex +0 -1
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp +0 -5
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +0 -1
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +0 -7
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +0 -1
- chia/full_node/puzzles/decompress_puzzle.clsp +0 -6
- chia/full_node/puzzles/decompress_puzzle.clsp.hex +0 -1
- chia/pools/puzzles/__init__.py +0 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp +0 -70
- chia/pools/puzzles/pool_member_innerpuz.clsp.hex +0 -1
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +0 -69
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +0 -1
- chia/simulator/simulator_constants.py +0 -13
- chia/types/blockchain_format/foliage.py +0 -8
- chia/types/blockchain_format/pool_target.py +0 -5
- chia/types/blockchain_format/reward_chain_block.py +0 -6
- chia/types/blockchain_format/sized_bytes.py +0 -11
- chia/util/ints.py +0 -19
- chia/wallet/cat_wallet/dao_cat_info.py +0 -28
- chia/wallet/cat_wallet/dao_cat_wallet.py +0 -669
- chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
- chia/wallet/cat_wallet/puzzles/cat_truths.clib +0 -31
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp +0 -397
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +0 -1
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +0 -25
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +0 -1
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +0 -15
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +0 -1
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +0 -26
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +0 -1
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +0 -42
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +0 -1
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +0 -24
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +0 -1
- chia/wallet/dao_wallet/__init__.py +0 -0
- chia/wallet/dao_wallet/dao_info.py +0 -61
- chia/wallet/dao_wallet/dao_utils.py +0 -811
- chia/wallet/dao_wallet/dao_wallet.py +0 -2119
- chia/wallet/did_wallet/puzzles/__init__.py +0 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +0 -135
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +0 -1
- chia/wallet/payment.py +0 -33
- chia/wallet/puzzles/augmented_condition.clsp +0 -13
- chia/wallet/puzzles/augmented_condition.clsp.hex +0 -1
- chia/wallet/puzzles/condition_codes.clib +0 -77
- chia/wallet/puzzles/curry-and-treehash.clib +0 -102
- chia/wallet/puzzles/curry.clib +0 -135
- chia/wallet/puzzles/curry_by_index.clib +0 -16
- chia/wallet/puzzles/dao_cat_eve.clsp +0 -17
- chia/wallet/puzzles/dao_cat_eve.clsp.hex +0 -1
- chia/wallet/puzzles/dao_cat_launcher.clsp +0 -36
- chia/wallet/puzzles/dao_cat_launcher.clsp.hex +0 -1
- chia/wallet/puzzles/dao_finished_state.clsp +0 -35
- chia/wallet/puzzles/dao_finished_state.clsp.hex +0 -1
- chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +0 -1
- chia/wallet/puzzles/dao_lockup.clsp +0 -288
- chia/wallet/puzzles/dao_lockup.clsp.hex +0 -1
- chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +0 -1
- chia/wallet/puzzles/dao_proposal.clsp +0 -377
- chia/wallet/puzzles/dao_proposal.clsp.hex +0 -1
- chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +0 -1
- chia/wallet/puzzles/dao_proposal_timer.clsp +0 -78
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex +0 -1
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +0 -1
- chia/wallet/puzzles/dao_proposal_validator.clsp +0 -87
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex +0 -1
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +0 -1
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +0 -240
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +0 -1
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +0 -1
- chia/wallet/puzzles/dao_treasury.clsp +0 -115
- chia/wallet/puzzles/dao_treasury.clsp.hex +0 -1
- chia/wallet/puzzles/dao_update_proposal.clsp +0 -44
- chia/wallet/puzzles/dao_update_proposal.clsp.hex +0 -1
- chia/wallet/puzzles/json.clib +0 -25
- chia/wallet/puzzles/merkle_utils.clib +0 -18
- chia/wallet/puzzles/notification.clsp +0 -7
- chia/wallet/puzzles/notification.clsp.hex +0 -1
- chia/wallet/puzzles/p2_1_of_n.clsp +0 -22
- chia/wallet/puzzles/p2_1_of_n.clsp.hex +0 -1
- chia/wallet/puzzles/p2_conditions.clsp +0 -3
- chia/wallet/puzzles/p2_conditions.clsp.hex +0 -1
- chia/wallet/puzzles/p2_delegated_conditions.clsp +0 -18
- chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +0 -1
- chia/wallet/puzzles/p2_delegated_puzzle.clsp +0 -19
- chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +0 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +0 -91
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +0 -1
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +0 -108
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +0 -1
- chia/wallet/puzzles/p2_parent.clsp +0 -19
- chia/wallet/puzzles/p2_parent.clsp.hex +0 -1
- chia/wallet/puzzles/p2_puzzle_hash.clsp +0 -18
- chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +0 -1
- chia/wallet/puzzles/p2_singleton.clsp +0 -30
- chia/wallet/puzzles/p2_singleton.clsp.hex +0 -1
- chia/wallet/puzzles/p2_singleton_aggregator.clsp +0 -81
- chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +0 -1
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +0 -50
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +0 -1
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +0 -47
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +0 -1
- chia/wallet/puzzles/settlement_payments.clsp +0 -49
- chia/wallet/puzzles/settlement_payments.clsp.hex +0 -1
- chia/wallet/puzzles/sha256tree.clib +0 -11
- chia/wallet/puzzles/singleton_launcher.clsp +0 -16
- chia/wallet/puzzles/singleton_launcher.clsp.hex +0 -1
- chia/wallet/puzzles/singleton_top_layer.clsp +0 -177
- chia/wallet/puzzles/singleton_top_layer.clsp.hex +0 -1
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +0 -107
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +0 -1
- chia/wallet/puzzles/singleton_truths.clib +0 -21
- chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +0 -3
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +0 -1
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +0 -304
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +0 -1
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +0 -45
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +0 -30
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +0 -75
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +0 -32
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +0 -80
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +0 -163
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +0 -16
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +0 -74
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +0 -23
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +0 -1
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +0 -64
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +0 -1
- chia_blockchain-2.5.2rc2.dist-info/RECORD +0 -1042
- {chia_blockchain-2.5.2rc2.dist-info → chia_blockchain-2.5.3rc2.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.2rc2.dist-info → chia_blockchain-2.5.3rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.2rc2.dist-info → chia_blockchain-2.5.3rc2.dist-info}/entry_points.txt +0 -0
|
@@ -1,811 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import logging
|
|
4
|
-
from collections.abc import Iterator
|
|
5
|
-
from itertools import chain
|
|
6
|
-
from typing import Any, Optional, Union
|
|
7
|
-
|
|
8
|
-
from clvm.EvalError import EvalError
|
|
9
|
-
|
|
10
|
-
from chia.types.blockchain_format.coin import Coin
|
|
11
|
-
from chia.types.blockchain_format.program import Program
|
|
12
|
-
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
13
|
-
from chia.util.ints import uint64
|
|
14
|
-
from chia.wallet.cat_wallet.cat_utils import CAT_MOD, CAT_MOD_HASH, construct_cat_puzzle
|
|
15
|
-
from chia.wallet.dao_wallet.dao_info import DAORules, ProposalType
|
|
16
|
-
from chia.wallet.puzzles.load_clvm import load_clvm
|
|
17
|
-
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import MOD
|
|
18
|
-
from chia.wallet.singleton import get_singleton_struct_for_id
|
|
19
|
-
from chia.wallet.uncurried_puzzle import UncurriedPuzzle
|
|
20
|
-
|
|
21
|
-
SINGLETON_MOD: Program = load_clvm("singleton_top_layer_v1_1.clsp")
|
|
22
|
-
SINGLETON_MOD_HASH: bytes32 = SINGLETON_MOD.get_tree_hash()
|
|
23
|
-
SINGLETON_LAUNCHER: Program = load_clvm("singleton_launcher.clsp")
|
|
24
|
-
SINGLETON_LAUNCHER_HASH: bytes32 = SINGLETON_LAUNCHER.get_tree_hash()
|
|
25
|
-
DAO_LOCKUP_MOD: Program = load_clvm("dao_lockup.clsp")
|
|
26
|
-
DAO_LOCKUP_MOD_HASH: bytes32 = DAO_LOCKUP_MOD.get_tree_hash()
|
|
27
|
-
DAO_PROPOSAL_TIMER_MOD: Program = load_clvm("dao_proposal_timer.clsp")
|
|
28
|
-
DAO_PROPOSAL_TIMER_MOD_HASH: bytes32 = DAO_PROPOSAL_TIMER_MOD.get_tree_hash()
|
|
29
|
-
DAO_PROPOSAL_MOD: Program = load_clvm("dao_proposal.clsp")
|
|
30
|
-
DAO_PROPOSAL_MOD_HASH: bytes32 = DAO_PROPOSAL_MOD.get_tree_hash()
|
|
31
|
-
DAO_PROPOSAL_VALIDATOR_MOD: Program = load_clvm("dao_proposal_validator.clsp")
|
|
32
|
-
DAO_PROPOSAL_VALIDATOR_MOD_HASH: bytes32 = DAO_PROPOSAL_VALIDATOR_MOD.get_tree_hash()
|
|
33
|
-
DAO_TREASURY_MOD: Program = load_clvm("dao_treasury.clsp")
|
|
34
|
-
DAO_TREASURY_MOD_HASH: bytes32 = DAO_TREASURY_MOD.get_tree_hash()
|
|
35
|
-
SPEND_P2_SINGLETON_MOD: Program = load_clvm("dao_spend_p2_singleton_v2.clsp")
|
|
36
|
-
SPEND_P2_SINGLETON_MOD_HASH: bytes32 = SPEND_P2_SINGLETON_MOD.get_tree_hash()
|
|
37
|
-
DAO_FINISHED_STATE: Program = load_clvm("dao_finished_state.clsp")
|
|
38
|
-
DAO_FINISHED_STATE_HASH: bytes32 = DAO_FINISHED_STATE.get_tree_hash()
|
|
39
|
-
DAO_CAT_TAIL: Program = load_clvm(
|
|
40
|
-
"genesis_by_coin_id_or_singleton.clsp", package_or_requirement="chia.wallet.cat_wallet.puzzles"
|
|
41
|
-
)
|
|
42
|
-
DAO_CAT_TAIL_HASH: bytes32 = DAO_CAT_TAIL.get_tree_hash()
|
|
43
|
-
DAO_CAT_LAUNCHER: Program = load_clvm("dao_cat_launcher.clsp")
|
|
44
|
-
P2_SINGLETON_MOD: Program = load_clvm("p2_singleton_via_delegated_puzzle.clsp")
|
|
45
|
-
P2_SINGLETON_MOD_HASH: bytes32 = P2_SINGLETON_MOD.get_tree_hash()
|
|
46
|
-
DAO_UPDATE_PROPOSAL_MOD: Program = load_clvm("dao_update_proposal.clsp")
|
|
47
|
-
DAO_UPDATE_PROPOSAL_MOD_HASH: bytes32 = DAO_UPDATE_PROPOSAL_MOD.get_tree_hash()
|
|
48
|
-
DAO_CAT_EVE: Program = load_clvm("dao_cat_eve.clsp")
|
|
49
|
-
P2_SINGLETON_AGGREGATOR_MOD: Program = load_clvm("p2_singleton_aggregator.clsp")
|
|
50
|
-
|
|
51
|
-
log = logging.Logger(__name__)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def create_cat_launcher_for_singleton_id(id: bytes32) -> Program:
|
|
55
|
-
singleton_struct = get_singleton_struct_for_id(id)
|
|
56
|
-
return DAO_CAT_LAUNCHER.curry(singleton_struct)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def curry_cat_eve(next_puzzle_hash: bytes32) -> Program:
|
|
60
|
-
return DAO_CAT_EVE.curry(next_puzzle_hash)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def get_treasury_puzzle(dao_rules: DAORules, treasury_id: bytes32, cat_tail_hash: bytes32) -> Program:
|
|
64
|
-
singleton_struct: Program = Program.to((SINGLETON_MOD_HASH, (treasury_id, SINGLETON_LAUNCHER_HASH)))
|
|
65
|
-
lockup_puzzle: Program = DAO_LOCKUP_MOD.curry(
|
|
66
|
-
SINGLETON_MOD_HASH,
|
|
67
|
-
SINGLETON_LAUNCHER_HASH,
|
|
68
|
-
DAO_FINISHED_STATE_HASH,
|
|
69
|
-
CAT_MOD_HASH,
|
|
70
|
-
cat_tail_hash,
|
|
71
|
-
)
|
|
72
|
-
proposal_self_hash = DAO_PROPOSAL_MOD.curry(
|
|
73
|
-
DAO_PROPOSAL_TIMER_MOD_HASH,
|
|
74
|
-
SINGLETON_MOD_HASH,
|
|
75
|
-
SINGLETON_LAUNCHER_HASH,
|
|
76
|
-
CAT_MOD_HASH,
|
|
77
|
-
DAO_FINISHED_STATE_HASH,
|
|
78
|
-
DAO_TREASURY_MOD_HASH,
|
|
79
|
-
lockup_puzzle.get_tree_hash(),
|
|
80
|
-
cat_tail_hash,
|
|
81
|
-
treasury_id,
|
|
82
|
-
).get_tree_hash()
|
|
83
|
-
|
|
84
|
-
proposal_validator = DAO_PROPOSAL_VALIDATOR_MOD.curry(
|
|
85
|
-
singleton_struct,
|
|
86
|
-
proposal_self_hash,
|
|
87
|
-
dao_rules.proposal_minimum_amount,
|
|
88
|
-
get_p2_singleton_puzzle(
|
|
89
|
-
treasury_id
|
|
90
|
-
).get_tree_hash(), # TODO: let people set this later - for now a hidden feature
|
|
91
|
-
)
|
|
92
|
-
puzzle = DAO_TREASURY_MOD.curry(
|
|
93
|
-
DAO_TREASURY_MOD_HASH,
|
|
94
|
-
proposal_validator,
|
|
95
|
-
dao_rules.proposal_timelock,
|
|
96
|
-
dao_rules.soft_close_length,
|
|
97
|
-
dao_rules.attendance_required,
|
|
98
|
-
dao_rules.pass_percentage,
|
|
99
|
-
dao_rules.self_destruct_length,
|
|
100
|
-
dao_rules.oracle_spend_delay,
|
|
101
|
-
)
|
|
102
|
-
return puzzle
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def get_proposal_validator(treasury_puz: Program, proposal_minimum_amount: uint64) -> Program:
|
|
106
|
-
_, uncurried_args = treasury_puz.uncurry()
|
|
107
|
-
validator: Program = uncurried_args.rest().first()
|
|
108
|
-
validator_args = validator.uncurry()[1]
|
|
109
|
-
(
|
|
110
|
-
singleton_struct,
|
|
111
|
-
proposal_self_hash,
|
|
112
|
-
_,
|
|
113
|
-
p2_puzhash,
|
|
114
|
-
) = validator_args.as_iter()
|
|
115
|
-
proposal_validator = DAO_PROPOSAL_VALIDATOR_MOD.curry(
|
|
116
|
-
singleton_struct,
|
|
117
|
-
proposal_self_hash,
|
|
118
|
-
proposal_minimum_amount,
|
|
119
|
-
p2_puzhash,
|
|
120
|
-
)
|
|
121
|
-
return proposal_validator
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
def get_update_proposal_puzzle(dao_rules: DAORules, proposal_validator: Program) -> Program:
|
|
125
|
-
validator_args = uncurry_proposal_validator(proposal_validator)
|
|
126
|
-
(
|
|
127
|
-
singleton_struct,
|
|
128
|
-
proposal_self_hash,
|
|
129
|
-
_,
|
|
130
|
-
proposal_excess_puzhash,
|
|
131
|
-
) = validator_args.as_iter()
|
|
132
|
-
update_proposal = DAO_UPDATE_PROPOSAL_MOD.curry(
|
|
133
|
-
DAO_TREASURY_MOD_HASH,
|
|
134
|
-
DAO_PROPOSAL_VALIDATOR_MOD_HASH,
|
|
135
|
-
singleton_struct,
|
|
136
|
-
proposal_self_hash,
|
|
137
|
-
dao_rules.proposal_minimum_amount,
|
|
138
|
-
proposal_excess_puzhash,
|
|
139
|
-
dao_rules.proposal_timelock,
|
|
140
|
-
dao_rules.soft_close_length,
|
|
141
|
-
dao_rules.attendance_required,
|
|
142
|
-
dao_rules.pass_percentage,
|
|
143
|
-
dao_rules.self_destruct_length,
|
|
144
|
-
dao_rules.oracle_spend_delay,
|
|
145
|
-
)
|
|
146
|
-
return update_proposal
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
def get_dao_rules_from_update_proposal(puzzle: Program) -> DAORules:
|
|
150
|
-
mod, curried_args = puzzle.uncurry()
|
|
151
|
-
if mod != DAO_UPDATE_PROPOSAL_MOD: # pragma: no cover
|
|
152
|
-
raise ValueError("Not an update proposal.")
|
|
153
|
-
(
|
|
154
|
-
_,
|
|
155
|
-
_,
|
|
156
|
-
_,
|
|
157
|
-
_,
|
|
158
|
-
proposal_minimum_amount,
|
|
159
|
-
_,
|
|
160
|
-
proposal_timelock,
|
|
161
|
-
soft_close_length,
|
|
162
|
-
attendance_required,
|
|
163
|
-
pass_percentage,
|
|
164
|
-
self_destruct_length,
|
|
165
|
-
oracle_spend_delay,
|
|
166
|
-
) = curried_args.as_iter()
|
|
167
|
-
dao_rules = DAORules(
|
|
168
|
-
uint64(proposal_timelock.as_int()),
|
|
169
|
-
uint64(soft_close_length.as_int()),
|
|
170
|
-
uint64(attendance_required.as_int()),
|
|
171
|
-
uint64(pass_percentage.as_int()),
|
|
172
|
-
uint64(self_destruct_length.as_int()),
|
|
173
|
-
uint64(oracle_spend_delay.as_int()),
|
|
174
|
-
uint64(proposal_minimum_amount.as_int()),
|
|
175
|
-
)
|
|
176
|
-
return dao_rules
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def get_spend_p2_singleton_puzzle(treasury_id: bytes32, xch_conditions: Program, asset_conditions: Program) -> Program:
|
|
180
|
-
# TODO: typecheck get_spend_p2_singleton_puzzle arguments
|
|
181
|
-
# TODO: add tests for get_spend_p2_singleton_puzzle: pass xch_conditions as Puzzle, List and ConditionWithArgs
|
|
182
|
-
#
|
|
183
|
-
|
|
184
|
-
# CAT_MOD_HASH
|
|
185
|
-
# CONDITIONS ; XCH conditions, to be generated by the treasury
|
|
186
|
-
# LIST_OF_TAILHASH_CONDITIONS ; the delegated puzzlehash must be curried in to the proposal.
|
|
187
|
-
# ; Puzzlehash is only run in the last coin for that asset
|
|
188
|
-
# ; ((TAIL_HASH CONDITIONS) (TAIL_HASH CONDITIONS)... )
|
|
189
|
-
# P2_SINGLETON_VIA_DELEGATED_PUZZLE_PUZHASH
|
|
190
|
-
treasury_struct = Program.to((SINGLETON_MOD_HASH, (treasury_id, SINGLETON_LAUNCHER_HASH)))
|
|
191
|
-
puzzle: Program = SPEND_P2_SINGLETON_MOD.curry(
|
|
192
|
-
treasury_struct,
|
|
193
|
-
CAT_MOD_HASH,
|
|
194
|
-
xch_conditions,
|
|
195
|
-
asset_conditions,
|
|
196
|
-
P2_SINGLETON_MOD.curry(treasury_struct, P2_SINGLETON_AGGREGATOR_MOD).get_tree_hash(),
|
|
197
|
-
)
|
|
198
|
-
return puzzle
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
def get_p2_singleton_puzzle(treasury_id: bytes32, asset_id: Optional[bytes32] = None) -> Program:
|
|
202
|
-
singleton_struct: Program = Program.to((SINGLETON_MOD_HASH, (treasury_id, SINGLETON_LAUNCHER_HASH)))
|
|
203
|
-
inner_puzzle = P2_SINGLETON_MOD.curry(singleton_struct, P2_SINGLETON_AGGREGATOR_MOD)
|
|
204
|
-
if asset_id:
|
|
205
|
-
# CAT
|
|
206
|
-
puzzle = CAT_MOD.curry(CAT_MOD_HASH, asset_id, inner_puzzle)
|
|
207
|
-
return Program(puzzle)
|
|
208
|
-
else:
|
|
209
|
-
# XCH
|
|
210
|
-
return inner_puzzle
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
def get_p2_singleton_puzhash(treasury_id: bytes32, asset_id: Optional[bytes32] = None) -> bytes32:
|
|
214
|
-
puz = get_p2_singleton_puzzle(treasury_id, asset_id)
|
|
215
|
-
assert puz is not None
|
|
216
|
-
return puz.get_tree_hash()
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
def get_lockup_puzzle(
|
|
220
|
-
cat_tail_hash: Union[bytes32, Program],
|
|
221
|
-
previous_votes_list: Union[list[Optional[bytes32]], Program],
|
|
222
|
-
innerpuz: Optional[Program],
|
|
223
|
-
) -> Program:
|
|
224
|
-
self_hash: Program = DAO_LOCKUP_MOD.curry(
|
|
225
|
-
SINGLETON_MOD_HASH,
|
|
226
|
-
SINGLETON_LAUNCHER_HASH,
|
|
227
|
-
DAO_FINISHED_STATE_HASH,
|
|
228
|
-
CAT_MOD_HASH,
|
|
229
|
-
cat_tail_hash,
|
|
230
|
-
)
|
|
231
|
-
puzzle = self_hash.curry(
|
|
232
|
-
self_hash.get_tree_hash(),
|
|
233
|
-
previous_votes_list, # TODO: maybe format check this in this function
|
|
234
|
-
innerpuz,
|
|
235
|
-
)
|
|
236
|
-
return puzzle
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
def add_proposal_to_active_list(
|
|
240
|
-
lockup_puzzle: Program, proposal_id: bytes32, inner_puzzle: Optional[Program] = None
|
|
241
|
-
) -> Program:
|
|
242
|
-
curried_args, c_a = uncurry_lockup(lockup_puzzle)
|
|
243
|
-
(
|
|
244
|
-
_SINGLETON_MOD_HASH,
|
|
245
|
-
_SINGLETON_LAUNCHER_PUZHASH,
|
|
246
|
-
_DAO_FINISHED_STATE_HASH,
|
|
247
|
-
_CAT_MOD_HASH,
|
|
248
|
-
CAT_TAIL_HASH,
|
|
249
|
-
) = c_a.as_iter()
|
|
250
|
-
(_SELF_HASH, ACTIVE_VOTES, INNERPUZ) = curried_args.as_iter()
|
|
251
|
-
new_active_votes = Program.to(proposal_id).cons(ACTIVE_VOTES) # (c proposal_id ACTIVE_VOTES)
|
|
252
|
-
if inner_puzzle is None:
|
|
253
|
-
inner_puzzle = INNERPUZ
|
|
254
|
-
return get_lockup_puzzle(CAT_TAIL_HASH, new_active_votes, inner_puzzle)
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
def get_active_votes_from_lockup_puzzle(lockup_puzzle: Program) -> Program:
|
|
258
|
-
curried_args, c_a = uncurry_lockup(lockup_puzzle)
|
|
259
|
-
(
|
|
260
|
-
_SINGLETON_MOD_HASH,
|
|
261
|
-
_SINGLETON_LAUNCHER_HASH,
|
|
262
|
-
_DAO_FINISHED_STATE_HASH,
|
|
263
|
-
_CAT_MOD_HASH,
|
|
264
|
-
_CAT_TAIL_HASH,
|
|
265
|
-
) = list(c_a.as_iter())
|
|
266
|
-
(
|
|
267
|
-
_self_hash,
|
|
268
|
-
ACTIVE_VOTES,
|
|
269
|
-
_INNERPUZ,
|
|
270
|
-
) = curried_args.as_iter()
|
|
271
|
-
return Program(ACTIVE_VOTES)
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
def get_innerpuz_from_lockup_puzzle(lockup_puzzle: Program) -> Optional[Program]:
|
|
275
|
-
try:
|
|
276
|
-
curried_args, c_a = uncurry_lockup(lockup_puzzle)
|
|
277
|
-
except Exception as e: # pragma: no cover
|
|
278
|
-
log.debug("Could not uncurry inner puzzle from lockup: %s", e)
|
|
279
|
-
return None
|
|
280
|
-
(
|
|
281
|
-
_SINGLETON_MOD_HASH,
|
|
282
|
-
_SINGLETON_LAUNCHER_HASH,
|
|
283
|
-
_DAO_FINISHED_STATE_HASH,
|
|
284
|
-
_CAT_MOD_HASH,
|
|
285
|
-
_CAT_TAIL_HASH,
|
|
286
|
-
) = list(c_a.as_iter())
|
|
287
|
-
(
|
|
288
|
-
_self_hash,
|
|
289
|
-
_ACTIVE_VOTES,
|
|
290
|
-
INNERPUZ,
|
|
291
|
-
) = list(curried_args.as_iter())
|
|
292
|
-
return Program(INNERPUZ)
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
def get_proposal_puzzle(
|
|
296
|
-
*,
|
|
297
|
-
proposal_id: bytes32,
|
|
298
|
-
cat_tail_hash: bytes32,
|
|
299
|
-
treasury_id: bytes32,
|
|
300
|
-
votes_sum: uint64,
|
|
301
|
-
total_votes: uint64,
|
|
302
|
-
proposed_puzzle_hash: bytes32,
|
|
303
|
-
) -> Program:
|
|
304
|
-
"""
|
|
305
|
-
spend_or_update_flag can take on the following values, ranked from safest to most dangerous:
|
|
306
|
-
s for spend only
|
|
307
|
-
u for update only
|
|
308
|
-
d for dangerous (can do anything)
|
|
309
|
-
"""
|
|
310
|
-
lockup_puzzle: Program = DAO_LOCKUP_MOD.curry(
|
|
311
|
-
SINGLETON_MOD_HASH,
|
|
312
|
-
SINGLETON_LAUNCHER_HASH,
|
|
313
|
-
DAO_FINISHED_STATE_HASH,
|
|
314
|
-
CAT_MOD_HASH,
|
|
315
|
-
cat_tail_hash,
|
|
316
|
-
)
|
|
317
|
-
# SINGLETON_STRUCT ; (SINGLETON_MOD_HASH (SINGLETON_ID . LAUNCHER_PUZZLE_HASH))
|
|
318
|
-
# PROPOSAL_TIMER_MOD_HASH ; proposal timer needs to know which proposal created it, AND
|
|
319
|
-
# CAT_MOD_HASH
|
|
320
|
-
# DAO_FINISHED_STATE_MOD_HASH
|
|
321
|
-
# TREASURY_MOD_HASH
|
|
322
|
-
# LOCKUP_SELF_HASH
|
|
323
|
-
# CAT_TAIL_HASH
|
|
324
|
-
# TREASURY_ID
|
|
325
|
-
# ; second hash
|
|
326
|
-
# SELF_HASH
|
|
327
|
-
# PROPOSED_PUZ_HASH ; this is what runs if this proposal is successful - the inner puzzle of this proposal
|
|
328
|
-
# YES_VOTES ; yes votes are +1, no votes don't tally - we compare yes_votes/total_votes at the end
|
|
329
|
-
# TOTAL_VOTES ; how many people responded
|
|
330
|
-
curry_one = DAO_PROPOSAL_MOD.curry(
|
|
331
|
-
DAO_PROPOSAL_TIMER_MOD_HASH,
|
|
332
|
-
SINGLETON_MOD_HASH,
|
|
333
|
-
SINGLETON_LAUNCHER_HASH,
|
|
334
|
-
CAT_MOD_HASH,
|
|
335
|
-
DAO_FINISHED_STATE_HASH,
|
|
336
|
-
DAO_TREASURY_MOD_HASH,
|
|
337
|
-
lockup_puzzle.get_tree_hash(),
|
|
338
|
-
cat_tail_hash,
|
|
339
|
-
treasury_id,
|
|
340
|
-
)
|
|
341
|
-
puzzle = curry_one.curry(
|
|
342
|
-
curry_one.get_tree_hash(),
|
|
343
|
-
proposal_id,
|
|
344
|
-
proposed_puzzle_hash,
|
|
345
|
-
votes_sum,
|
|
346
|
-
total_votes,
|
|
347
|
-
)
|
|
348
|
-
return puzzle
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
def get_proposal_timer_puzzle(
|
|
352
|
-
cat_tail_hash: bytes32,
|
|
353
|
-
proposal_id: bytes32,
|
|
354
|
-
treasury_id: bytes32,
|
|
355
|
-
) -> Program:
|
|
356
|
-
parent_singleton_struct: Program = Program.to((SINGLETON_MOD_HASH, (proposal_id, SINGLETON_LAUNCHER_HASH)))
|
|
357
|
-
lockup_puzzle: Program = DAO_LOCKUP_MOD.curry(
|
|
358
|
-
SINGLETON_MOD_HASH,
|
|
359
|
-
SINGLETON_LAUNCHER_HASH,
|
|
360
|
-
DAO_FINISHED_STATE_HASH,
|
|
361
|
-
CAT_MOD_HASH,
|
|
362
|
-
cat_tail_hash,
|
|
363
|
-
)
|
|
364
|
-
PROPOSAL_SELF_HASH = DAO_PROPOSAL_MOD.curry(
|
|
365
|
-
DAO_PROPOSAL_TIMER_MOD_HASH,
|
|
366
|
-
SINGLETON_MOD_HASH,
|
|
367
|
-
SINGLETON_LAUNCHER_HASH,
|
|
368
|
-
CAT_MOD_HASH,
|
|
369
|
-
DAO_FINISHED_STATE_HASH,
|
|
370
|
-
DAO_TREASURY_MOD_HASH,
|
|
371
|
-
lockup_puzzle.get_tree_hash(),
|
|
372
|
-
cat_tail_hash,
|
|
373
|
-
treasury_id,
|
|
374
|
-
).get_tree_hash()
|
|
375
|
-
|
|
376
|
-
puzzle: Program = DAO_PROPOSAL_TIMER_MOD.curry(
|
|
377
|
-
PROPOSAL_SELF_HASH,
|
|
378
|
-
parent_singleton_struct,
|
|
379
|
-
)
|
|
380
|
-
return puzzle
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
def get_treasury_rules_from_puzzle(puzzle_reveal: Optional[Program]) -> DAORules:
|
|
384
|
-
assert isinstance(puzzle_reveal, Program)
|
|
385
|
-
curried_args = uncurry_treasury(puzzle_reveal)
|
|
386
|
-
(
|
|
387
|
-
_DAO_TREASURY_MOD_HASH,
|
|
388
|
-
proposal_validator,
|
|
389
|
-
proposal_timelock,
|
|
390
|
-
soft_close_length,
|
|
391
|
-
attendance_required,
|
|
392
|
-
pass_percentage,
|
|
393
|
-
self_destruct_length,
|
|
394
|
-
oracle_spend_delay,
|
|
395
|
-
) = curried_args
|
|
396
|
-
curried_args_prg = uncurry_proposal_validator(proposal_validator)
|
|
397
|
-
(
|
|
398
|
-
_SINGLETON_STRUCT,
|
|
399
|
-
_PROPOSAL_SELF_HASH,
|
|
400
|
-
PROPOSAL_MINIMUM_AMOUNT,
|
|
401
|
-
_PAYOUT_PUZHASH,
|
|
402
|
-
) = curried_args_prg.as_iter()
|
|
403
|
-
return DAORules(
|
|
404
|
-
uint64(proposal_timelock.as_int()),
|
|
405
|
-
uint64(soft_close_length.as_int()),
|
|
406
|
-
uint64(attendance_required.as_int()),
|
|
407
|
-
uint64(pass_percentage.as_int()),
|
|
408
|
-
uint64(self_destruct_length.as_int()),
|
|
409
|
-
uint64(oracle_spend_delay.as_int()),
|
|
410
|
-
uint64(PROPOSAL_MINIMUM_AMOUNT.as_int()),
|
|
411
|
-
)
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
# This takes the treasury puzzle and treasury solution, not the full puzzle and full solution
|
|
415
|
-
# This also returns the treasury puzzle and not the full puzzle
|
|
416
|
-
def get_new_puzzle_from_treasury_solution(puzzle_reveal: Program, solution: Program) -> Optional[Program]:
|
|
417
|
-
if solution.rest().rest().first() != Program.to(0):
|
|
418
|
-
# Proposal Spend
|
|
419
|
-
mod, curried_args = solution.at("rrf").uncurry()
|
|
420
|
-
if mod == DAO_UPDATE_PROPOSAL_MOD:
|
|
421
|
-
(
|
|
422
|
-
DAO_TREASURY_MOD_HASH,
|
|
423
|
-
_DAO_VALIDATOR_MOD_HASH,
|
|
424
|
-
TREASURY_SINGLETON_STRUCT,
|
|
425
|
-
PROPOSAL_SELF_HASH,
|
|
426
|
-
proposal_minimum_amount,
|
|
427
|
-
PROPOSAL_EXCESS_PAYOUT_PUZ_HASH,
|
|
428
|
-
proposal_timelock,
|
|
429
|
-
soft_close_length,
|
|
430
|
-
attendance_required,
|
|
431
|
-
pass_percentage,
|
|
432
|
-
self_destruct_length,
|
|
433
|
-
oracle_spend_delay,
|
|
434
|
-
) = curried_args.as_iter()
|
|
435
|
-
new_validator = DAO_PROPOSAL_VALIDATOR_MOD.curry(
|
|
436
|
-
TREASURY_SINGLETON_STRUCT, PROPOSAL_SELF_HASH, proposal_minimum_amount, PROPOSAL_EXCESS_PAYOUT_PUZ_HASH
|
|
437
|
-
)
|
|
438
|
-
return DAO_TREASURY_MOD.curry(
|
|
439
|
-
DAO_TREASURY_MOD_HASH,
|
|
440
|
-
new_validator,
|
|
441
|
-
proposal_timelock,
|
|
442
|
-
soft_close_length,
|
|
443
|
-
attendance_required,
|
|
444
|
-
pass_percentage,
|
|
445
|
-
self_destruct_length,
|
|
446
|
-
oracle_spend_delay,
|
|
447
|
-
)
|
|
448
|
-
else:
|
|
449
|
-
return puzzle_reveal
|
|
450
|
-
else:
|
|
451
|
-
# Oracle Spend - treasury is unchanged
|
|
452
|
-
return puzzle_reveal
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
# This takes the proposal puzzle and proposal solution, not the full puzzle and full solution
|
|
456
|
-
# This also returns the proposal puzzle and not the full puzzle
|
|
457
|
-
def get_new_puzzle_from_proposal_solution(puzzle_reveal: Program, solution: Program) -> Optional[Program]:
|
|
458
|
-
# Check if soft_close_length is in solution. If not, then add votes, otherwise close proposal
|
|
459
|
-
if len(solution.as_python()) == 1:
|
|
460
|
-
return puzzle_reveal # we're finished, shortcut this function
|
|
461
|
-
|
|
462
|
-
if solution.at("rrrrrrf") == Program.to(0):
|
|
463
|
-
c_a, curried_args = uncurry_proposal(puzzle_reveal)
|
|
464
|
-
assert isinstance(curried_args, Program)
|
|
465
|
-
(
|
|
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,
|
|
473
|
-
cat_tail_hash,
|
|
474
|
-
treasury_id,
|
|
475
|
-
) = curried_args.as_iter()
|
|
476
|
-
assert isinstance(c_a, Program)
|
|
477
|
-
(
|
|
478
|
-
_curry_one,
|
|
479
|
-
proposal_id,
|
|
480
|
-
proposed_puzzle_hash,
|
|
481
|
-
yes_votes,
|
|
482
|
-
total_votes,
|
|
483
|
-
) = c_a.as_iter()
|
|
484
|
-
|
|
485
|
-
added_votes = 0
|
|
486
|
-
for vote_amount in solution.first().as_iter():
|
|
487
|
-
added_votes += vote_amount.as_int()
|
|
488
|
-
|
|
489
|
-
new_total_votes = total_votes.as_int() + added_votes
|
|
490
|
-
|
|
491
|
-
if solution.at("rf") == Program.to(0):
|
|
492
|
-
# Vote Type: NO
|
|
493
|
-
new_yes_votes = yes_votes.as_int()
|
|
494
|
-
else:
|
|
495
|
-
# Vote Type: YES
|
|
496
|
-
new_yes_votes = yes_votes.as_int() + added_votes
|
|
497
|
-
return get_proposal_puzzle(
|
|
498
|
-
proposal_id=bytes32(proposal_id.as_atom()),
|
|
499
|
-
cat_tail_hash=bytes32(cat_tail_hash.as_atom()),
|
|
500
|
-
treasury_id=bytes32(treasury_id.as_atom()),
|
|
501
|
-
votes_sum=uint64(new_yes_votes),
|
|
502
|
-
total_votes=uint64(new_total_votes),
|
|
503
|
-
proposed_puzzle_hash=bytes32(proposed_puzzle_hash.as_atom()),
|
|
504
|
-
)
|
|
505
|
-
else:
|
|
506
|
-
# we are in the finished state, puzzle is the same as ever
|
|
507
|
-
mod, currieds = puzzle_reveal.uncurry() # uncurry to self_hash
|
|
508
|
-
# check if our parent was the last non-finished state
|
|
509
|
-
if mod.uncurry()[0] == DAO_PROPOSAL_MOD:
|
|
510
|
-
c_a, curried_args = uncurry_proposal(puzzle_reveal)
|
|
511
|
-
(
|
|
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,
|
|
519
|
-
cat_tail_hash,
|
|
520
|
-
treasury_id,
|
|
521
|
-
) = curried_args.as_iter()
|
|
522
|
-
(
|
|
523
|
-
_curry_one,
|
|
524
|
-
proposal_id,
|
|
525
|
-
proposed_puzzle_hash,
|
|
526
|
-
yes_votes,
|
|
527
|
-
total_votes,
|
|
528
|
-
) = c_a.as_iter()
|
|
529
|
-
else: # pragma: no cover
|
|
530
|
-
SINGLETON_STRUCT, _dao_finished_hash = currieds.as_iter()
|
|
531
|
-
proposal_id = SINGLETON_STRUCT.rest().first()
|
|
532
|
-
return get_finished_state_inner_puzzle(bytes32(proposal_id.as_atom()))
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
def get_finished_state_inner_puzzle(proposal_id: bytes32) -> Program:
|
|
536
|
-
singleton_struct: Program = Program.to((SINGLETON_MOD_HASH, (proposal_id, SINGLETON_LAUNCHER_HASH)))
|
|
537
|
-
finished_inner_puz: Program = DAO_FINISHED_STATE.curry(singleton_struct, DAO_FINISHED_STATE_HASH)
|
|
538
|
-
return finished_inner_puz
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
def get_finished_state_puzzle(proposal_id: bytes32) -> Program:
|
|
542
|
-
return curry_singleton(proposal_id, get_finished_state_inner_puzzle(proposal_id))
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
def get_proposed_puzzle_reveal_from_solution(solution: Program) -> Program:
|
|
546
|
-
prog = Program.from_bytes(bytes(solution))
|
|
547
|
-
return prog.at("rrfrrrrrf")
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
def get_asset_id_from_puzzle(puzzle: Program) -> Optional[bytes32]:
|
|
551
|
-
mod, curried_args = puzzle.uncurry()
|
|
552
|
-
if mod == MOD: # pragma: no cover
|
|
553
|
-
return None
|
|
554
|
-
elif mod == CAT_MOD:
|
|
555
|
-
return bytes32(curried_args.at("rf").as_atom())
|
|
556
|
-
elif mod == SINGLETON_MOD: # pragma: no cover
|
|
557
|
-
return bytes32(curried_args.at("frf").as_atom())
|
|
558
|
-
else:
|
|
559
|
-
raise ValueError("DAO received coin with unknown puzzle") # pragma: no cover
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
def uncurry_proposal_validator(proposal_validator_program: Program) -> Program:
|
|
563
|
-
try:
|
|
564
|
-
mod, curried_args = proposal_validator_program.uncurry()
|
|
565
|
-
except ValueError as e: # pragma: no cover
|
|
566
|
-
log.debug("Cannot uncurry treasury puzzle: error: %s", e)
|
|
567
|
-
raise e
|
|
568
|
-
|
|
569
|
-
if mod != DAO_PROPOSAL_VALIDATOR_MOD: # pragma: no cover
|
|
570
|
-
raise ValueError("Not a Treasury mod.")
|
|
571
|
-
return curried_args
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
def uncurry_treasury(treasury_puzzle: Program) -> list[Program]:
|
|
575
|
-
try:
|
|
576
|
-
mod, curried_args = treasury_puzzle.uncurry()
|
|
577
|
-
except ValueError as e: # pragma: no cover
|
|
578
|
-
log.debug("Cannot uncurry treasury puzzle: error: %s", e)
|
|
579
|
-
raise e
|
|
580
|
-
|
|
581
|
-
if mod != DAO_TREASURY_MOD: # pragma: no cover
|
|
582
|
-
raise ValueError("Not a Treasury mod.")
|
|
583
|
-
return list(curried_args.as_iter())
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
def uncurry_proposal(proposal_puzzle: Program) -> tuple[Program, Program]:
|
|
587
|
-
try:
|
|
588
|
-
mod, curried_args = proposal_puzzle.uncurry()
|
|
589
|
-
except ValueError as e: # pragma: no cover
|
|
590
|
-
log.debug("Cannot uncurry proposal puzzle: error: %s", e)
|
|
591
|
-
raise e
|
|
592
|
-
try:
|
|
593
|
-
mod, c_a = mod.uncurry()
|
|
594
|
-
except ValueError as e: # pragma: no cover
|
|
595
|
-
log.debug("Cannot uncurry lockup puzzle: error: %s", e)
|
|
596
|
-
raise e
|
|
597
|
-
if mod != DAO_PROPOSAL_MOD:
|
|
598
|
-
raise ValueError("Not a dao proposal mod.")
|
|
599
|
-
return curried_args, c_a
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
def uncurry_lockup(lockup_puzzle: Program) -> tuple[Program, Program]:
|
|
603
|
-
try:
|
|
604
|
-
mod, curried_args = lockup_puzzle.uncurry()
|
|
605
|
-
except ValueError as e: # pragma: no cover
|
|
606
|
-
log.debug("Cannot uncurry lockup puzzle: error: %s", e)
|
|
607
|
-
raise e
|
|
608
|
-
try:
|
|
609
|
-
mod, c_a = mod.uncurry()
|
|
610
|
-
except ValueError as e: # pragma: no cover
|
|
611
|
-
log.debug("Cannot uncurry lockup puzzle: error: %s", e)
|
|
612
|
-
raise e
|
|
613
|
-
if mod != DAO_LOCKUP_MOD:
|
|
614
|
-
log.debug("Puzzle is not a dao cat lockup mod")
|
|
615
|
-
return curried_args, c_a
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
# This is the proposed puzzle
|
|
619
|
-
def get_proposal_args(puzzle: Program) -> tuple[ProposalType, Program]:
|
|
620
|
-
try:
|
|
621
|
-
mod, curried_args = puzzle.uncurry()
|
|
622
|
-
except ValueError as e: # pragma: no cover
|
|
623
|
-
log.debug("Cannot uncurry spend puzzle: error: %s", e)
|
|
624
|
-
raise e
|
|
625
|
-
if mod == SPEND_P2_SINGLETON_MOD:
|
|
626
|
-
return ProposalType.SPEND, curried_args
|
|
627
|
-
elif mod == DAO_UPDATE_PROPOSAL_MOD:
|
|
628
|
-
return ProposalType.UPDATE, curried_args
|
|
629
|
-
else:
|
|
630
|
-
raise ValueError("Unrecognised proposal type")
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
def generate_cat_tail(genesis_coin_id: bytes32, treasury_id: bytes32) -> Program:
|
|
634
|
-
dao_cat_launcher = create_cat_launcher_for_singleton_id(treasury_id).get_tree_hash()
|
|
635
|
-
puzzle = DAO_CAT_TAIL.curry(genesis_coin_id, dao_cat_launcher)
|
|
636
|
-
return puzzle
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
def curry_singleton(singleton_id: bytes32, innerpuz: Program) -> Program:
|
|
640
|
-
singleton_struct = Program.to((SINGLETON_MOD_HASH, (singleton_id, SINGLETON_LAUNCHER_HASH)))
|
|
641
|
-
return SINGLETON_MOD.curry(singleton_struct, innerpuz)
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
# This is for use in the WalletStateManager to determine the type of coin received
|
|
645
|
-
def match_treasury_puzzle(mod: Program, curried_args: Program) -> Optional[Iterator[Program]]:
|
|
646
|
-
"""
|
|
647
|
-
Given a puzzle test if it's a Treasury, if it is, return the curried arguments
|
|
648
|
-
:param mod: Puzzle
|
|
649
|
-
:param curried_args: Puzzle
|
|
650
|
-
:return: Curried parameters
|
|
651
|
-
"""
|
|
652
|
-
try:
|
|
653
|
-
if mod == SINGLETON_MOD:
|
|
654
|
-
mod, curried_args = curried_args.rest().first().uncurry()
|
|
655
|
-
if mod == DAO_TREASURY_MOD:
|
|
656
|
-
return curried_args.first().as_iter()
|
|
657
|
-
except ValueError: # pragma: no cover
|
|
658
|
-
# We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
|
|
659
|
-
pass
|
|
660
|
-
return None
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
# This is for use in the WalletStateManager to determine the type of coin received
|
|
664
|
-
def match_proposal_puzzle(mod: Program, curried_args: Program) -> Optional[Iterator[Program]]:
|
|
665
|
-
"""
|
|
666
|
-
Given a puzzle test if it's a Proposal, if it is, return the curried arguments
|
|
667
|
-
:param curried_args: Puzzle
|
|
668
|
-
:return: Curried parameters
|
|
669
|
-
"""
|
|
670
|
-
try:
|
|
671
|
-
if mod == SINGLETON_MOD:
|
|
672
|
-
c_a, curried_args = uncurry_proposal(curried_args.rest().first())
|
|
673
|
-
assert c_a is not None and curried_args is not None
|
|
674
|
-
ret = chain(c_a.as_iter(), curried_args.as_iter())
|
|
675
|
-
return ret
|
|
676
|
-
except ValueError:
|
|
677
|
-
# We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
|
|
678
|
-
pass
|
|
679
|
-
return None
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
def match_finished_puzzle(mod: Program, curried_args: Program) -> Optional[Iterator[Program]]:
|
|
683
|
-
"""
|
|
684
|
-
Given a puzzle test if it's a Proposal, if it is, return the curried arguments
|
|
685
|
-
:param curried_args: Puzzle
|
|
686
|
-
:return: Curried parameters
|
|
687
|
-
"""
|
|
688
|
-
try:
|
|
689
|
-
if mod == SINGLETON_MOD:
|
|
690
|
-
mod, curried_args = curried_args.rest().first().uncurry()
|
|
691
|
-
if mod == DAO_FINISHED_STATE:
|
|
692
|
-
return curried_args.as_iter()
|
|
693
|
-
except ValueError: # pragma: no cover
|
|
694
|
-
# We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
|
|
695
|
-
pass
|
|
696
|
-
return None
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
# This is used in WSM to determine whether we have a dao funding spend
|
|
700
|
-
def match_funding_puzzle(
|
|
701
|
-
uncurried: UncurriedPuzzle, solution: Program, coin: Coin, dao_ids: list[bytes32] = []
|
|
702
|
-
) -> Optional[bool]:
|
|
703
|
-
if not dao_ids:
|
|
704
|
-
return None
|
|
705
|
-
try:
|
|
706
|
-
if uncurried.mod == CAT_MOD:
|
|
707
|
-
conditions = solution.at("frfr").as_iter()
|
|
708
|
-
elif uncurried.mod == MOD:
|
|
709
|
-
conditions = solution.at("rfr").as_iter()
|
|
710
|
-
elif uncurried.mod == SINGLETON_MOD:
|
|
711
|
-
inner_puz, _ = uncurried.args.at("rf").uncurry()
|
|
712
|
-
if inner_puz == DAO_TREASURY_MOD:
|
|
713
|
-
delegated_puz = solution.at("rrfrrf")
|
|
714
|
-
_delegated_mod, delegated_args = delegated_puz.uncurry()
|
|
715
|
-
if delegated_puz.uncurry()[0] == SPEND_P2_SINGLETON_MOD:
|
|
716
|
-
if coin.puzzle_hash == delegated_args.at("rrrrf").as_atom(): # pragma: no cover
|
|
717
|
-
return True
|
|
718
|
-
return None # pragma: no cover
|
|
719
|
-
else:
|
|
720
|
-
return None
|
|
721
|
-
fund_puzhashes = [get_p2_singleton_puzhash(dao_id) for dao_id in dao_ids]
|
|
722
|
-
for cond in conditions:
|
|
723
|
-
if (cond.list_len() == 4) and (cond.first().as_int() == 51):
|
|
724
|
-
if cond.at("rrrff") in fund_puzhashes:
|
|
725
|
-
return True
|
|
726
|
-
except (ValueError, EvalError):
|
|
727
|
-
# We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
|
|
728
|
-
pass
|
|
729
|
-
return None
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
def match_dao_cat_puzzle(uncurried: UncurriedPuzzle) -> Optional[Iterator[Program]]:
|
|
733
|
-
try:
|
|
734
|
-
if uncurried.mod == CAT_MOD:
|
|
735
|
-
arg_list = list(uncurried.args.as_iter())
|
|
736
|
-
inner_puz = get_innerpuz_from_lockup_puzzle(uncurried.args.at("rrf"))
|
|
737
|
-
if inner_puz is not None:
|
|
738
|
-
dao_cat_args: Iterator[Program] = Program.to(arg_list).as_iter()
|
|
739
|
-
return dao_cat_args
|
|
740
|
-
except ValueError:
|
|
741
|
-
# We just pass here to prevent spamming logs with error messages when WSM checks incoming coins
|
|
742
|
-
pass
|
|
743
|
-
return None
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
def generate_simple_proposal_innerpuz(
|
|
747
|
-
treasury_id: bytes32,
|
|
748
|
-
recipient_puzhashes: list[bytes32],
|
|
749
|
-
amounts: list[uint64],
|
|
750
|
-
asset_types: list[Optional[bytes32]] = [None],
|
|
751
|
-
) -> Program:
|
|
752
|
-
if len(recipient_puzhashes) != len(amounts) != len(asset_types): # pragma: no cover
|
|
753
|
-
raise ValueError("Mismatch in the number of recipients, amounts, or asset types")
|
|
754
|
-
xch_conds: list[Any] = []
|
|
755
|
-
cat_conds: list[Any] = []
|
|
756
|
-
seen_assets = set()
|
|
757
|
-
for recipient_puzhash, amount, asset_type in zip(recipient_puzhashes, amounts, asset_types):
|
|
758
|
-
if asset_type:
|
|
759
|
-
if asset_type in seen_assets:
|
|
760
|
-
asset_conds = next(x for x in cat_conds if x[0] == asset_type)
|
|
761
|
-
asset_conds[1].append([51, recipient_puzhash, amount, [recipient_puzhash]])
|
|
762
|
-
else:
|
|
763
|
-
cat_conds.append([asset_type, [[51, recipient_puzhash, amount, [recipient_puzhash]]]])
|
|
764
|
-
seen_assets.add(asset_type)
|
|
765
|
-
else:
|
|
766
|
-
xch_conds.append([51, recipient_puzhash, amount])
|
|
767
|
-
puzzle = get_spend_p2_singleton_puzzle(treasury_id, Program.to(xch_conds), Program.to(cat_conds))
|
|
768
|
-
return puzzle
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
async def generate_update_proposal_innerpuz(
|
|
772
|
-
current_treasury_innerpuz: Program,
|
|
773
|
-
new_dao_rules: DAORules,
|
|
774
|
-
new_proposal_validator: Optional[Program] = None,
|
|
775
|
-
) -> Program:
|
|
776
|
-
if not new_proposal_validator:
|
|
777
|
-
assert isinstance(current_treasury_innerpuz, Program)
|
|
778
|
-
new_proposal_validator = get_proposal_validator(
|
|
779
|
-
current_treasury_innerpuz, new_dao_rules.proposal_minimum_amount
|
|
780
|
-
)
|
|
781
|
-
return get_update_proposal_puzzle(new_dao_rules, new_proposal_validator)
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
async def generate_mint_proposal_innerpuz(
|
|
785
|
-
treasury_id: bytes32,
|
|
786
|
-
cat_tail_hash: bytes32,
|
|
787
|
-
amount_of_cats_to_create: uint64,
|
|
788
|
-
cats_new_innerpuzhash: bytes32,
|
|
789
|
-
) -> Program:
|
|
790
|
-
if amount_of_cats_to_create % 2 == 1: # pragma: no cover
|
|
791
|
-
raise ValueError("Minting proposals must mint an even number of CATs")
|
|
792
|
-
cat_launcher = create_cat_launcher_for_singleton_id(treasury_id)
|
|
793
|
-
|
|
794
|
-
# cat_wallet: CATWallet = self.wallet_state_manager.wallets[self.dao_info.cat_wallet_id]
|
|
795
|
-
# cat_tail_hash = cat_wallet.cat_info.limitations_program_hash
|
|
796
|
-
eve_puz_hash = curry_cat_eve(cats_new_innerpuzhash)
|
|
797
|
-
full_puz = construct_cat_puzzle(CAT_MOD, cat_tail_hash, eve_puz_hash)
|
|
798
|
-
xch_conditions = [
|
|
799
|
-
[
|
|
800
|
-
51,
|
|
801
|
-
cat_launcher.get_tree_hash(),
|
|
802
|
-
uint64(amount_of_cats_to_create),
|
|
803
|
-
[cats_new_innerpuzhash],
|
|
804
|
-
], # create cat_launcher coin
|
|
805
|
-
[
|
|
806
|
-
60,
|
|
807
|
-
Program.to([ProposalType.MINT.value, full_puz.get_tree_hash()]).get_tree_hash(),
|
|
808
|
-
], # make an announcement for the launcher to assert
|
|
809
|
-
]
|
|
810
|
-
puzzle = get_spend_p2_singleton_puzzle(treasury_id, Program.to(xch_conditions), Program.to([]))
|
|
811
|
-
return puzzle
|