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,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Any, Literal
|
|
4
|
+
from typing import Any, Literal
|
|
5
5
|
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint16, uint64
|
|
@@ -82,7 +82,7 @@ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: dict[str,
|
|
|
82
82
|
:param ignore_size_limit Ignore the off-chain metadata loading size limit
|
|
83
83
|
:return: NFTInfo
|
|
84
84
|
"""
|
|
85
|
-
uncurried_nft:
|
|
85
|
+
uncurried_nft: UncurriedNFT | None = UncurriedNFT.uncurry(*nft_coin_info.full_puzzle.uncurry())
|
|
86
86
|
assert uncurried_nft is not None
|
|
87
87
|
data_uris: list[str] = []
|
|
88
88
|
|
|
@@ -94,7 +94,7 @@ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: dict[str,
|
|
|
94
94
|
license_uris: list[str] = []
|
|
95
95
|
for uri in uncurried_nft.license_uris.as_python():
|
|
96
96
|
license_uris.append(str(uri, "utf-8"))
|
|
97
|
-
off_chain_metadata:
|
|
97
|
+
off_chain_metadata: str | None = None
|
|
98
98
|
nft_info = NFTInfo(
|
|
99
99
|
encode_puzzle_hash(uncurried_nft.singleton_launcher_id, prefix=AddressType.NFT.hrp(config=config)),
|
|
100
100
|
uncurried_nft.singleton_launcher_id,
|
|
@@ -177,7 +177,7 @@ def update_metadata(metadata: Program, update_condition: Program) -> Program:
|
|
|
177
177
|
|
|
178
178
|
|
|
179
179
|
def construct_ownership_layer(
|
|
180
|
-
current_owner:
|
|
180
|
+
current_owner: bytes32 | None,
|
|
181
181
|
transfer_program: Program,
|
|
182
182
|
inner_puzzle: Program,
|
|
183
183
|
) -> Program:
|
|
@@ -189,7 +189,7 @@ def create_ownership_layer_puzzle(
|
|
|
189
189
|
did_id: bytes,
|
|
190
190
|
p2_puzzle: Program,
|
|
191
191
|
percentage: uint16,
|
|
192
|
-
royalty_puzzle_hash:
|
|
192
|
+
royalty_puzzle_hash: bytes32 | None = None,
|
|
193
193
|
) -> Program:
|
|
194
194
|
log.debug(
|
|
195
195
|
"Creating ownership layer puzzle with NFT_ID: %s DID_ID: %s Royalty_Percentage: %d P2_puzzle: %s",
|
|
@@ -230,7 +230,7 @@ def create_ownership_layer_transfer_solution(
|
|
|
230
230
|
def get_metadata_and_phs(unft: UncurriedNFT, solution: SerializedProgram) -> tuple[Program, bytes32]:
|
|
231
231
|
conditions = unft.p2_puzzle.run(unft.get_innermost_solution(Program.from_serialized(solution)))
|
|
232
232
|
metadata = unft.metadata
|
|
233
|
-
puzhash_for_derivation:
|
|
233
|
+
puzhash_for_derivation: bytes32 | None = None
|
|
234
234
|
for condition in conditions.as_iter():
|
|
235
235
|
if condition.list_len() < 2:
|
|
236
236
|
# invalid condition
|
|
@@ -279,9 +279,9 @@ def recurry_nft_puzzle(unft: UncurriedNFT, solution: Program, new_inner_puzzle:
|
|
|
279
279
|
return new_ownership_puzzle
|
|
280
280
|
|
|
281
281
|
|
|
282
|
-
def get_new_owner_did(unft: UncurriedNFT, solution: Program) ->
|
|
282
|
+
def get_new_owner_did(unft: UncurriedNFT, solution: Program) -> Literal[b""] | bytes32 | None:
|
|
283
283
|
conditions = unft.p2_puzzle.run(unft.get_innermost_solution(solution))
|
|
284
|
-
new_did_id:
|
|
284
|
+
new_did_id: Literal[b""] | bytes32 | None = None
|
|
285
285
|
for condition in conditions.as_iter():
|
|
286
286
|
if condition.first().as_int() == -10:
|
|
287
287
|
# this is the change owner magic condition
|
|
@@ -3,8 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
5
|
import math
|
|
6
|
-
import
|
|
7
|
-
from typing import TYPE_CHECKING, Any, ClassVar, Optional, TypeVar, cast
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar, TypeVar, cast
|
|
8
7
|
|
|
9
8
|
from chia_rs import AugSchemeMPL, CoinSpend, CoinState, G1Element, G2Element
|
|
10
9
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -15,7 +14,6 @@ from chia.server.ws_connection import WSChiaConnection
|
|
|
15
14
|
from chia.types.blockchain_format.coin import Coin
|
|
16
15
|
from chia.types.blockchain_format.program import Program
|
|
17
16
|
from chia.types.coin_spend import make_spend
|
|
18
|
-
from chia.types.signing_mode import CHIP_0002_SIGN_MESSAGE_PREFIX, SigningMode
|
|
19
17
|
from chia.util.casts import int_from_bytes, int_to_bytes
|
|
20
18
|
from chia.util.hash import std_hash
|
|
21
19
|
from chia.wallet.conditions import (
|
|
@@ -26,7 +24,6 @@ from chia.wallet.conditions import (
|
|
|
26
24
|
CreateCoinAnnouncement,
|
|
27
25
|
CreatePuzzleAnnouncement,
|
|
28
26
|
UnknownCondition,
|
|
29
|
-
parse_timelock_info,
|
|
30
27
|
)
|
|
31
28
|
from chia.wallet.derivation_record import DerivationRecord
|
|
32
29
|
from chia.wallet.did_wallet import did_wallet_puzzles
|
|
@@ -40,8 +37,6 @@ from chia.wallet.nft_wallet.uncurry_nft import NFTCoinData, UncurriedNFT
|
|
|
40
37
|
from chia.wallet.outer_puzzles import AssetType, construct_puzzle, match_puzzle, solve_puzzle
|
|
41
38
|
from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
|
|
42
39
|
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import (
|
|
43
|
-
DEFAULT_HIDDEN_PUZZLE_HASH,
|
|
44
|
-
calculate_synthetic_secret_key,
|
|
45
40
|
puzzle_for_pk,
|
|
46
41
|
)
|
|
47
42
|
from chia.wallet.singleton import SINGLETON_LAUNCHER_PUZZLE, SINGLETON_LAUNCHER_PUZZLE_HASH, create_singleton_puzzle
|
|
@@ -49,8 +44,6 @@ from chia.wallet.trading.offer import OFFER_MOD, OFFER_MOD_HASH, NotarizedPaymen
|
|
|
49
44
|
from chia.wallet.transaction_record import TransactionRecord
|
|
50
45
|
from chia.wallet.uncurried_puzzle import uncurry_puzzle
|
|
51
46
|
from chia.wallet.util.compute_additions import compute_additions
|
|
52
|
-
from chia.wallet.util.compute_memos import compute_memos
|
|
53
|
-
from chia.wallet.util.transaction_type import TransactionType
|
|
54
47
|
from chia.wallet.util.wallet_types import WalletType
|
|
55
48
|
from chia.wallet.wallet import Wallet
|
|
56
49
|
from chia.wallet.wallet_action_scope import WalletActionScope
|
|
@@ -76,7 +69,7 @@ class NFTWallet:
|
|
|
76
69
|
nft_store: WalletNftStore
|
|
77
70
|
|
|
78
71
|
@property
|
|
79
|
-
def did_id(self) ->
|
|
72
|
+
def did_id(self) -> bytes32 | None:
|
|
80
73
|
return self.nft_wallet_info.did_id
|
|
81
74
|
|
|
82
75
|
@classmethod
|
|
@@ -84,8 +77,8 @@ class NFTWallet:
|
|
|
84
77
|
cls: type[_T_NFTWallet],
|
|
85
78
|
wallet_state_manager: Any,
|
|
86
79
|
wallet: Wallet,
|
|
87
|
-
did_id:
|
|
88
|
-
name:
|
|
80
|
+
did_id: bytes32 | None = None,
|
|
81
|
+
name: str | None = None,
|
|
89
82
|
) -> _T_NFTWallet:
|
|
90
83
|
"""
|
|
91
84
|
This must be called under the wallet state manager lock
|
|
@@ -115,7 +108,7 @@ class NFTWallet:
|
|
|
115
108
|
wallet_state_manager: Any,
|
|
116
109
|
wallet: Wallet,
|
|
117
110
|
wallet_info: WalletInfo,
|
|
118
|
-
name:
|
|
111
|
+
name: str | None = None,
|
|
119
112
|
) -> _T_NFTWallet:
|
|
120
113
|
self = cls()
|
|
121
114
|
self.log = logging.getLogger(name if name else __name__)
|
|
@@ -135,25 +128,25 @@ class NFTWallet:
|
|
|
135
128
|
def id(self) -> uint32:
|
|
136
129
|
return self.wallet_info.id
|
|
137
130
|
|
|
138
|
-
def get_did(self) ->
|
|
131
|
+
def get_did(self) -> bytes32 | None:
|
|
139
132
|
return self.did_id
|
|
140
133
|
|
|
141
|
-
async def get_confirmed_balance(self, record_list:
|
|
134
|
+
async def get_confirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
|
|
142
135
|
"""The NFT wallet doesn't really have a balance."""
|
|
143
136
|
return uint128(0)
|
|
144
137
|
|
|
145
|
-
async def get_unconfirmed_balance(self, record_list:
|
|
138
|
+
async def get_unconfirmed_balance(self, record_list: set[WalletCoinRecord] | None = None) -> uint128:
|
|
146
139
|
"""The NFT wallet doesn't really have a balance."""
|
|
147
140
|
return uint128(0)
|
|
148
141
|
|
|
149
|
-
async def get_spendable_balance(self, unspent_records:
|
|
142
|
+
async def get_spendable_balance(self, unspent_records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
150
143
|
"""The NFT wallet doesn't really have a balance."""
|
|
151
144
|
return uint128(0)
|
|
152
145
|
|
|
153
146
|
async def get_pending_change_balance(self) -> uint64:
|
|
154
147
|
return uint64(0)
|
|
155
148
|
|
|
156
|
-
async def get_max_send_amount(self, records:
|
|
149
|
+
async def get_max_send_amount(self, records: set[WalletCoinRecord] | None = None) -> uint128:
|
|
157
150
|
"""This is the confirmed balance, which we set to 0 as the NFT wallet doesn't have one."""
|
|
158
151
|
return uint128(0)
|
|
159
152
|
|
|
@@ -164,7 +157,7 @@ class NFTWallet:
|
|
|
164
157
|
return nft_coin
|
|
165
158
|
|
|
166
159
|
async def coin_added(
|
|
167
|
-
self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data:
|
|
160
|
+
self, coin: Coin, height: uint32, peer: WSChiaConnection, parent_coin_data: NFTCoinData | None
|
|
168
161
|
) -> None:
|
|
169
162
|
"""Notification from wallet state manager that wallet has been received."""
|
|
170
163
|
self.log.info(f"NFT wallet %s has been notified that {coin} was added", self.get_name())
|
|
@@ -191,9 +184,9 @@ class NFTWallet:
|
|
|
191
184
|
metadata, p2_puzzle_hash = get_metadata_and_phs(uncurried_nft, data.parent_coin_spend.solution)
|
|
192
185
|
self.log.debug("Got back puzhash from solution: %s", p2_puzzle_hash)
|
|
193
186
|
self.log.debug("Got back updated metadata: %s", metadata)
|
|
194
|
-
derivation_record:
|
|
195
|
-
DerivationRecord
|
|
196
|
-
|
|
187
|
+
derivation_record: (
|
|
188
|
+
DerivationRecord | None
|
|
189
|
+
) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(p2_puzzle_hash)
|
|
197
190
|
self.log.debug("Record for %s is: %s", p2_puzzle_hash, derivation_record)
|
|
198
191
|
if derivation_record is None:
|
|
199
192
|
self.log.debug("Not our NFT, pointing to %s, skipping", p2_puzzle_hash)
|
|
@@ -267,7 +260,7 @@ class NFTWallet:
|
|
|
267
260
|
puzzle: Program,
|
|
268
261
|
lineage_proof: LineageProof,
|
|
269
262
|
mint_height: uint32,
|
|
270
|
-
minter_did:
|
|
263
|
+
minter_did: bytes32 | None,
|
|
271
264
|
confirmed_height: uint32,
|
|
272
265
|
) -> None:
|
|
273
266
|
new_nft = NFTCoinInfo(nft_id, coin, lineage_proof, puzzle, mint_height, minter_did, confirmed_height)
|
|
@@ -300,7 +293,7 @@ class NFTWallet:
|
|
|
300
293
|
self,
|
|
301
294
|
nft_ids: list[bytes32],
|
|
302
295
|
action_scope: WalletActionScope,
|
|
303
|
-
did_id:
|
|
296
|
+
did_id: bytes32 | None = None,
|
|
304
297
|
) -> bytes32:
|
|
305
298
|
"""Get DID spend with announcement created we need to transfer NFT with did with current inner hash of DID
|
|
306
299
|
|
|
@@ -329,10 +322,10 @@ class NFTWallet:
|
|
|
329
322
|
self,
|
|
330
323
|
metadata: Program,
|
|
331
324
|
action_scope: WalletActionScope,
|
|
332
|
-
target_puzzle_hash:
|
|
333
|
-
royalty_puzzle_hash:
|
|
325
|
+
target_puzzle_hash: bytes32 | None = None,
|
|
326
|
+
royalty_puzzle_hash: bytes32 | None = None,
|
|
334
327
|
percentage: uint16 = uint16(0),
|
|
335
|
-
did_id:
|
|
328
|
+
did_id: bytes | None = None,
|
|
336
329
|
fee: uint64 = uint64(0),
|
|
337
330
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
338
331
|
) -> bytes32:
|
|
@@ -488,36 +481,24 @@ class NFTWallet:
|
|
|
488
481
|
async def convert_puzzle_hash(self, puzhash: bytes32) -> bytes32:
|
|
489
482
|
return puzhash
|
|
490
483
|
|
|
491
|
-
async def get_nft(self, launcher_id: bytes32) ->
|
|
484
|
+
async def get_nft(self, launcher_id: bytes32) -> NFTCoinInfo | None:
|
|
492
485
|
return await self.nft_store.get_nft_by_id(launcher_id)
|
|
493
486
|
|
|
494
487
|
async def get_puzzle_info(self, nft_id: bytes32) -> PuzzleInfo:
|
|
495
|
-
nft_coin:
|
|
488
|
+
nft_coin: NFTCoinInfo | None = await self.get_nft(nft_id)
|
|
496
489
|
if nft_coin is None:
|
|
497
490
|
raise ValueError("An asset ID was specified that this wallet doesn't track")
|
|
498
|
-
puzzle_info:
|
|
491
|
+
puzzle_info: PuzzleInfo | None = match_puzzle(uncurry_puzzle(nft_coin.full_puzzle))
|
|
499
492
|
if puzzle_info is None:
|
|
500
493
|
raise ValueError("Internal Error: NFT wallet is tracking a non NFT coin")
|
|
501
494
|
else:
|
|
502
495
|
return puzzle_info
|
|
503
496
|
|
|
504
|
-
async def
|
|
497
|
+
async def current_p2_puzzle_hash(self, nft: NFTCoinInfo) -> bytes32:
|
|
505
498
|
uncurried_nft = UncurriedNFT.uncurry(*nft.full_puzzle.uncurry())
|
|
506
499
|
if uncurried_nft is not None:
|
|
507
500
|
p2_puzzle = uncurried_nft.p2_puzzle
|
|
508
|
-
|
|
509
|
-
private = await self.wallet_state_manager.get_private_key(puzzle_hash)
|
|
510
|
-
synthetic_secret_key = calculate_synthetic_secret_key(private, DEFAULT_HIDDEN_PUZZLE_HASH)
|
|
511
|
-
synthetic_pk = synthetic_secret_key.get_g1()
|
|
512
|
-
if mode == SigningMode.CHIP_0002_HEX_INPUT:
|
|
513
|
-
hex_message: bytes = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, bytes.fromhex(message))).get_tree_hash()
|
|
514
|
-
elif mode == SigningMode.BLS_MESSAGE_AUGMENTATION_UTF8_INPUT:
|
|
515
|
-
hex_message = bytes(message, "utf-8")
|
|
516
|
-
elif mode == SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT:
|
|
517
|
-
hex_message = bytes.fromhex(message)
|
|
518
|
-
else:
|
|
519
|
-
hex_message = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, message)).get_tree_hash()
|
|
520
|
-
return synthetic_pk, AugSchemeMPL.sign(synthetic_secret_key, hex_message)
|
|
501
|
+
return p2_puzzle.get_tree_hash()
|
|
521
502
|
else:
|
|
522
503
|
raise ValueError("Invalid NFT puzzle.")
|
|
523
504
|
|
|
@@ -527,7 +508,7 @@ class NFTWallet:
|
|
|
527
508
|
*args: Any,
|
|
528
509
|
**kwargs: Any,
|
|
529
510
|
) -> set[Coin]:
|
|
530
|
-
nft_coin:
|
|
511
|
+
nft_coin: NFTCoinInfo | None = await self.get_nft(nft_id)
|
|
531
512
|
if nft_coin is None:
|
|
532
513
|
raise ValueError("An asset ID was specified that this wallet doesn't track")
|
|
533
514
|
return {nft_coin.coin}
|
|
@@ -547,7 +528,7 @@ class NFTWallet:
|
|
|
547
528
|
wallet_state_manager: Any,
|
|
548
529
|
wallet: Wallet,
|
|
549
530
|
puzzle_driver: PuzzleInfo,
|
|
550
|
-
name:
|
|
531
|
+
name: str | None = None,
|
|
551
532
|
) -> Any:
|
|
552
533
|
# Off the bat we don't support multiple profile but when we do this will have to change
|
|
553
534
|
for wsm_wallet in wallet_state_manager.wallets.values():
|
|
@@ -568,17 +549,17 @@ class NFTWallet:
|
|
|
568
549
|
puzzle_hashes: list[bytes32],
|
|
569
550
|
action_scope: WalletActionScope,
|
|
570
551
|
fee: uint64 = uint64(0),
|
|
571
|
-
coins:
|
|
572
|
-
memos:
|
|
552
|
+
coins: set[Coin] | None = None,
|
|
553
|
+
memos: list[list[bytes]] | None = None,
|
|
573
554
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
574
555
|
**kwargs: Unpack[GSTOptionalArgs],
|
|
575
556
|
) -> None:
|
|
576
|
-
nft_coin:
|
|
577
|
-
new_owner:
|
|
578
|
-
new_did_inner_hash:
|
|
579
|
-
trade_prices_list:
|
|
557
|
+
nft_coin: NFTCoinInfo | None = kwargs.get("nft_coin", None)
|
|
558
|
+
new_owner: bytes | None = kwargs.get("new_owner", None)
|
|
559
|
+
new_did_inner_hash: bytes | None = kwargs.get("new_did_inner_hash", None)
|
|
560
|
+
trade_prices_list: Program | None = kwargs.get("trade_prices_list", None)
|
|
580
561
|
additional_bundles: list[WalletSpendBundle] = kwargs.get("additional_bundles", [])
|
|
581
|
-
metadata_update:
|
|
562
|
+
metadata_update: tuple[str, str] | None = kwargs.get("metadata_update", None)
|
|
582
563
|
if memos is None:
|
|
583
564
|
memos = [[] for _ in range(len(puzzle_hashes))]
|
|
584
565
|
|
|
@@ -613,25 +594,16 @@ class NFTWallet:
|
|
|
613
594
|
other_tx_additions: set[Coin] = {
|
|
614
595
|
addition for tx in interface.side_effects.transactions for addition in tx.additions
|
|
615
596
|
}
|
|
616
|
-
tx =
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
to_puzzle_hash=puzzle_hashes[0],
|
|
620
|
-
to_address=self.wallet_state_manager.encode_puzzle_hash(puzzle_hashes[0]),
|
|
597
|
+
tx = self.wallet_state_manager.new_outgoing_transaction(
|
|
598
|
+
wallet_id=self.id(),
|
|
599
|
+
puzzle_hash=puzzle_hashes[0],
|
|
621
600
|
amount=uint64(payment_sum),
|
|
622
|
-
|
|
623
|
-
confirmed=False,
|
|
624
|
-
sent=uint32(0),
|
|
601
|
+
fee=fee,
|
|
625
602
|
spend_bundle=spend_bundle,
|
|
626
603
|
additions=list(set(spend_bundle.additions()) - other_tx_additions),
|
|
627
604
|
removals=list(set(spend_bundle.removals()) - other_tx_removals),
|
|
628
|
-
wallet_id=self.id(),
|
|
629
|
-
sent_to=[],
|
|
630
|
-
trade_id=None,
|
|
631
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
632
605
|
name=spend_bundle.name(),
|
|
633
|
-
|
|
634
|
-
valid_times=parse_timelock_info(extra_conditions),
|
|
606
|
+
extra_conditions=extra_conditions,
|
|
635
607
|
)
|
|
636
608
|
|
|
637
609
|
interface.side_effects.transactions.append(tx)
|
|
@@ -641,12 +613,12 @@ class NFTWallet:
|
|
|
641
613
|
payments: list[CreateCoin],
|
|
642
614
|
action_scope: WalletActionScope,
|
|
643
615
|
fee: uint64 = uint64(0),
|
|
644
|
-
coins:
|
|
645
|
-
new_owner:
|
|
646
|
-
new_did_inner_hash:
|
|
647
|
-
trade_prices_list:
|
|
648
|
-
metadata_update:
|
|
649
|
-
nft_coin:
|
|
616
|
+
coins: set[Coin] | None = None,
|
|
617
|
+
new_owner: bytes | None = None,
|
|
618
|
+
new_did_inner_hash: bytes | None = None,
|
|
619
|
+
trade_prices_list: Program | None = None,
|
|
620
|
+
metadata_update: tuple[str, str] | None = None,
|
|
621
|
+
nft_coin: NFTCoinInfo | None = None,
|
|
650
622
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
651
623
|
) -> WalletSpendBundle:
|
|
652
624
|
if nft_coin is None:
|
|
@@ -671,9 +643,9 @@ class NFTWallet:
|
|
|
671
643
|
if unft.supports_did:
|
|
672
644
|
if new_owner is None:
|
|
673
645
|
# If no new owner was specified and we're sending this to ourselves, let's not reset the DID
|
|
674
|
-
derivation_record:
|
|
675
|
-
DerivationRecord
|
|
676
|
-
|
|
646
|
+
derivation_record: (
|
|
647
|
+
DerivationRecord | None
|
|
648
|
+
) = await self.wallet_state_manager.puzzle_store.get_derivation_record_for_puzzle_hash(
|
|
677
649
|
payments[0].puzzle_hash
|
|
678
650
|
)
|
|
679
651
|
if derivation_record is not None:
|
|
@@ -741,7 +713,7 @@ class NFTWallet:
|
|
|
741
713
|
@staticmethod
|
|
742
714
|
async def make_nft1_offer(
|
|
743
715
|
wallet_state_manager: Any,
|
|
744
|
-
offer_dict: dict[
|
|
716
|
+
offer_dict: dict[bytes32 | None, int],
|
|
745
717
|
driver_dict: dict[bytes32, PuzzleInfo],
|
|
746
718
|
action_scope: WalletActionScope,
|
|
747
719
|
fee: uint64,
|
|
@@ -761,7 +733,7 @@ class NFTWallet:
|
|
|
761
733
|
royalty_nft_asset_dict[asset] = amount
|
|
762
734
|
|
|
763
735
|
# Then, all of the things that trigger royalties
|
|
764
|
-
fungible_asset_dict: dict[
|
|
736
|
+
fungible_asset_dict: dict[bytes32 | None, int] = {}
|
|
765
737
|
for asset, amount in offer_dict.items():
|
|
766
738
|
if asset is None or driver_dict[asset].type() != AssetType.SINGLETON.value:
|
|
767
739
|
fungible_asset_dict[asset] = amount
|
|
@@ -806,7 +778,7 @@ class NFTWallet:
|
|
|
806
778
|
else:
|
|
807
779
|
offered_royalty_percentages[asset] = uint16(royalty_percentage)
|
|
808
780
|
|
|
809
|
-
royalty_payments: dict[
|
|
781
|
+
royalty_payments: dict[bytes32 | None, list[tuple[bytes32, CreateCoin]]] = {}
|
|
810
782
|
for asset, amount in fungible_asset_dict.items(): # offered fungible items
|
|
811
783
|
if amount < 0 and request_side_royalty_split > 0:
|
|
812
784
|
payment_list: list[tuple[bytes32, CreateCoin]] = []
|
|
@@ -821,20 +793,20 @@ class NFTWallet:
|
|
|
821
793
|
|
|
822
794
|
# Generate the requested_payments to be notarized
|
|
823
795
|
p2_ph = await action_scope.get_puzzle_hash(wallet_state_manager)
|
|
824
|
-
requested_payments: dict[
|
|
796
|
+
requested_payments: dict[bytes32 | None, list[CreateCoin]] = {}
|
|
825
797
|
for asset, amount in offer_dict.items():
|
|
826
798
|
if amount > 0:
|
|
827
799
|
requested_payments[asset] = [CreateCoin(p2_ph, uint64(amount), [p2_ph] if asset is not None else [])]
|
|
828
800
|
|
|
829
801
|
# Find all the coins we're offering
|
|
830
|
-
offered_coins_by_asset: dict[
|
|
802
|
+
offered_coins_by_asset: dict[bytes32 | None, set[Coin]] = {}
|
|
831
803
|
all_offered_coins: set[Coin] = set()
|
|
832
804
|
for asset, amount in offer_dict.items():
|
|
833
805
|
if amount < 0:
|
|
834
806
|
if asset is None:
|
|
835
807
|
wallet = wallet_state_manager.main_wallet
|
|
836
808
|
else:
|
|
837
|
-
wallet = await wallet_state_manager.get_wallet_for_asset_id(asset
|
|
809
|
+
wallet = await wallet_state_manager.get_wallet_for_asset_id(asset)
|
|
838
810
|
if asset in royalty_payments:
|
|
839
811
|
royalty_amount: int = sum(p.amount for _, p in royalty_payments[asset])
|
|
840
812
|
else:
|
|
@@ -850,7 +822,7 @@ class NFTWallet:
|
|
|
850
822
|
all_offered_coins.update(offered_coins)
|
|
851
823
|
|
|
852
824
|
# Notarize the payments and get the announcements for the bundle
|
|
853
|
-
notarized_payments: dict[
|
|
825
|
+
notarized_payments: dict[bytes32 | None, list[NotarizedPayment]] = Offer.notarize_payments(
|
|
854
826
|
requested_payments, list(all_offered_coins)
|
|
855
827
|
)
|
|
856
828
|
announcements_to_assert: list[AssertPuzzleAnnouncement] = Offer.calculate_announcements(
|
|
@@ -885,7 +857,7 @@ class NFTWallet:
|
|
|
885
857
|
if asset is None:
|
|
886
858
|
wallet = wallet_state_manager.main_wallet
|
|
887
859
|
else:
|
|
888
|
-
wallet = await wallet_state_manager.get_wallet_for_asset_id(asset
|
|
860
|
+
wallet = await wallet_state_manager.get_wallet_for_asset_id(asset)
|
|
889
861
|
|
|
890
862
|
# First, sending all the coins to the OFFER_MOD
|
|
891
863
|
async with wallet_state_manager.new_action_scope(
|
|
@@ -934,8 +906,8 @@ class NFTWallet:
|
|
|
934
906
|
# We cannot create coins with the same puzzle hash and amount
|
|
935
907
|
# So if there's multiple NFTs with the same royalty puzhash/percentage, we must create multiple
|
|
936
908
|
# generations of offer coins
|
|
937
|
-
royalty_coin:
|
|
938
|
-
parent_spend:
|
|
909
|
+
royalty_coin: Coin | None = None
|
|
910
|
+
parent_spend: CoinSpend | None = None
|
|
939
911
|
while True:
|
|
940
912
|
duplicate_payments: list[tuple[bytes32, CreateCoin]] = []
|
|
941
913
|
deduped_payment_list: list[tuple[bytes32, CreateCoin]] = []
|
|
@@ -1142,15 +1114,15 @@ class NFTWallet:
|
|
|
1142
1114
|
self,
|
|
1143
1115
|
metadata_list: list[dict[str, Any]],
|
|
1144
1116
|
action_scope: WalletActionScope,
|
|
1145
|
-
target_list:
|
|
1146
|
-
mint_number_start:
|
|
1147
|
-
mint_total:
|
|
1148
|
-
xch_coins:
|
|
1149
|
-
xch_change_ph:
|
|
1150
|
-
new_innerpuzhash:
|
|
1151
|
-
new_p2_puzhash:
|
|
1152
|
-
did_coin:
|
|
1153
|
-
did_lineage_parent:
|
|
1117
|
+
target_list: list[bytes32] | None = [],
|
|
1118
|
+
mint_number_start: int | None = 1,
|
|
1119
|
+
mint_total: int | None = None,
|
|
1120
|
+
xch_coins: set[Coin] | None = None,
|
|
1121
|
+
xch_change_ph: bytes32 | None = None,
|
|
1122
|
+
new_innerpuzhash: bytes32 | None = None,
|
|
1123
|
+
new_p2_puzhash: bytes32 | None = None,
|
|
1124
|
+
did_coin: Coin | None = None,
|
|
1125
|
+
did_lineage_parent: bytes32 | None = None,
|
|
1154
1126
|
fee: uint64 = uint64(0),
|
|
1155
1127
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1156
1128
|
) -> None:
|
|
@@ -1375,7 +1347,7 @@ class NFTWallet:
|
|
|
1375
1347
|
)
|
|
1376
1348
|
# The DID lineage parent won't not exist if we're bulk minting from a future DID coin
|
|
1377
1349
|
if did_lineage_parent:
|
|
1378
|
-
did_parent_info:
|
|
1350
|
+
did_parent_info: LineageProof | None = LineageProof(
|
|
1379
1351
|
parent_name=did_lineage_parent,
|
|
1380
1352
|
inner_puzzle_hash=innerpuz.get_tree_hash(),
|
|
1381
1353
|
amount=uint64(did_coin.amount),
|
|
@@ -1403,25 +1375,16 @@ class NFTWallet:
|
|
|
1403
1375
|
|
|
1404
1376
|
async with action_scope.use() as interface:
|
|
1405
1377
|
interface.side_effects.transactions.append(
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
to_puzzle_hash=innerpuz.get_tree_hash(),
|
|
1410
|
-
to_address=self.wallet_state_manager.encode_puzzle_hash(innerpuz.get_tree_hash()),
|
|
1378
|
+
self.wallet_state_manager.new_outgoing_transaction(
|
|
1379
|
+
wallet_id=did_wallet.id(),
|
|
1380
|
+
puzzle_hash=innerpuz.get_tree_hash(),
|
|
1411
1381
|
amount=uint64(1),
|
|
1412
|
-
|
|
1413
|
-
confirmed=False,
|
|
1414
|
-
sent=uint32(0),
|
|
1382
|
+
fee=fee,
|
|
1415
1383
|
spend_bundle=unsigned_spend_bundle,
|
|
1416
|
-
additions=
|
|
1417
|
-
removals=
|
|
1418
|
-
wallet_id=did_wallet.id(),
|
|
1419
|
-
sent_to=[],
|
|
1420
|
-
trade_id=None,
|
|
1421
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
1384
|
+
additions=unsigned_spend_bundle.additions(),
|
|
1385
|
+
removals=unsigned_spend_bundle.removals(),
|
|
1422
1386
|
name=unsigned_spend_bundle.name(),
|
|
1423
|
-
|
|
1424
|
-
valid_times=parse_timelock_info(extra_conditions),
|
|
1387
|
+
extra_conditions=extra_conditions,
|
|
1425
1388
|
)
|
|
1426
1389
|
)
|
|
1427
1390
|
|
|
@@ -1429,11 +1392,11 @@ class NFTWallet:
|
|
|
1429
1392
|
self,
|
|
1430
1393
|
metadata_list: list[dict[str, Any]],
|
|
1431
1394
|
action_scope: WalletActionScope,
|
|
1432
|
-
target_list:
|
|
1433
|
-
mint_number_start:
|
|
1434
|
-
mint_total:
|
|
1435
|
-
xch_coins:
|
|
1436
|
-
xch_change_ph:
|
|
1395
|
+
target_list: list[bytes32] | None = [],
|
|
1396
|
+
mint_number_start: int | None = 1,
|
|
1397
|
+
mint_total: int | None = None,
|
|
1398
|
+
xch_coins: set[Coin] | None = None,
|
|
1399
|
+
xch_change_ph: bytes32 | None = None,
|
|
1437
1400
|
fee: uint64 = uint64(0),
|
|
1438
1401
|
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1439
1402
|
) -> None:
|
|
@@ -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, Union
|
|
5
5
|
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from clvm_tools.binutils import disassemble
|
|
@@ -19,7 +19,7 @@ def match_ownership_layer_puzzle(puzzle: UncurriedPuzzle) -> tuple[bool, list[Pr
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def puzzle_for_ownership_layer(
|
|
22
|
-
current_owner:
|
|
22
|
+
current_owner: Program | bytes, transfer_program: Program, inner_puzzle: Program
|
|
23
23
|
) -> Program:
|
|
24
24
|
return NFT_OWNERSHIP_LAYER.curry(NFT_OWNERSHIP_LAYER.get_tree_hash(), current_owner, transfer_program, inner_puzzle)
|
|
25
25
|
|
|
@@ -30,18 +30,18 @@ def solution_for_ownership_layer(inner_solution: Program) -> Program:
|
|
|
30
30
|
|
|
31
31
|
@dataclass(frozen=True)
|
|
32
32
|
class OwnershipOuterPuzzle:
|
|
33
|
-
_match: Callable[[UncurriedPuzzle],
|
|
33
|
+
_match: Callable[[UncurriedPuzzle], PuzzleInfo | None]
|
|
34
34
|
_construct: Callable[[PuzzleInfo, Program], Program]
|
|
35
35
|
_solve: Callable[[PuzzleInfo, Solver, Program, Program], Program]
|
|
36
|
-
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle,
|
|
37
|
-
_get_inner_solution: Callable[[PuzzleInfo, Program],
|
|
36
|
+
_get_inner_puzzle: Callable[[PuzzleInfo, UncurriedPuzzle, Program | None], Program | None]
|
|
37
|
+
_get_inner_solution: Callable[[PuzzleInfo, Program], Program | None]
|
|
38
38
|
|
|
39
|
-
def match(self, puzzle: UncurriedPuzzle) ->
|
|
39
|
+
def match(self, puzzle: UncurriedPuzzle) -> PuzzleInfo | None:
|
|
40
40
|
matched, curried_args = match_ownership_layer_puzzle(puzzle)
|
|
41
41
|
if matched:
|
|
42
42
|
_, current_owner, transfer_program, inner_puzzle = curried_args
|
|
43
43
|
owner_bytes: bytes = current_owner.as_python()
|
|
44
|
-
tp_match:
|
|
44
|
+
tp_match: PuzzleInfo | None = self._match(uncurry_puzzle(transfer_program))
|
|
45
45
|
constructor_dict = {
|
|
46
46
|
"type": "ownership",
|
|
47
47
|
"owner": "()" if owner_bytes == b"" else "0x" + owner_bytes.hex(),
|
|
@@ -54,14 +54,14 @@ class OwnershipOuterPuzzle:
|
|
|
54
54
|
else:
|
|
55
55
|
return None
|
|
56
56
|
|
|
57
|
-
def asset_id(self, constructor: PuzzleInfo) ->
|
|
57
|
+
def asset_id(self, constructor: PuzzleInfo) -> bytes32 | None:
|
|
58
58
|
return None
|
|
59
59
|
|
|
60
60
|
def construct(self, constructor: PuzzleInfo, inner_puzzle: Program) -> Program:
|
|
61
61
|
also = constructor.also()
|
|
62
62
|
if also is not None:
|
|
63
63
|
inner_puzzle = self._construct(also, inner_puzzle)
|
|
64
|
-
transfer_program_info:
|
|
64
|
+
transfer_program_info: PuzzleInfo | Program = constructor["transfer_program"]
|
|
65
65
|
if isinstance(transfer_program_info, Program):
|
|
66
66
|
transfer_program: Program = transfer_program_info
|
|
67
67
|
else:
|
|
@@ -69,25 +69,25 @@ class OwnershipOuterPuzzle:
|
|
|
69
69
|
return puzzle_for_ownership_layer(constructor["owner"], transfer_program, inner_puzzle)
|
|
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
|
matched, curried_args = match_ownership_layer_puzzle(puzzle_reveal)
|
|
75
75
|
if matched:
|
|
76
76
|
_, _, _, inner_puzzle = curried_args
|
|
77
77
|
also = constructor.also()
|
|
78
78
|
if also is not None:
|
|
79
|
-
deep_inner_puzzle:
|
|
79
|
+
deep_inner_puzzle: Program | None = self._get_inner_puzzle(also, uncurry_puzzle(inner_puzzle), None)
|
|
80
80
|
return deep_inner_puzzle
|
|
81
81
|
else:
|
|
82
82
|
return inner_puzzle
|
|
83
83
|
else:
|
|
84
84
|
raise ValueError("This driver is not for the specified puzzle reveal")
|
|
85
85
|
|
|
86
|
-
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) ->
|
|
86
|
+
def get_inner_solution(self, constructor: PuzzleInfo, solution: Program) -> Program | None:
|
|
87
87
|
my_inner_solution: Program = solution.first()
|
|
88
88
|
also = constructor.also()
|
|
89
89
|
if also:
|
|
90
|
-
deep_inner_solution:
|
|
90
|
+
deep_inner_solution: Program | None = self._get_inner_solution(also, my_inner_solution)
|
|
91
91
|
return deep_inner_solution
|
|
92
92
|
else:
|
|
93
93
|
return my_inner_solution
|