chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +59 -30
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +225 -62
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +963 -839
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +8 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +14 -14
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +372 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +16 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +42 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +34 -13
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +3 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +22 -8
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +120 -105
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from collections.abc import Callable
|
|
3
4
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
5
6
|
|
|
6
7
|
from chia_rs import CoinSpend
|
|
7
8
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -22,13 +23,13 @@ from chia.wallet.uncurried_puzzle import UncurriedPuzzle, uncurry_puzzle
|
|
|
22
23
|
|
|
23
24
|
@dataclass(frozen=True)
|
|
24
25
|
class SingletonOuterPuzzle:
|
|
25
|
-
_match: Callable[[UncurriedPuzzle],
|
|
26
|
+
_match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
|
|
26
27
|
_construct: Callable[[PuzzleInfo, Program], Program]
|
|
27
28
|
_solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
|
|
28
|
-
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle,
|
|
29
|
-
_get_inner_solution: Callable[[PuzzleInfo, Program],
|
|
29
|
+
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
|
|
30
|
+
_get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
|
|
30
31
|
|
|
31
|
-
def match(self, puzzle: UncurriedPuzzle) ->
|
|
32
|
+
def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
|
|
32
33
|
matched, curried_args = match_singleton_puzzle(puzzle)
|
|
33
34
|
if matched:
|
|
34
35
|
singleton_struct, inner_puzzle = curried_args
|
|
@@ -52,7 +53,7 @@ class SingletonOuterPuzzle:
|
|
|
52
53
|
else:
|
|
53
54
|
return None
|
|
54
55
|
|
|
55
|
-
def asset_id(self, constructor: PuzzleInfo) ->
|
|
56
|
+
def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
|
|
56
57
|
return bytes32(constructor["launcher_id"])
|
|
57
58
|
|
|
58
59
|
def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
|
|
@@ -63,25 +64,25 @@ class SingletonOuterPuzzle:
|
|
|
63
64
|
return puzzle_for_singleton(constructor["launcher_id"], inner_puzzle, launcher_hash)
|
|
64
65
|
|
|
65
66
|
def get_inner_puzzle(
|
|
66
|
-
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution:
|
|
67
|
-
) ->
|
|
67
|
+
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
|
|
68
|
+
) -> Program | None:
|
|
68
69
|
matched, curried_args = match_singleton_puzzle(puzzle_reveal)
|
|
69
70
|
if matched:
|
|
70
71
|
_, inner_puzzle = curried_args
|
|
71
72
|
also = constructor.also()
|
|
72
73
|
if also is not None:
|
|
73
|
-
deep_inner_puzzle:
|
|
74
|
+
deep_inner_puzzle: Program | None = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
|
|
74
75
|
return deep_inner_puzzle
|
|
75
76
|
else:
|
|
76
77
|
return inner_puzzle
|
|
77
78
|
else:
|
|
78
79
|
raise ValueError("This driver is not for the specified puzzle reveal")
|
|
79
80
|
|
|
80
|
-
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) ->
|
|
81
|
+
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
|
|
81
82
|
my_inner_solution: Program = solution.at("rrf")
|
|
82
83
|
also = constructor.also()
|
|
83
84
|
if also:
|
|
84
|
-
deep_inner_solution:
|
|
85
|
+
deep_inner_solution: Program | None = self._get_inner_solution(also, my_inner_solution)
|
|
85
86
|
return deep_inner_solution
|
|
86
87
|
else:
|
|
87
88
|
return my_inner_solution
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from collections.abc import Callable
|
|
3
4
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Callable, Optional
|
|
5
5
|
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint16
|
|
@@ -30,7 +30,7 @@ def puzzle_for_transfer_program(launcher_id: bytes32, royalty_puzzle_hash: bytes
|
|
|
30
30
|
|
|
31
31
|
def solution_for_transfer_program(
|
|
32
32
|
conditions: Program,
|
|
33
|
-
current_owner:
|
|
33
|
+
current_owner: bytes32 | None,
|
|
34
34
|
new_did: bytes32,
|
|
35
35
|
new_did_inner_hash: bytes32,
|
|
36
36
|
trade_prices_list: Program,
|
|
@@ -40,13 +40,13 @@ def solution_for_transfer_program(
|
|
|
40
40
|
|
|
41
41
|
@dataclass(frozen=True)
|
|
42
42
|
class TransferProgramPuzzle:
|
|
43
|
-
_match: Callable[[UncurriedPuzzle],
|
|
43
|
+
_match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
|
|
44
44
|
_construct: Callable[[PuzzleInfo, Program], Program]
|
|
45
45
|
_solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
|
|
46
|
-
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle,
|
|
47
|
-
_get_inner_solution: Callable[[PuzzleInfo, Program],
|
|
46
|
+
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
|
|
47
|
+
_get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
|
|
48
48
|
|
|
49
|
-
def match(self, puzzle: UncurriedPuzzle) ->
|
|
49
|
+
def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
|
|
50
50
|
matched, curried_args = match_transfer_program_puzzle(puzzle)
|
|
51
51
|
if matched:
|
|
52
52
|
singleton_struct, royalty_puzzle_hash, percentage = curried_args
|
|
@@ -60,7 +60,7 @@ class TransferProgramPuzzle:
|
|
|
60
60
|
else:
|
|
61
61
|
return None
|
|
62
62
|
|
|
63
|
-
def asset_id(self, constructor: PuzzleInfo) ->
|
|
63
|
+
def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
|
|
64
64
|
return None
|
|
65
65
|
|
|
66
66
|
def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
|
|
@@ -69,12 +69,12 @@ class TransferProgramPuzzle:
|
|
|
69
69
|
)
|
|
70
70
|
|
|
71
71
|
def get_inner_puzzle(
|
|
72
|
-
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution:
|
|
73
|
-
) ->
|
|
72
|
+
self, constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
|
|
73
|
+
) -> Program | None:
|
|
74
74
|
return None
|
|
75
75
|
|
|
76
|
-
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) ->
|
|
76
|
+
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
|
|
77
77
|
return None
|
|
78
78
|
|
|
79
79
|
def solve(self, constructor: PuzzleInfo, solver: Solver, inner_puzzle: Program, inner_solution: Program) -> Program:
|
|
80
|
-
return Program.
|
|
80
|
+
return Program.NIL
|
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
from chia_rs import CoinSpend, CoinState
|
|
8
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -66,28 +65,28 @@ class UncurriedNFT(Streamable):
|
|
|
66
65
|
"""p2 puzzle of the owner, either for ownership layer or standard"""
|
|
67
66
|
|
|
68
67
|
# ownership layer fields
|
|
69
|
-
owner_did:
|
|
68
|
+
owner_did: bytes32 | None
|
|
70
69
|
"""Owner's DID"""
|
|
71
70
|
|
|
72
71
|
supports_did: bool
|
|
73
72
|
"""If the inner puzzle support the DID"""
|
|
74
73
|
|
|
75
|
-
nft_inner_puzzle_hash:
|
|
74
|
+
nft_inner_puzzle_hash: bytes32 | None
|
|
76
75
|
"""Puzzle hash of the ownership layer inner puzzle """
|
|
77
76
|
|
|
78
|
-
transfer_program:
|
|
77
|
+
transfer_program: Program | None
|
|
79
78
|
"""Puzzle hash of the transfer program"""
|
|
80
79
|
|
|
81
|
-
transfer_program_curry_params:
|
|
80
|
+
transfer_program_curry_params: Program | None
|
|
82
81
|
"""
|
|
83
82
|
Curried parameters of the transfer program
|
|
84
83
|
[royalty_address, trade_price_percentage, settlement_mod_hash, cat_mod_hash]
|
|
85
84
|
"""
|
|
86
|
-
royalty_address:
|
|
87
|
-
trade_price_percentage:
|
|
85
|
+
royalty_address: bytes32 | None
|
|
86
|
+
trade_price_percentage: uint16 | None
|
|
88
87
|
|
|
89
88
|
@classmethod
|
|
90
|
-
def uncurry(cls, mod: Program, curried_args: Program) ->
|
|
89
|
+
def uncurry(cls, mod: Program, curried_args: Program) -> Self | None:
|
|
91
90
|
"""
|
|
92
91
|
Try to uncurry a NFT puzzle
|
|
93
92
|
:param cls UncurriedNFT class
|
|
@@ -140,11 +139,11 @@ class UncurriedNFT(Streamable):
|
|
|
140
139
|
edition_number = kv_pair.rest()
|
|
141
140
|
if kv_pair.first().as_atom() == b"st":
|
|
142
141
|
edition_total = kv_pair.rest()
|
|
143
|
-
current_did:
|
|
142
|
+
current_did: bytes32 | None = None
|
|
144
143
|
transfer_program = None
|
|
145
144
|
transfer_program_args = None
|
|
146
|
-
royalty_address:
|
|
147
|
-
royalty_percentage:
|
|
145
|
+
royalty_address: bytes32 | None = None
|
|
146
|
+
royalty_percentage: uint16 | None = None
|
|
148
147
|
nft_inner_puzzle_mod = None
|
|
149
148
|
mod, ol_args = inner_puzzle.uncurry()
|
|
150
149
|
supports_did = False
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from chia_rs import CoinSpend, CoinState, G2Element
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -29,7 +29,7 @@ class NotificationManager:
|
|
|
29
29
|
async def create(
|
|
30
30
|
wallet_state_manager: Any,
|
|
31
31
|
db_wrapper: DBWrapper2,
|
|
32
|
-
name:
|
|
32
|
+
name: str | None = None,
|
|
33
33
|
) -> NotificationManager:
|
|
34
34
|
self = NotificationManager()
|
|
35
35
|
if name:
|
|
@@ -96,7 +96,7 @@ class NotificationManager:
|
|
|
96
96
|
notification_spend = make_spend(
|
|
97
97
|
notification_coin,
|
|
98
98
|
notification_puzzle,
|
|
99
|
-
Program.
|
|
99
|
+
Program.NIL,
|
|
100
100
|
)
|
|
101
101
|
extra_spend_bundle = WalletSpendBundle([notification_spend], G2Element())
|
|
102
102
|
await self.wallet_state_manager.main_wallet.generate_signed_transaction(
|
|
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import logging
|
|
5
5
|
import sqlite3
|
|
6
|
-
from typing import Optional
|
|
7
6
|
|
|
8
7
|
from chia_rs.sized_bytes import bytes32
|
|
9
8
|
from chia_rs.sized_ints import uint32, uint64
|
|
@@ -32,7 +31,7 @@ class NotificationStore:
|
|
|
32
31
|
|
|
33
32
|
@classmethod
|
|
34
33
|
async def create(
|
|
35
|
-
cls, db_wrapper: DBWrapper2, cache_size: uint32 = uint32(600000), name:
|
|
34
|
+
cls, db_wrapper: DBWrapper2, cache_size: uint32 = uint32(600000), name: str | None = None
|
|
36
35
|
) -> NotificationStore:
|
|
37
36
|
self = cls()
|
|
38
37
|
|
|
@@ -85,58 +84,42 @@ class NotificationStore:
|
|
|
85
84
|
)
|
|
86
85
|
await cursor.close()
|
|
87
86
|
|
|
88
|
-
async def get_notifications(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
for _ in coin_ids:
|
|
94
|
-
coin_ids_str_list += "?"
|
|
95
|
-
coin_ids_str_list += ","
|
|
96
|
-
coin_ids_str_list = coin_ids_str_list[:-1] if len(coin_ids_str_list) > 1 else "("
|
|
97
|
-
coin_ids_str_list += ")"
|
|
98
|
-
|
|
99
|
-
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
100
|
-
rows = await conn.execute_fetchall(
|
|
101
|
-
f"SELECT * from notifications WHERE coin_id IN {coin_ids_str_list} ORDER BY amount DESC", coin_ids
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
return [
|
|
105
|
-
Notification(
|
|
106
|
-
bytes32(row[0]),
|
|
107
|
-
bytes(row[1]),
|
|
108
|
-
uint64.from_bytes(row[2]),
|
|
109
|
-
uint32(row[3]),
|
|
110
|
-
)
|
|
111
|
-
for row in rows
|
|
112
|
-
]
|
|
113
|
-
|
|
114
|
-
async def get_all_notifications(
|
|
115
|
-
self, pagination: Optional[tuple[Optional[int], Optional[int]]] = None
|
|
87
|
+
async def get_notifications(
|
|
88
|
+
self,
|
|
89
|
+
*,
|
|
90
|
+
coin_ids: list[bytes32] | None = None,
|
|
91
|
+
pagination: tuple[int | None, int | None] = (None, None),
|
|
116
92
|
) -> list[Notification]:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
93
|
+
if coin_ids is not None:
|
|
94
|
+
coin_ids_str_list = "("
|
|
95
|
+
for _ in coin_ids:
|
|
96
|
+
coin_ids_str_list += "?"
|
|
97
|
+
coin_ids_str_list += ","
|
|
98
|
+
coin_ids_str_list = coin_ids_str_list[:-1] if len(coin_ids_str_list) > 1 else "("
|
|
99
|
+
coin_ids_str_list += ")"
|
|
100
|
+
coin_id_filter = f"WHERE coin_id IN {coin_ids_str_list} "
|
|
101
|
+
coin_id_params = coin_ids
|
|
102
|
+
else:
|
|
103
|
+
coin_id_filter = ""
|
|
104
|
+
coin_id_params = list()
|
|
105
|
+
|
|
106
|
+
if pagination[1] is not None and pagination[0] is not None:
|
|
107
|
+
pagination_str = " LIMIT ?, ?"
|
|
108
|
+
pagination_params: tuple[int, ...] = (pagination[0], pagination[1] - pagination[0])
|
|
109
|
+
elif pagination[1] is None and pagination[0] is not None:
|
|
110
|
+
pagination_str = " LIMIT ?, (SELECT COUNT(*) from notifications)"
|
|
111
|
+
pagination_params = (pagination[0],)
|
|
112
|
+
elif pagination[1] is not None and pagination[0] is None:
|
|
113
|
+
pagination_str = " LIMIT ?"
|
|
114
|
+
pagination_params = (pagination[1],)
|
|
133
115
|
else:
|
|
134
116
|
pagination_str = ""
|
|
135
117
|
pagination_params = tuple()
|
|
136
118
|
|
|
137
119
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
138
120
|
rows = await conn.execute_fetchall(
|
|
139
|
-
f"SELECT * from notifications ORDER BY amount DESC{pagination_str}",
|
|
121
|
+
f"SELECT * from notifications {coin_id_filter}ORDER BY amount DESC{pagination_str}",
|
|
122
|
+
(*coin_id_params, *pagination_params),
|
|
140
123
|
)
|
|
141
124
|
|
|
142
125
|
return [
|
|
@@ -149,23 +132,23 @@ class NotificationStore:
|
|
|
149
132
|
for row in rows
|
|
150
133
|
]
|
|
151
134
|
|
|
152
|
-
async def delete_notifications(self, coin_ids: list[bytes32]) -> None:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
135
|
+
async def delete_notifications(self, *, coin_ids: list[bytes32] | None = None) -> None:
|
|
136
|
+
if coin_ids is not None:
|
|
137
|
+
coin_ids_str_list = "("
|
|
138
|
+
for _ in coin_ids:
|
|
139
|
+
coin_ids_str_list += "?"
|
|
140
|
+
coin_ids_str_list += ","
|
|
141
|
+
coin_ids_str_list = coin_ids_str_list[:-1] if len(coin_ids_str_list) > 1 else "("
|
|
142
|
+
coin_ids_str_list += ")"
|
|
143
|
+
coin_id_filter = f"WHERE coin_id IN {coin_ids_str_list} "
|
|
144
|
+
coin_id_params = coin_ids
|
|
145
|
+
else:
|
|
146
|
+
coin_id_filter = ""
|
|
147
|
+
coin_id_params = list()
|
|
164
148
|
|
|
165
|
-
async def delete_all_notifications(self) -> None:
|
|
166
149
|
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
167
150
|
# Delete from storage
|
|
168
|
-
cursor = await conn.execute("DELETE FROM notifications")
|
|
151
|
+
cursor = await conn.execute(f"DELETE FROM notifications {coin_id_filter}", coin_id_params)
|
|
169
152
|
await cursor.close()
|
|
170
153
|
|
|
171
154
|
async def notification_exists(self, id: bytes32) -> bool:
|
chia/wallet/outer_puzzles.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from enum import Enum
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from chia_rs.sized_bytes import bytes32
|
|
7
6
|
|
|
@@ -47,9 +46,9 @@ class AssetType(Enum):
|
|
|
47
46
|
REVOCATION_LAYER = "revocation layer"
|
|
48
47
|
|
|
49
48
|
|
|
50
|
-
def match_puzzle(puzzle: UncurriedPuzzle) ->
|
|
49
|
+
def match_puzzle(puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
|
|
51
50
|
for driver in driver_lookup.values():
|
|
52
|
-
potential_info:
|
|
51
|
+
potential_info: PuzzleInfo | None = driver.match(puzzle)
|
|
53
52
|
if potential_info is not None:
|
|
54
53
|
return potential_info
|
|
55
54
|
return None
|
|
@@ -64,16 +63,16 @@ def solve_puzzle(constructor: PuzzleInfo, solver: Solver, inner_puzzle: Program,
|
|
|
64
63
|
|
|
65
64
|
|
|
66
65
|
def get_inner_puzzle(
|
|
67
|
-
constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution:
|
|
68
|
-
) ->
|
|
66
|
+
constructor: PuzzleInfo, puzzle_reveal: UncurriedPuzzle, solution: Program | None = None
|
|
67
|
+
) -> Program | None:
|
|
69
68
|
return driver_lookup[AssetType(constructor.type())].get_inner_puzzle(constructor, puzzle_reveal, solution)
|
|
70
69
|
|
|
71
70
|
|
|
72
|
-
def get_inner_solution(constructor: PuzzleInfo, solution: Program) ->
|
|
71
|
+
def get_inner_solution(constructor: PuzzleInfo, solution: Program) -> Program | None:
|
|
73
72
|
return driver_lookup[AssetType(constructor.type())].get_inner_solution(constructor, solution)
|
|
74
73
|
|
|
75
74
|
|
|
76
|
-
def create_asset_id(constructor: PuzzleInfo) ->
|
|
75
|
+
def create_asset_id(constructor: PuzzleInfo) -> bytes32 | None:
|
|
77
76
|
return driver_lookup[AssetType(constructor.type())].asset_id(constructor)
|
|
78
77
|
|
|
79
78
|
|
chia/wallet/puzzle_drivers.py
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
from typing import Any, Optional
|
|
3
|
+
from typing import Any
|
|
5
4
|
|
|
6
5
|
from clvm.SExp import SExp
|
|
7
6
|
from clvm_tools.binutils import assemble, type_for_atom
|
|
8
7
|
from ir.Type import Type
|
|
8
|
+
from typing_extensions import Self
|
|
9
9
|
|
|
10
10
|
from chia.types.blockchain_format.program import Program
|
|
11
11
|
from chia.util.casts import int_from_bytes
|
|
@@ -17,7 +17,6 @@ When you access a value in the dictionary, it will be deserialized to a str, int
|
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
@dataclass(frozen=True)
|
|
21
20
|
class PuzzleInfo:
|
|
22
21
|
"""
|
|
23
22
|
There are two 'magic' keys in a PuzzleInfo object:
|
|
@@ -27,6 +26,10 @@ class PuzzleInfo:
|
|
|
27
26
|
|
|
28
27
|
info: dict[str, Any]
|
|
29
28
|
|
|
29
|
+
def __init__(self, info: dict[str, Any]) -> None:
|
|
30
|
+
self.info = info
|
|
31
|
+
self.__post_init__()
|
|
32
|
+
|
|
30
33
|
def __post_init__(self) -> None:
|
|
31
34
|
if "type" not in self.info:
|
|
32
35
|
raise ValueError("A type is required to initialize a puzzle driver")
|
|
@@ -53,7 +56,7 @@ class PuzzleInfo:
|
|
|
53
56
|
def type(self) -> str:
|
|
54
57
|
return str(self.info["type"])
|
|
55
58
|
|
|
56
|
-
def also(self) ->
|
|
59
|
+
def also(self) -> PuzzleInfo | None:
|
|
57
60
|
if "also" in self.info:
|
|
58
61
|
return PuzzleInfo(self.info["also"])
|
|
59
62
|
else:
|
|
@@ -74,11 +77,25 @@ class PuzzleInfo:
|
|
|
74
77
|
else:
|
|
75
78
|
return False
|
|
76
79
|
|
|
80
|
+
# Methods to make this a valid Streamable member
|
|
81
|
+
# Should not be being serialized as bytes
|
|
82
|
+
stream = None
|
|
83
|
+
parse = None
|
|
84
|
+
|
|
85
|
+
def to_json_dict(self) -> dict[str, Any]:
|
|
86
|
+
return self.info
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def from_json_dict(cls, json_dict: dict[str, Any]) -> Self:
|
|
90
|
+
return cls(json_dict)
|
|
91
|
+
|
|
77
92
|
|
|
78
|
-
@dataclass(frozen=True)
|
|
79
93
|
class Solver:
|
|
80
94
|
info: dict[str, Any]
|
|
81
95
|
|
|
96
|
+
def __init__(self, info: dict[str, Any]) -> None:
|
|
97
|
+
self.info = info
|
|
98
|
+
|
|
82
99
|
def __getitem__(self, item: str) -> Any:
|
|
83
100
|
value = self.info[item]
|
|
84
101
|
return decode_info_value(Solver, value)
|
|
@@ -92,6 +109,17 @@ class Solver:
|
|
|
92
109
|
return False
|
|
93
110
|
return True
|
|
94
111
|
|
|
112
|
+
# Methods to make this a valid Streamable member
|
|
113
|
+
stream = None
|
|
114
|
+
parse = None
|
|
115
|
+
|
|
116
|
+
def to_json_dict(self) -> dict[str, Any]:
|
|
117
|
+
return self.info
|
|
118
|
+
|
|
119
|
+
@classmethod
|
|
120
|
+
def from_json_dict(cls, json_dict: dict[str, Any]) -> Self:
|
|
121
|
+
return cls(json_dict)
|
|
122
|
+
|
|
95
123
|
|
|
96
124
|
def decode_info_value(cls: Any, value: Any) -> Any:
|
|
97
125
|
if isinstance(value, dict):
|
|
@@ -101,7 +129,7 @@ def decode_info_value(cls: Any, value: Any) -> Any:
|
|
|
101
129
|
elif isinstance(value, Program) and value.atom is None:
|
|
102
130
|
return value
|
|
103
131
|
else:
|
|
104
|
-
if value
|
|
132
|
+
if value in {"()", ""}: # special case
|
|
105
133
|
return Program.to([])
|
|
106
134
|
expression: SExp = assemble(value)
|
|
107
135
|
if expression.atom is None:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from chia_puzzles_py.programs import (
|
|
7
7
|
AUGMENTED_CONDITION as AUGMENTED_CONDITION_BYTES,
|
|
@@ -43,7 +43,7 @@ AUGMENTED_CONDITION_HASH = bytes32(AUGMENTED_CONDITION_HASH_BYTES)
|
|
|
43
43
|
log = logging.getLogger(__name__)
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
def create_augmented_cond_puzzle(condition: list[
|
|
46
|
+
def create_augmented_cond_puzzle(condition: list[int | uint64], puzzle: Program) -> Program:
|
|
47
47
|
return AUGMENTED_CONDITION.curry(condition, puzzle)
|
|
48
48
|
|
|
49
49
|
|
|
@@ -137,9 +137,9 @@ def create_merkle_solution(
|
|
|
137
137
|
|
|
138
138
|
def match_clawback_puzzle(
|
|
139
139
|
uncurried: UncurriedPuzzle,
|
|
140
|
-
inner_puzzle:
|
|
141
|
-
inner_solution:
|
|
142
|
-
) ->
|
|
140
|
+
inner_puzzle: Program | SerializedProgram,
|
|
141
|
+
inner_solution: Program | SerializedProgram,
|
|
142
|
+
) -> ClawbackMetadata | None:
|
|
143
143
|
# Check if the inner puzzle is a P2 puzzle
|
|
144
144
|
if MOD != uncurried.mod:
|
|
145
145
|
return None
|
|
@@ -153,7 +153,7 @@ def match_clawback_puzzle(
|
|
|
153
153
|
inner_solution,
|
|
154
154
|
DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM // 8,
|
|
155
155
|
)
|
|
156
|
-
metadata:
|
|
156
|
+
metadata: ClawbackMetadata | None = None
|
|
157
157
|
new_puzhash: set[bytes32] = set()
|
|
158
158
|
if conditions is not None:
|
|
159
159
|
for condition in conditions:
|
|
@@ -1,57 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
"augmented_condition": "d303eafa617bedf0bc05850dd014e10fbddf622187dc07891a2aacba9d8a93f6",
|
|
3
|
-
"block_program_zero": "f0a38c8efe58895ae527c65c37f700a4238504691b83990e5dd91bd8b3c30eae",
|
|
4
|
-
"cat_v2": "37bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7a",
|
|
5
|
-
"chialisp_deserialisation": "94ec19077f9a34e0b11ad2456af0170f4cc03f11230ca42e3f82e6e644ac4f5d",
|
|
6
|
-
"conditions_w_fee_announce": "1a169582dc619f2542f8eb79f02823e1595ba0aca53820f503eda5ff20b47856",
|
|
7
|
-
"covenant_layer": "b982796850336aabf9ab17c3f21e299f0c633444117ab5e9ebeafadf1860d9fc",
|
|
8
|
-
"create_nft_launcher_from_did": "7a32d2d9571d3436791c0ad3d7fcfdb9c43ace2b0f0ff13f98d29f0cc093f445",
|
|
9
|
-
"credential_restriction": "2fdfc1f058cfd65e7ec4e253bfeb394da163ecd0036f508df8629b0a2b8fde96",
|
|
10
|
-
"decompress_coin_spend_entry": "9d98ed08770d31be4bd1bde4705dab388db5e7e9c349f5a76fc3c347aa3a0b79",
|
|
11
|
-
"decompress_coin_spend_entry_with_prefix": "92aa4bc8060a8836355a1884075141b4791ce1b67ae6092bb166b2845954bc89",
|
|
12
|
-
"decompress_puzzle": "fe94c58f1117afe315e0450daca1c62460ec1a1c439cd4018d79967a5d7d1370",
|
|
13
|
-
"delegated_tail": "999c3696e167f8a79d938adc11feba3a3dcb39ccff69a426d570706e7b8ec399",
|
|
14
|
-
"did_innerpuz": "33143d2bef64f14036742673afd158126b94284b4530a28c354fac202b0c910e",
|
|
15
|
-
"eml_covenant_morpher": "6a87946257f555ae82aca6a11b5205058b844f634ecb6c7dc6b0c54eb2996308",
|
|
16
|
-
"eml_transfer_program_covenant_adapter": "4218fbebbb6f3c0907ebe8a672fa5d1e4bc655645a3a0073601e6c9b50b07c47",
|
|
17
|
-
"eml_update_metadata_with_DID": "d3a9a1fc20f247d009b4b0e941707d50b91885c99d0b27ef882e1294e771139d",
|
|
18
|
-
"everything_with_signature": "1720d13250a7c16988eaf530331cefa9dd57a76b2c82236bec8bbbff91499b89",
|
|
19
|
-
"exigent_metadata_layer": "d5fd32e069fda83e230ccd8f6a7c4f652231aed5c755514b3d996cbeff4182b8",
|
|
20
|
-
"flag_proofs_checker": "fe2e3c631562fbb9be095297f762bf573705a0197164e9361ad5d50e045ba241",
|
|
21
|
-
"genesis_by_coin_id": "493afb89eed93ab86741b2aa61b8f5de495d33ff9b781dfc8919e602b2afa150",
|
|
22
|
-
"genesis_by_coin_id_or_singleton": "40170305e3a71c3e7523f37fbcfc3188f9f949da0818a6331f28251e76e8c56f",
|
|
23
|
-
"genesis_by_puzzle_hash": "de5a6e06d41518be97ff6365694f4f89475dda773dede267caa33da63b434e36",
|
|
24
|
-
"graftroot_dl_offers": "0893e36a88c064fddfa6f8abdb42c044584a98cb4273b80cccc83b4867b701a1",
|
|
25
|
-
"nft_intermediate_launcher": "7a32d2d9571d3436791c0ad3d7fcfdb9c43ace2b0f0ff13f98d29f0cc093f445",
|
|
26
|
-
"nft_metadata_updater_default": "fe8a4b4e27a2e29a4d3fc7ce9d527adbcaccbab6ada3903ccf3ba9a769d2d78b",
|
|
27
|
-
"nft_metadata_updater_updateable": "0b1ffba1601777c06b78ab38636e9624f2f8da73be9b36e0ce17c8d8ef3bad9f",
|
|
28
|
-
"nft_ownership_layer": "c5abea79afaa001b5427dfa0c8cf42ca6f38f5841b78f9b3c252733eb2de2726",
|
|
29
|
-
"nft_ownership_transfer_program_one_way_claim_with_royalties": "025dee0fb1e9fa110302a7e9bfb6e381ca09618e2778b0184fa5c6b275cfce1f",
|
|
30
|
-
"nft_state_layer": "a04d9f57764f54a43e4030befb4d80026e870519aaa66334aef8304f5d0393c2",
|
|
31
|
-
"notification": "b8b9d8ffca6d5cba5422ead7f477ecfc8f6aaaa1c024b8c3aeb1956b24a0ab1e",
|
|
32
|
-
"p2_1_of_n": "46b29fd87fbeb6737600c4543931222a6c1ed3db6fa5601a3ca284a9f4efe780",
|
|
33
|
-
"p2_announced_delegated_puzzle": "c4d24c3c5349376f3e8f3aba202972091713b4ec4915f0f26192ae4ace0bd04d",
|
|
34
|
-
"p2_conditions": "1c77d7d5efde60a7a1d2d27db6d746bc8e568aea1ef8586ca967a0d60b83cc36",
|
|
35
|
-
"p2_delegated_conditions": "0ff94726f1a8dea5c3f70d3121945190778d3b2b3fcda3735a1f290977e98341",
|
|
36
|
-
"p2_delegated_puzzle": "542cde70d1102cd1b763220990873efc8ab15625ded7eae22cc11e21ef2e2f7c",
|
|
37
|
-
"p2_delegated_puzzle_or_hidden_puzzle": "e9aaa49f45bad5c889b86ee3341550c155cfdd10c3a6757de618d20612fffd52",
|
|
38
|
-
"p2_m_of_n_delegate_direct": "0f199d5263ac1a62b077c159404a71abd3f9691cc57520bf1d4c5cb501504457",
|
|
39
|
-
"p2_parent": "b10ce2d0b18dcf8c21ddfaf55d9b9f0adcbf1e0beb55b1a8b9cad9bbff4e5f22",
|
|
40
|
-
"p2_puzzle_hash": "13e29a62b42cd2ef72a79e4bacdc59733ca6310d65af83d349360d36ec622363",
|
|
41
|
-
"p2_singleton": "40f828d8dd55603f4ff9fbf6b73271e904e69406982f4fbefae2c8dcceaf9834",
|
|
42
|
-
"p2_singleton_aggregator": "f79a31fcfe3736cc75720617b4cdcb4376b4b8f8f71108617710612b909a4924",
|
|
43
|
-
"p2_singleton_or_delayed_puzhash": "adb656e0211e2ab4f42069a4c5efc80dc907e7062be08bf1628c8e5b6d94d25b",
|
|
44
|
-
"p2_singleton_via_delegated_puzzle": "9590eaa169e45b655a31d3c06bbd355a3e2b2e3e410d3829748ce08ab249c39e",
|
|
45
|
-
"pool_member_innerpuz": "a8490702e333ddd831a3ac9c22d0fa26d2bfeaf2d33608deb22f0e0123eb0494",
|
|
46
|
-
"pool_waitingroom_innerpuz": "a317541a765bf8375e1c6e7c13503d0d2cbf56cacad5182befe947e78e2c0307",
|
|
47
|
-
"rom_bootstrap_generator": "161bade1f822dcd62ab712ebaf30f3922a301e48a639e4295c5685f8bece7bd9",
|
|
48
|
-
"settlement_payments": "cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7",
|
|
49
|
-
"singleton_launcher": "eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9",
|
|
50
|
-
"singleton_top_layer": "24e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fd",
|
|
51
|
-
"singleton_top_layer_v1_1": "7faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9f",
|
|
52
|
-
"standard_vc_backdoor_puzzle": "fbce76408ebaf9b3d0b8cd90cc68607755eeca67cd7432d5eea85f3f498cc002",
|
|
53
|
-
"std_parent_morpher": "8c3f1dc2e46c0d7ec4c2cbd007e23c0368ff8f80c5bc0101647a5c27626ebce6",
|
|
54
2
|
"test_generator_deserialize": "52add794fc76e89512e4a063c383418bda084c8a78c74055abe80179e4a7832c",
|
|
55
|
-
"test_multiple_generator_input_arguments": "156dafbddc3e1d3bfe1f2a84e48e5e46b287b8358bf65c3c091c93e855fbfc5b"
|
|
56
|
-
"viral_backdoor": "00848115554ea674131f89f311707a959ad3f4647482648f3fe91ba289131f51"
|
|
3
|
+
"test_multiple_generator_input_arguments": "156dafbddc3e1d3bfe1f2a84e48e5e46b287b8358bf65c3c091c93e855fbfc5b"
|
|
57
4
|
}
|
chia/wallet/puzzles/load_clvm.py
CHANGED
|
@@ -8,7 +8,7 @@ import sys
|
|
|
8
8
|
import tempfile
|
|
9
9
|
|
|
10
10
|
import importlib_resources
|
|
11
|
-
from
|
|
11
|
+
from chialisp import compile_clvm as compile_clvm_rust
|
|
12
12
|
|
|
13
13
|
from chia.types.blockchain_format.program import Program
|
|
14
14
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
@@ -60,7 +60,6 @@ from __future__ import annotations
|
|
|
60
60
|
|
|
61
61
|
import hashlib
|
|
62
62
|
from functools import lru_cache
|
|
63
|
-
from typing import Union
|
|
64
63
|
|
|
65
64
|
from chia_puzzles_py.programs import P2_DELEGATED_PUZZLE_OR_HIDDEN_PUZZLE
|
|
66
65
|
from chia_rs import G1Element, PrivateKey
|
|
@@ -79,7 +78,7 @@ MOD = Program.from_bytes(P2_DELEGATED_PUZZLE_OR_HIDDEN_PUZZLE)
|
|
|
79
78
|
|
|
80
79
|
QUOTED_MOD_HASH = calculate_hash_of_quoted_mod_hash(MOD.get_tree_hash())
|
|
81
80
|
|
|
82
|
-
PublicKeyProgram =
|
|
81
|
+
PublicKeyProgram = bytes | Program
|
|
83
82
|
|
|
84
83
|
GROUP_ORDER = 0x73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001
|
|
85
84
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from collections.abc import Iterator
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from chia_puzzles_py.programs import (
|
|
7
6
|
P2_SINGLETON,
|
|
@@ -287,8 +286,8 @@ def claim_p2_singleton(
|
|
|
287
286
|
p2_singleton_coin: Coin,
|
|
288
287
|
singleton_inner_puzhash: bytes32,
|
|
289
288
|
launcher_id: bytes32,
|
|
290
|
-
delay_time:
|
|
291
|
-
delay_ph:
|
|
289
|
+
delay_time: uint64 | None = None,
|
|
290
|
+
delay_ph: bytes32 | None = None,
|
|
292
291
|
) -> tuple[Program, Program, CoinSpend]:
|
|
293
292
|
assertion = Program.to([ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT, std_hash(p2_singleton_coin.name() + b"$")])
|
|
294
293
|
announcement = Program.to([ConditionOpcode.CREATE_PUZZLE_ANNOUNCEMENT, p2_singleton_coin.name()])
|