chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -5,12 +5,13 @@ import json
|
|
|
5
5
|
import logging
|
|
6
6
|
import math
|
|
7
7
|
import time
|
|
8
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
8
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, TypeVar, cast
|
|
9
9
|
|
|
10
10
|
from chia_rs import AugSchemeMPL, G1Element, G2Element
|
|
11
11
|
from clvm.casts import int_from_bytes, int_to_bytes
|
|
12
12
|
from typing_extensions import Unpack
|
|
13
13
|
|
|
14
|
+
import chia.server.api_protocol
|
|
14
15
|
import chia.wallet.singleton
|
|
15
16
|
from chia.protocols.wallet_protocol import CoinState
|
|
16
17
|
from chia.server.ws_connection import WSChiaConnection
|
|
@@ -81,7 +82,7 @@ class NFTWallet:
|
|
|
81
82
|
|
|
82
83
|
@classmethod
|
|
83
84
|
async def create_new_nft_wallet(
|
|
84
|
-
cls:
|
|
85
|
+
cls: type[_T_NFTWallet],
|
|
85
86
|
wallet_state_manager: Any,
|
|
86
87
|
wallet: Wallet,
|
|
87
88
|
did_id: Optional[bytes32] = None,
|
|
@@ -111,7 +112,7 @@ class NFTWallet:
|
|
|
111
112
|
|
|
112
113
|
@classmethod
|
|
113
114
|
async def create(
|
|
114
|
-
cls:
|
|
115
|
+
cls: type[_T_NFTWallet],
|
|
115
116
|
wallet_state_manager: Any,
|
|
116
117
|
wallet: Wallet,
|
|
117
118
|
wallet_info: WalletInfo,
|
|
@@ -138,22 +139,22 @@ class NFTWallet:
|
|
|
138
139
|
def get_did(self) -> Optional[bytes32]:
|
|
139
140
|
return self.did_id
|
|
140
141
|
|
|
141
|
-
async def get_confirmed_balance(self, record_list: Optional[
|
|
142
|
+
async def get_confirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
142
143
|
"""The NFT wallet doesn't really have a balance."""
|
|
143
144
|
return uint128(0)
|
|
144
145
|
|
|
145
|
-
async def get_unconfirmed_balance(self, record_list: Optional[
|
|
146
|
+
async def get_unconfirmed_balance(self, record_list: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
146
147
|
"""The NFT wallet doesn't really have a balance."""
|
|
147
148
|
return uint128(0)
|
|
148
149
|
|
|
149
|
-
async def get_spendable_balance(self, unspent_records: Optional[
|
|
150
|
+
async def get_spendable_balance(self, unspent_records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
150
151
|
"""The NFT wallet doesn't really have a balance."""
|
|
151
152
|
return uint128(0)
|
|
152
153
|
|
|
153
154
|
async def get_pending_change_balance(self) -> uint64:
|
|
154
155
|
return uint64(0)
|
|
155
156
|
|
|
156
|
-
async def get_max_send_amount(self, records: Optional[
|
|
157
|
+
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None) -> uint128:
|
|
157
158
|
"""This is the confirmed balance, which we set to 0 as the NFT wallet doesn't have one."""
|
|
158
159
|
return uint128(0)
|
|
159
160
|
|
|
@@ -191,15 +192,15 @@ class NFTWallet:
|
|
|
191
192
|
metadata, p2_puzzle_hash = get_metadata_and_phs(uncurried_nft, data.parent_coin_spend.solution)
|
|
192
193
|
self.log.debug("Got back puzhash from solution: %s", p2_puzzle_hash)
|
|
193
194
|
self.log.debug("Got back updated metadata: %s", metadata)
|
|
194
|
-
derivation_record: Optional[
|
|
195
|
-
|
|
196
|
-
)
|
|
195
|
+
derivation_record: Optional[
|
|
196
|
+
DerivationRecord
|
|
197
|
+
] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(p2_puzzle_hash)
|
|
197
198
|
self.log.debug("Record for %s is: %s", p2_puzzle_hash, derivation_record)
|
|
198
199
|
if derivation_record is None:
|
|
199
200
|
self.log.debug("Not our NFT, pointing to %s, skipping", p2_puzzle_hash)
|
|
200
201
|
return
|
|
201
202
|
p2_puzzle = puzzle_for_pk(derivation_record.pubkey)
|
|
202
|
-
launcher_coin_states:
|
|
203
|
+
launcher_coin_states: list[CoinState] = await self.wallet_state_manager.wallet_node.get_coin_state(
|
|
203
204
|
[singleton_id], peer=peer
|
|
204
205
|
)
|
|
205
206
|
assert (
|
|
@@ -291,14 +292,14 @@ class NFTWallet:
|
|
|
291
292
|
if did_wallet_info.origin_coin.name() == self.did_id:
|
|
292
293
|
return
|
|
293
294
|
self.log.info(f"No NFT, deleting wallet {self.wallet_info.name} ...")
|
|
294
|
-
await self.wallet_state_manager.
|
|
295
|
+
await self.wallet_state_manager.delete_wallet(self.wallet_info.id)
|
|
295
296
|
self.wallet_state_manager.wallets.pop(self.wallet_info.id)
|
|
296
297
|
else:
|
|
297
298
|
self.log.info("Tried removing NFT coin that doesn't exist: %s", coin.name())
|
|
298
299
|
|
|
299
300
|
async def get_did_approval_info(
|
|
300
301
|
self,
|
|
301
|
-
nft_ids:
|
|
302
|
+
nft_ids: list[bytes32],
|
|
302
303
|
action_scope: WalletActionScope,
|
|
303
304
|
did_id: Optional[bytes32] = None,
|
|
304
305
|
) -> bytes32:
|
|
@@ -334,7 +335,7 @@ class NFTWallet:
|
|
|
334
335
|
percentage: uint16 = uint16(0),
|
|
335
336
|
did_id: Optional[bytes] = None,
|
|
336
337
|
fee: uint64 = uint64(0),
|
|
337
|
-
extra_conditions:
|
|
338
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
338
339
|
) -> bytes32:
|
|
339
340
|
"""
|
|
340
341
|
This must be called under the wallet state manager lock
|
|
@@ -443,7 +444,7 @@ class NFTWallet:
|
|
|
443
444
|
uri: str,
|
|
444
445
|
action_scope: WalletActionScope,
|
|
445
446
|
fee: uint64 = uint64(0),
|
|
446
|
-
extra_conditions:
|
|
447
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
447
448
|
) -> None:
|
|
448
449
|
uncurried_nft = UncurriedNFT.uncurry(*nft_coin_info.full_puzzle.uncurry())
|
|
449
450
|
assert uncurried_nft is not None
|
|
@@ -466,7 +467,7 @@ class NFTWallet:
|
|
|
466
467
|
await self.update_coin_status(nft_coin_info.coin.name(), True)
|
|
467
468
|
self.wallet_state_manager.state_changed("nft_coin_updated", self.wallet_info.id)
|
|
468
469
|
|
|
469
|
-
async def get_current_nfts(self, start_index: int = 0, count: int = 50) ->
|
|
470
|
+
async def get_current_nfts(self, start_index: int = 0, count: int = 50) -> list[NFTCoinInfo]:
|
|
470
471
|
return await self.nft_store.get_nft_list(wallet_id=self.id(), start_index=start_index, count=count)
|
|
471
472
|
|
|
472
473
|
async def get_nft_count(self) -> int:
|
|
@@ -502,7 +503,7 @@ class NFTWallet:
|
|
|
502
503
|
else:
|
|
503
504
|
return puzzle_info
|
|
504
505
|
|
|
505
|
-
async def sign_message(self, message: str, nft: NFTCoinInfo, mode: SigningMode) ->
|
|
506
|
+
async def sign_message(self, message: str, nft: NFTCoinInfo, mode: SigningMode) -> tuple[G1Element, G2Element]:
|
|
506
507
|
uncurried_nft = UncurriedNFT.uncurry(*nft.full_puzzle.uncurry())
|
|
507
508
|
if uncurried_nft is not None:
|
|
508
509
|
p2_puzzle = uncurried_nft.p2_puzzle
|
|
@@ -527,7 +528,7 @@ class NFTWallet:
|
|
|
527
528
|
nft_id: bytes32,
|
|
528
529
|
*args: Any,
|
|
529
530
|
**kwargs: Any,
|
|
530
|
-
) ->
|
|
531
|
+
) -> set[Coin]:
|
|
531
532
|
nft_coin: Optional[NFTCoinInfo] = await self.get_nft(nft_id)
|
|
532
533
|
if nft_coin is None:
|
|
533
534
|
raise ValueError("An asset ID was specified that this wallet doesn't track")
|
|
@@ -565,21 +566,21 @@ class NFTWallet:
|
|
|
565
566
|
|
|
566
567
|
async def generate_signed_transaction(
|
|
567
568
|
self,
|
|
568
|
-
amounts:
|
|
569
|
-
puzzle_hashes:
|
|
569
|
+
amounts: list[uint64],
|
|
570
|
+
puzzle_hashes: list[bytes32],
|
|
570
571
|
action_scope: WalletActionScope,
|
|
571
572
|
fee: uint64 = uint64(0),
|
|
572
|
-
coins: Optional[
|
|
573
|
-
memos: Optional[
|
|
574
|
-
extra_conditions:
|
|
573
|
+
coins: Optional[set[Coin]] = None,
|
|
574
|
+
memos: Optional[list[list[bytes]]] = None,
|
|
575
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
575
576
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
576
577
|
) -> None:
|
|
577
578
|
nft_coin: Optional[NFTCoinInfo] = kwargs.get("nft_coin", None)
|
|
578
579
|
new_owner: Optional[bytes] = kwargs.get("new_owner", None)
|
|
579
580
|
new_did_inner_hash: Optional[bytes] = kwargs.get("new_did_inner_hash", None)
|
|
580
581
|
trade_prices_list: Optional[Program] = kwargs.get("trade_prices_list", None)
|
|
581
|
-
additional_bundles:
|
|
582
|
-
metadata_update: Optional[
|
|
582
|
+
additional_bundles: list[WalletSpendBundle] = kwargs.get("additional_bundles", [])
|
|
583
|
+
metadata_update: Optional[tuple[str, str]] = kwargs.get("metadata_update", None)
|
|
583
584
|
if memos is None:
|
|
584
585
|
memos = [[] for _ in range(len(puzzle_hashes))]
|
|
585
586
|
|
|
@@ -588,7 +589,7 @@ class NFTWallet:
|
|
|
588
589
|
|
|
589
590
|
payments = []
|
|
590
591
|
for amount, puzhash, memo_list in zip(amounts, puzzle_hashes, memos):
|
|
591
|
-
memos_with_hint:
|
|
592
|
+
memos_with_hint: list[bytes] = [puzhash]
|
|
592
593
|
memos_with_hint.extend(memo_list)
|
|
593
594
|
payments.append(Payment(puzhash, amount, memos_with_hint))
|
|
594
595
|
|
|
@@ -605,13 +606,13 @@ class NFTWallet:
|
|
|
605
606
|
metadata_update=metadata_update,
|
|
606
607
|
extra_conditions=extra_conditions,
|
|
607
608
|
)
|
|
608
|
-
spend_bundle = WalletSpendBundle.aggregate([unsigned_spend_bundle
|
|
609
|
+
spend_bundle = WalletSpendBundle.aggregate([unsigned_spend_bundle, *additional_bundles])
|
|
609
610
|
|
|
610
611
|
async with action_scope.use() as interface:
|
|
611
|
-
other_tx_removals:
|
|
612
|
+
other_tx_removals: set[Coin] = {
|
|
612
613
|
removal for tx in interface.side_effects.transactions for removal in tx.removals
|
|
613
614
|
}
|
|
614
|
-
other_tx_additions:
|
|
615
|
+
other_tx_additions: set[Coin] = {
|
|
615
616
|
addition for tx in interface.side_effects.transactions for addition in tx.additions
|
|
616
617
|
}
|
|
617
618
|
tx = TransactionRecord(
|
|
@@ -638,16 +639,16 @@ class NFTWallet:
|
|
|
638
639
|
|
|
639
640
|
async def generate_unsigned_spendbundle(
|
|
640
641
|
self,
|
|
641
|
-
payments:
|
|
642
|
+
payments: list[Payment],
|
|
642
643
|
action_scope: WalletActionScope,
|
|
643
644
|
fee: uint64 = uint64(0),
|
|
644
|
-
coins: Optional[
|
|
645
|
+
coins: Optional[set[Coin]] = None,
|
|
645
646
|
new_owner: Optional[bytes] = None,
|
|
646
647
|
new_did_inner_hash: Optional[bytes] = None,
|
|
647
648
|
trade_prices_list: Optional[Program] = None,
|
|
648
|
-
metadata_update: Optional[
|
|
649
|
+
metadata_update: Optional[tuple[str, str]] = None,
|
|
649
650
|
nft_coin: Optional[NFTCoinInfo] = None,
|
|
650
|
-
extra_conditions:
|
|
651
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
651
652
|
) -> WalletSpendBundle:
|
|
652
653
|
if nft_coin is None:
|
|
653
654
|
if coins is None or not len(coins) == 1:
|
|
@@ -671,10 +672,10 @@ class NFTWallet:
|
|
|
671
672
|
if unft.supports_did:
|
|
672
673
|
if new_owner is None:
|
|
673
674
|
# If no new owner was specified and we're sending this to ourselves, let's not reset the DID
|
|
674
|
-
derivation_record: Optional[
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
675
|
+
derivation_record: Optional[
|
|
676
|
+
DerivationRecord
|
|
677
|
+
] = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
|
|
678
|
+
payments[0].puzzle_hash
|
|
678
679
|
)
|
|
679
680
|
if derivation_record is not None:
|
|
680
681
|
new_owner = unft.owner_did
|
|
@@ -720,10 +721,10 @@ class NFTWallet:
|
|
|
720
721
|
|
|
721
722
|
@staticmethod
|
|
722
723
|
def royalty_calculation(
|
|
723
|
-
royalty_assets_dict:
|
|
724
|
-
fungible_asset_dict:
|
|
725
|
-
) ->
|
|
726
|
-
summary_dict:
|
|
724
|
+
royalty_assets_dict: dict[Any, tuple[Any, uint16]],
|
|
725
|
+
fungible_asset_dict: dict[Any, uint64],
|
|
726
|
+
) -> dict[Any, list[dict[str, Any]]]:
|
|
727
|
+
summary_dict: dict[Any, list[dict[str, Any]]] = {}
|
|
727
728
|
for id, royalty_info in royalty_assets_dict.items():
|
|
728
729
|
address, percentage = royalty_info
|
|
729
730
|
summary_dict[id] = []
|
|
@@ -741,14 +742,14 @@ class NFTWallet:
|
|
|
741
742
|
@staticmethod
|
|
742
743
|
async def make_nft1_offer(
|
|
743
744
|
wallet_state_manager: Any,
|
|
744
|
-
offer_dict:
|
|
745
|
-
driver_dict:
|
|
745
|
+
offer_dict: dict[Optional[bytes32], int],
|
|
746
|
+
driver_dict: dict[bytes32, PuzzleInfo],
|
|
746
747
|
action_scope: WalletActionScope,
|
|
747
748
|
fee: uint64,
|
|
748
|
-
extra_conditions:
|
|
749
|
+
extra_conditions: tuple[Condition, ...],
|
|
749
750
|
) -> Offer:
|
|
750
751
|
# First, let's take note of all the royalty enabled NFTs
|
|
751
|
-
royalty_nft_asset_dict:
|
|
752
|
+
royalty_nft_asset_dict: dict[bytes32, int] = {}
|
|
752
753
|
for asset, amount in offer_dict.items():
|
|
753
754
|
if asset is not None and driver_dict[asset].check_type( # check if asset is an Royalty Enabled NFT
|
|
754
755
|
[
|
|
@@ -761,7 +762,7 @@ class NFTWallet:
|
|
|
761
762
|
royalty_nft_asset_dict[asset] = amount
|
|
762
763
|
|
|
763
764
|
# Then, all of the things that trigger royalties
|
|
764
|
-
fungible_asset_dict:
|
|
765
|
+
fungible_asset_dict: dict[Optional[bytes32], int] = {}
|
|
765
766
|
for asset, amount in offer_dict.items():
|
|
766
767
|
if asset is None or driver_dict[asset].type() != AssetType.SINGLETON.value:
|
|
767
768
|
fungible_asset_dict[asset] = amount
|
|
@@ -775,7 +776,7 @@ class NFTWallet:
|
|
|
775
776
|
elif amount < 0:
|
|
776
777
|
offer_side_royalty_split += 1
|
|
777
778
|
|
|
778
|
-
trade_prices:
|
|
779
|
+
trade_prices: list[tuple[uint64, bytes32]] = []
|
|
779
780
|
for asset, amount in fungible_asset_dict.items(): # requested fungible items
|
|
780
781
|
if amount > 0 and offer_side_royalty_split > 0:
|
|
781
782
|
settlement_ph: bytes32 = (
|
|
@@ -783,8 +784,8 @@ class NFTWallet:
|
|
|
783
784
|
)
|
|
784
785
|
trade_prices.append((uint64(math.floor(amount / offer_side_royalty_split)), settlement_ph))
|
|
785
786
|
|
|
786
|
-
required_royalty_info:
|
|
787
|
-
offered_royalty_percentages:
|
|
787
|
+
required_royalty_info: list[tuple[bytes32, bytes32, uint16]] = [] # [(launcher_id, address, percentage)]
|
|
788
|
+
offered_royalty_percentages: dict[bytes32, uint16] = {}
|
|
788
789
|
for asset, amount in royalty_nft_asset_dict.items(): # royalty enabled NFTs
|
|
789
790
|
transfer_info = driver_dict[asset].also().also() # type: ignore
|
|
790
791
|
assert isinstance(transfer_info, PuzzleInfo)
|
|
@@ -806,10 +807,10 @@ class NFTWallet:
|
|
|
806
807
|
else:
|
|
807
808
|
offered_royalty_percentages[asset] = uint16(royalty_percentage)
|
|
808
809
|
|
|
809
|
-
royalty_payments:
|
|
810
|
+
royalty_payments: dict[Optional[bytes32], list[tuple[bytes32, Payment]]] = {}
|
|
810
811
|
for asset, amount in fungible_asset_dict.items(): # offered fungible items
|
|
811
812
|
if amount < 0 and request_side_royalty_split > 0:
|
|
812
|
-
payment_list:
|
|
813
|
+
payment_list: list[tuple[bytes32, Payment]] = []
|
|
813
814
|
for launcher_id, address, percentage in required_royalty_info:
|
|
814
815
|
extra_royalty_amount = uint64(
|
|
815
816
|
math.floor(math.floor(abs(amount) / request_side_royalty_split) * (percentage / 10000))
|
|
@@ -823,14 +824,14 @@ class NFTWallet:
|
|
|
823
824
|
p2_ph = await wallet_state_manager.main_wallet.get_puzzle_hash(
|
|
824
825
|
new=not action_scope.config.tx_config.reuse_puzhash
|
|
825
826
|
)
|
|
826
|
-
requested_payments:
|
|
827
|
+
requested_payments: dict[Optional[bytes32], list[Payment]] = {}
|
|
827
828
|
for asset, amount in offer_dict.items():
|
|
828
829
|
if amount > 0:
|
|
829
830
|
requested_payments[asset] = [Payment(p2_ph, uint64(amount), [p2_ph] if asset is not None else [])]
|
|
830
831
|
|
|
831
832
|
# Find all the coins we're offering
|
|
832
|
-
offered_coins_by_asset:
|
|
833
|
-
all_offered_coins:
|
|
833
|
+
offered_coins_by_asset: dict[Optional[bytes32], set[Coin]] = {}
|
|
834
|
+
all_offered_coins: set[Coin] = set()
|
|
834
835
|
for asset, amount in offer_dict.items():
|
|
835
836
|
if amount < 0:
|
|
836
837
|
if asset is None:
|
|
@@ -845,17 +846,17 @@ class NFTWallet:
|
|
|
845
846
|
coin_amount_needed: int = abs(amount) + royalty_amount + fee
|
|
846
847
|
else:
|
|
847
848
|
coin_amount_needed = abs(amount) + royalty_amount
|
|
848
|
-
offered_coins:
|
|
849
|
+
offered_coins: set[Coin] = await wallet.get_coins_to_offer(asset, coin_amount_needed, action_scope)
|
|
849
850
|
if len(offered_coins) == 0:
|
|
850
851
|
raise ValueError(f"Did not have asset ID {asset.hex() if asset is not None else 'XCH'} to offer")
|
|
851
852
|
offered_coins_by_asset[asset] = offered_coins
|
|
852
853
|
all_offered_coins.update(offered_coins)
|
|
853
854
|
|
|
854
855
|
# Notarize the payments and get the announcements for the bundle
|
|
855
|
-
notarized_payments:
|
|
856
|
+
notarized_payments: dict[Optional[bytes32], list[NotarizedPayment]] = Offer.notarize_payments(
|
|
856
857
|
requested_payments, list(all_offered_coins)
|
|
857
858
|
)
|
|
858
|
-
announcements_to_assert:
|
|
859
|
+
announcements_to_assert: list[AssertPuzzleAnnouncement] = Offer.calculate_announcements(
|
|
859
860
|
notarized_payments, driver_dict
|
|
860
861
|
)
|
|
861
862
|
for asset, payments in royalty_payments.items():
|
|
@@ -877,8 +878,8 @@ class NFTWallet:
|
|
|
877
878
|
)
|
|
878
879
|
|
|
879
880
|
# Create all of the transactions
|
|
880
|
-
all_transactions:
|
|
881
|
-
additional_bundles:
|
|
881
|
+
all_transactions: list[TransactionRecord] = []
|
|
882
|
+
additional_bundles: list[WalletSpendBundle] = []
|
|
882
883
|
# standard pays the fee if possible
|
|
883
884
|
fee_left_to_pay: uint64 = uint64(0) if None in offer_dict and offer_dict[None] < 0 else fee
|
|
884
885
|
|
|
@@ -923,8 +924,8 @@ class NFTWallet:
|
|
|
923
924
|
else:
|
|
924
925
|
payments = royalty_payments[asset] if asset in royalty_payments else []
|
|
925
926
|
await wallet.generate_signed_transaction(
|
|
926
|
-
[abs(amount)
|
|
927
|
-
[OFFER_MOD_HASH
|
|
927
|
+
[abs(amount)] + ([sum(p.amount for _, p in payments)] if payments != [] else []),
|
|
928
|
+
[OFFER_MOD_HASH] + ([OFFER_MOD_HASH] if payments != [] else []),
|
|
928
929
|
inner_action_scope,
|
|
929
930
|
fee=fee_left_to_pay,
|
|
930
931
|
coins=offered_coins_by_asset[asset],
|
|
@@ -949,8 +950,8 @@ class NFTWallet:
|
|
|
949
950
|
royalty_coin: Optional[Coin] = None
|
|
950
951
|
parent_spend: Optional[CoinSpend] = None
|
|
951
952
|
while True:
|
|
952
|
-
duplicate_payments:
|
|
953
|
-
deduped_payment_list:
|
|
953
|
+
duplicate_payments: list[tuple[bytes32, Payment]] = []
|
|
954
|
+
deduped_payment_list: list[tuple[bytes32, Payment]] = []
|
|
954
955
|
for launcher_id, payment in payments:
|
|
955
956
|
if payment in [p for _, p in deduped_payment_list]:
|
|
956
957
|
duplicate_payments.append((launcher_id, payment))
|
|
@@ -1050,12 +1051,12 @@ class NFTWallet:
|
|
|
1050
1051
|
|
|
1051
1052
|
async def set_bulk_nft_did(
|
|
1052
1053
|
self,
|
|
1053
|
-
nft_list:
|
|
1054
|
+
nft_list: list[NFTCoinInfo],
|
|
1054
1055
|
did_id: bytes,
|
|
1055
1056
|
action_scope: WalletActionScope,
|
|
1056
1057
|
fee: uint64 = uint64(0),
|
|
1057
|
-
announcement_ids:
|
|
1058
|
-
extra_conditions:
|
|
1058
|
+
announcement_ids: list[bytes32] = [],
|
|
1059
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1059
1060
|
) -> None:
|
|
1060
1061
|
self.log.debug("Setting NFT DID with parameters: nft=%s did=%s", nft_list, did_id)
|
|
1061
1062
|
nft_ids = []
|
|
@@ -1094,11 +1095,11 @@ class NFTWallet:
|
|
|
1094
1095
|
|
|
1095
1096
|
async def bulk_transfer_nft(
|
|
1096
1097
|
self,
|
|
1097
|
-
nft_list:
|
|
1098
|
+
nft_list: list[NFTCoinInfo],
|
|
1098
1099
|
puzzle_hash: bytes32,
|
|
1099
1100
|
action_scope: WalletActionScope,
|
|
1100
1101
|
fee: uint64 = uint64(0),
|
|
1101
|
-
extra_conditions:
|
|
1102
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1102
1103
|
) -> None:
|
|
1103
1104
|
self.log.debug("Transfer NFTs %s to %s", nft_list, puzzle_hash.hex())
|
|
1104
1105
|
first = True
|
|
@@ -1125,7 +1126,7 @@ class NFTWallet:
|
|
|
1125
1126
|
did_id: bytes,
|
|
1126
1127
|
action_scope: WalletActionScope,
|
|
1127
1128
|
fee: uint64 = uint64(0),
|
|
1128
|
-
extra_conditions:
|
|
1129
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1129
1130
|
) -> None:
|
|
1130
1131
|
self.log.debug("Setting NFT DID with parameters: nft=%s did=%s", nft_coin_info, did_id)
|
|
1131
1132
|
unft = UncurriedNFT.uncurry(*nft_coin_info.full_puzzle.uncurry())
|
|
@@ -1152,19 +1153,19 @@ class NFTWallet:
|
|
|
1152
1153
|
|
|
1153
1154
|
async def mint_from_did(
|
|
1154
1155
|
self,
|
|
1155
|
-
metadata_list:
|
|
1156
|
+
metadata_list: list[dict[str, Any]],
|
|
1156
1157
|
action_scope: WalletActionScope,
|
|
1157
|
-
target_list: Optional[
|
|
1158
|
+
target_list: Optional[list[bytes32]] = [],
|
|
1158
1159
|
mint_number_start: Optional[int] = 1,
|
|
1159
1160
|
mint_total: Optional[int] = None,
|
|
1160
|
-
xch_coins: Optional[
|
|
1161
|
+
xch_coins: Optional[set[Coin]] = None,
|
|
1161
1162
|
xch_change_ph: Optional[bytes32] = None,
|
|
1162
1163
|
new_innerpuzhash: Optional[bytes32] = None,
|
|
1163
1164
|
new_p2_puzhash: Optional[bytes32] = None,
|
|
1164
1165
|
did_coin: Optional[Coin] = None,
|
|
1165
1166
|
did_lineage_parent: Optional[bytes32] = None,
|
|
1166
1167
|
fee: Optional[uint64] = uint64(0),
|
|
1167
|
-
extra_conditions:
|
|
1168
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1168
1169
|
) -> None:
|
|
1169
1170
|
"""
|
|
1170
1171
|
Minting NFTs from the DID linked wallet, also used for bulk minting NFTs.
|
|
@@ -1246,8 +1247,8 @@ class NFTWallet:
|
|
|
1246
1247
|
|
|
1247
1248
|
# Empty set to load with the announcements we will assert from DID to
|
|
1248
1249
|
# match the announcements from the intermediate launcher puzzle
|
|
1249
|
-
did_announcements:
|
|
1250
|
-
puzzle_assertions:
|
|
1250
|
+
did_announcements: set[Any] = set()
|
|
1251
|
+
puzzle_assertions: set[Any] = set()
|
|
1251
1252
|
amount = uint64(1)
|
|
1252
1253
|
intermediate_coin_spends = []
|
|
1253
1254
|
launcher_spends = []
|
|
@@ -1353,7 +1354,7 @@ class NFTWallet:
|
|
|
1353
1354
|
# Extract Puzzle Announcement from eve spend
|
|
1354
1355
|
eve_sol = eve_sb.coin_spends[0].solution.to_program()
|
|
1355
1356
|
conds = eve_fullpuz.run(eve_sol)
|
|
1356
|
-
eve_puzzle_announcement =
|
|
1357
|
+
eve_puzzle_announcement = next(x for x in conds.as_python() if int_from_bytes(x[0]) == 62)[1]
|
|
1357
1358
|
assertion = std_hash(eve_fullpuz.get_tree_hash() + eve_puzzle_announcement)
|
|
1358
1359
|
puzzle_assertions.add(assertion)
|
|
1359
1360
|
|
|
@@ -1368,11 +1369,11 @@ class NFTWallet:
|
|
|
1368
1369
|
xch_coins_iter = iter(xch_coins)
|
|
1369
1370
|
xch_coin = next(xch_coins_iter)
|
|
1370
1371
|
|
|
1371
|
-
message_list:
|
|
1372
|
+
message_list: list[bytes32] = [c.name() for c in xch_coins]
|
|
1372
1373
|
message_list.append(Coin(xch_coin.name(), xch_payment.puzzle_hash, xch_payment.amount).name())
|
|
1373
1374
|
message: bytes32 = std_hash(b"".join(message_list))
|
|
1374
1375
|
|
|
1375
|
-
xch_extra_conditions:
|
|
1376
|
+
xch_extra_conditions: tuple[Condition, ...] = (
|
|
1376
1377
|
AssertCoinAnnouncement(asserted_id=did_coin.name(), asserted_msg=message),
|
|
1377
1378
|
)
|
|
1378
1379
|
if len(xch_coins) > 1:
|
|
@@ -1437,7 +1438,7 @@ class NFTWallet:
|
|
|
1437
1438
|
did_spend = make_spend(did_coin, did_full_puzzle, did_full_sol)
|
|
1438
1439
|
|
|
1439
1440
|
# Collect up all the coin spends and sign them
|
|
1440
|
-
list_of_coinspends = [did_spend
|
|
1441
|
+
list_of_coinspends = [did_spend, *intermediate_coin_spends, *launcher_spends, *xch_spend.coin_spends]
|
|
1441
1442
|
unsigned_spend_bundle = WalletSpendBundle(list_of_coinspends, G2Element())
|
|
1442
1443
|
|
|
1443
1444
|
# Aggregate everything into a single spend bundle
|
|
@@ -1457,15 +1458,15 @@ class NFTWallet:
|
|
|
1457
1458
|
|
|
1458
1459
|
async def mint_from_xch(
|
|
1459
1460
|
self,
|
|
1460
|
-
metadata_list:
|
|
1461
|
+
metadata_list: list[dict[str, Any]],
|
|
1461
1462
|
action_scope: WalletActionScope,
|
|
1462
|
-
target_list: Optional[
|
|
1463
|
+
target_list: Optional[list[bytes32]] = [],
|
|
1463
1464
|
mint_number_start: Optional[int] = 1,
|
|
1464
1465
|
mint_total: Optional[int] = None,
|
|
1465
|
-
xch_coins: Optional[
|
|
1466
|
+
xch_coins: Optional[set[Coin]] = None,
|
|
1466
1467
|
xch_change_ph: Optional[bytes32] = None,
|
|
1467
1468
|
fee: Optional[uint64] = uint64(0),
|
|
1468
|
-
extra_conditions:
|
|
1469
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1469
1470
|
) -> None:
|
|
1470
1471
|
"""
|
|
1471
1472
|
Minting NFTs from a single XCH spend using intermediate launcher puzzle
|
|
@@ -1507,8 +1508,8 @@ class NFTWallet:
|
|
|
1507
1508
|
|
|
1508
1509
|
# Empty set to load with the announcements we will assert from XCH to
|
|
1509
1510
|
# match the announcements from the intermediate launcher puzzle
|
|
1510
|
-
coin_announcements:
|
|
1511
|
-
puzzle_assertions:
|
|
1511
|
+
coin_announcements: set[bytes32] = set()
|
|
1512
|
+
puzzle_assertions: set[bytes32] = set()
|
|
1512
1513
|
primaries = []
|
|
1513
1514
|
amount = uint64(1)
|
|
1514
1515
|
intermediate_coin_spends = []
|
|
@@ -1610,7 +1611,7 @@ class NFTWallet:
|
|
|
1610
1611
|
# Extract Puzzle Announcement from eve spend
|
|
1611
1612
|
eve_sol = eve_sb.coin_spends[0].solution.to_program()
|
|
1612
1613
|
conds = eve_fullpuz.run(eve_sol)
|
|
1613
|
-
eve_puzzle_announcement =
|
|
1614
|
+
eve_puzzle_announcement = next(x for x in conds.as_python() if int_from_bytes(x[0]) == 62)[1]
|
|
1614
1615
|
assertion = std_hash(eve_fullpuz.get_tree_hash() + eve_puzzle_announcement)
|
|
1615
1616
|
puzzle_assertions.add(assertion)
|
|
1616
1617
|
|
|
@@ -1627,7 +1628,7 @@ class NFTWallet:
|
|
|
1627
1628
|
for xch_coin in xch_coins:
|
|
1628
1629
|
puzzle: Program = await self.standard_wallet.puzzle_for_puzzle_hash(xch_coin.puzzle_hash)
|
|
1629
1630
|
if first:
|
|
1630
|
-
message_list:
|
|
1631
|
+
message_list: list[bytes32] = [c.name() for c in xch_coins]
|
|
1631
1632
|
message_list.append(Coin(xch_coin.name(), xch_payment.puzzle_hash, xch_payment.amount).name())
|
|
1632
1633
|
message: bytes32 = std_hash(b"".join(message_list))
|
|
1633
1634
|
|
|
@@ -1637,7 +1638,7 @@ class NFTWallet:
|
|
|
1637
1638
|
extra_conditions += tuple(AssertPuzzleAnnouncement(ann) for ann in puzzle_assertions)
|
|
1638
1639
|
|
|
1639
1640
|
solution: Program = self.standard_wallet.make_solution(
|
|
1640
|
-
primaries=[xch_payment
|
|
1641
|
+
primaries=[xch_payment, *primaries],
|
|
1641
1642
|
fee=fee,
|
|
1642
1643
|
conditions=extra_conditions,
|
|
1643
1644
|
)
|
|
@@ -1670,7 +1671,7 @@ class NFTWallet:
|
|
|
1670
1671
|
self,
|
|
1671
1672
|
amount: uint64,
|
|
1672
1673
|
action_scope: WalletActionScope,
|
|
1673
|
-
) ->
|
|
1674
|
+
) -> set[Coin]:
|
|
1674
1675
|
raise RuntimeError("NFTWallet does not support select_coins()")
|
|
1675
1676
|
|
|
1676
1677
|
def require_derivation_paths(self) -> bool:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Callable,
|
|
4
|
+
from typing import Callable, Optional, Union
|
|
5
5
|
|
|
6
6
|
from clvm_tools.binutils import disassemble
|
|
7
7
|
|
|
@@ -16,7 +16,7 @@ OWNERSHIP_LAYER_MOD = load_clvm_maybe_recompile(
|
|
|
16
16
|
)
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def match_ownership_layer_puzzle(puzzle: UncurriedPuzzle) ->
|
|
19
|
+
def match_ownership_layer_puzzle(puzzle: UncurriedPuzzle) -> tuple[bool, list[Program]]:
|
|
20
20
|
if puzzle.mod == OWNERSHIP_LAYER_MOD:
|
|
21
21
|
return True, list(puzzle.args.as_iter())
|
|
22
22
|
return False, []
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any, Callable,
|
|
4
|
+
from typing import Any, Callable, Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.coin import Coin
|
|
7
7
|
from chia.types.blockchain_format.program import Program
|
|
@@ -39,7 +39,7 @@ class SingletonOuterPuzzle:
|
|
|
39
39
|
assert launcher_id is not None
|
|
40
40
|
launcher_ph = launcher_struct[1].atom
|
|
41
41
|
assert launcher_ph is not None
|
|
42
|
-
constructor_dict:
|
|
42
|
+
constructor_dict: dict[str, Any] = {
|
|
43
43
|
"type": "singleton",
|
|
44
44
|
"launcher_id": "0x" + launcher_id.hex(),
|
|
45
45
|
"launcher_ph": "0x" + launcher_ph.hex(),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Callable,
|
|
4
|
+
from typing import Callable, Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.program import Program
|
|
7
7
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -17,7 +17,7 @@ TRANSFER_PROGRAM_MOD = load_clvm_maybe_recompile(
|
|
|
17
17
|
)
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
def match_transfer_program_puzzle(puzzle: UncurriedPuzzle) ->
|
|
20
|
+
def match_transfer_program_puzzle(puzzle: UncurriedPuzzle) -> tuple[bool, list[Program]]:
|
|
21
21
|
if puzzle.mod == TRANSFER_PROGRAM_MOD:
|
|
22
22
|
return True, list(puzzle.args.as_iter())
|
|
23
23
|
return False, []
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass
|
|
5
|
-
from typing import Optional,
|
|
5
|
+
from typing import Optional, TypeVar
|
|
6
6
|
|
|
7
7
|
from chia.protocols.wallet_protocol import CoinState
|
|
8
8
|
from chia.types.blockchain_format.program import Program
|
|
@@ -91,7 +91,7 @@ class UncurriedNFT(Streamable):
|
|
|
91
91
|
trade_price_percentage: Optional[uint16]
|
|
92
92
|
|
|
93
93
|
@classmethod
|
|
94
|
-
def uncurry(cls:
|
|
94
|
+
def uncurry(cls: type[_T_UncurriedNFT], mod: Program, curried_args: Program) -> Optional[_T_UncurriedNFT]:
|
|
95
95
|
"""
|
|
96
96
|
Try to uncurry a NFT puzzle
|
|
97
97
|
:param cls UncurriedNFT class
|
|
@@ -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, Optional
|
|
5
5
|
|
|
6
6
|
from chia_rs import G2Element
|
|
7
7
|
|
|
@@ -53,8 +53,8 @@ class NotificationManager:
|
|
|
53
53
|
):
|
|
54
54
|
return False
|
|
55
55
|
else:
|
|
56
|
-
memos:
|
|
57
|
-
coin_memos:
|
|
56
|
+
memos: dict[bytes32, list[bytes]] = compute_memos_for_spend(parent_spend)
|
|
57
|
+
coin_memos: list[bytes] = memos.get(coin_name, [])
|
|
58
58
|
if len(coin_memos) == 0 or len(coin_memos[0]) != 32:
|
|
59
59
|
return False
|
|
60
60
|
wallet_identifier = await self.wallet_state_manager.get_wallet_identifier_for_puzzle_hash(
|
|
@@ -87,9 +87,9 @@ class NotificationManager:
|
|
|
87
87
|
amount: uint64,
|
|
88
88
|
action_scope: WalletActionScope,
|
|
89
89
|
fee: uint64 = uint64(0),
|
|
90
|
-
extra_conditions:
|
|
90
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
91
91
|
) -> None:
|
|
92
|
-
coins:
|
|
92
|
+
coins: set[Coin] = await self.wallet_state_manager.main_wallet.select_coins(uint64(amount + fee), action_scope)
|
|
93
93
|
origin_coin: bytes32 = next(iter(coins)).name()
|
|
94
94
|
notification_puzzle: Program = construct_notification(target, amount)
|
|
95
95
|
notification_hash: bytes32 = notification_puzzle.get_tree_hash()
|