chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/wallet/derive_keys.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Optional
|
|
4
4
|
|
|
5
5
|
from chia_rs import AugSchemeMPL, G1Element, PrivateKey
|
|
6
6
|
|
|
@@ -18,19 +18,19 @@ from chia.util.ints import uint32
|
|
|
18
18
|
MAX_POOL_WALLETS = 100
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
def _derive_path(sk: PrivateKey, path:
|
|
21
|
+
def _derive_path(sk: PrivateKey, path: list[int]) -> PrivateKey:
|
|
22
22
|
for index in path:
|
|
23
23
|
sk = AugSchemeMPL.derive_child_sk(sk, index)
|
|
24
24
|
return sk
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def _derive_path_unhardened(sk: PrivateKey, path:
|
|
27
|
+
def _derive_path_unhardened(sk: PrivateKey, path: list[int]) -> PrivateKey:
|
|
28
28
|
for index in path:
|
|
29
29
|
sk = AugSchemeMPL.derive_child_sk_unhardened(sk, index)
|
|
30
30
|
return sk
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
def _derive_pk_unhardened(pk: G1Element, path:
|
|
33
|
+
def _derive_pk_unhardened(pk: G1Element, path: list[int]) -> G1Element:
|
|
34
34
|
for index in path:
|
|
35
35
|
pk = AugSchemeMPL.derive_child_pk_unhardened(pk, index)
|
|
36
36
|
return pk
|
|
@@ -95,7 +95,7 @@ def master_sk_to_pooling_authentication_sk(master: PrivateKey, pool_wallet_index
|
|
|
95
95
|
return _derive_path(master, [12381, 8444, 6, pool_wallet_index * 10000 + index])
|
|
96
96
|
|
|
97
97
|
|
|
98
|
-
def find_owner_sk(all_sks:
|
|
98
|
+
def find_owner_sk(all_sks: list[PrivateKey], owner_pk: G1Element) -> Optional[tuple[PrivateKey, uint32]]:
|
|
99
99
|
for pool_wallet_index in range(MAX_POOL_WALLETS):
|
|
100
100
|
for sk in all_sks:
|
|
101
101
|
try_owner_sk = master_sk_to_singleton_owner_sk(sk, uint32(pool_wallet_index))
|
|
@@ -104,7 +104,7 @@ def find_owner_sk(all_sks: List[PrivateKey], owner_pk: G1Element) -> Optional[Tu
|
|
|
104
104
|
return None
|
|
105
105
|
|
|
106
106
|
|
|
107
|
-
def find_authentication_sk(all_sks:
|
|
107
|
+
def find_authentication_sk(all_sks: list[PrivateKey], owner_pk: G1Element) -> Optional[PrivateKey]:
|
|
108
108
|
# NOTE: might need to increase this if using a large number of wallets, or have switched authentication keys
|
|
109
109
|
# many times.
|
|
110
110
|
for pool_wallet_index in range(MAX_POOL_WALLETS):
|
|
@@ -117,8 +117,8 @@ def find_authentication_sk(all_sks: List[PrivateKey], owner_pk: G1Element) -> Op
|
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
def match_address_to_sk(
|
|
120
|
-
sk: PrivateKey, addresses_to_search:
|
|
121
|
-
) ->
|
|
120
|
+
sk: PrivateKey, addresses_to_search: list[bytes32], max_ph_to_search: int = 500
|
|
121
|
+
) -> set[bytes32]:
|
|
122
122
|
"""
|
|
123
123
|
Checks the list of given address is a derivation of the given sk within the given number of derivations
|
|
124
124
|
Returns a Set of the addresses that are derivations of the given sk
|
|
@@ -126,8 +126,8 @@ def match_address_to_sk(
|
|
|
126
126
|
if sk is None or not addresses_to_search:
|
|
127
127
|
return set()
|
|
128
128
|
|
|
129
|
-
found_addresses:
|
|
130
|
-
search_list:
|
|
129
|
+
found_addresses: set[bytes32] = set()
|
|
130
|
+
search_list: set[bytes32] = set(addresses_to_search)
|
|
131
131
|
|
|
132
132
|
for i in range(max_ph_to_search):
|
|
133
133
|
phs = [
|
|
@@ -139,7 +139,7 @@ def match_address_to_sk(
|
|
|
139
139
|
if address in phs:
|
|
140
140
|
found_addresses.add(address)
|
|
141
141
|
|
|
142
|
-
search_list
|
|
142
|
+
search_list -= found_addresses
|
|
143
143
|
if not len(search_list):
|
|
144
144
|
return found_addresses
|
|
145
145
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from chia.protocols.wallet_protocol import CoinState
|
|
7
7
|
from chia.types.blockchain_format.coin import Coin
|
|
@@ -16,9 +16,9 @@ from chia.wallet.lineage_proof import LineageProof
|
|
|
16
16
|
@dataclass(frozen=True)
|
|
17
17
|
class DIDInfo(Streamable):
|
|
18
18
|
origin_coin: Optional[Coin] # Coin ID of this coin is our DID
|
|
19
|
-
backup_ids:
|
|
19
|
+
backup_ids: list[bytes32]
|
|
20
20
|
num_of_backup_ids_needed: uint64
|
|
21
|
-
parent_info:
|
|
21
|
+
parent_info: list[tuple[bytes32, Optional[LineageProof]]] # {coin.name(): LineageProof}
|
|
22
22
|
current_inner: Optional[Program] # represents a Program as bytes
|
|
23
23
|
temp_coin: Optional[Coin] # partially recovered wallet uses these to hold info
|
|
24
24
|
temp_puzhash: Optional[bytes32]
|
|
@@ -5,7 +5,7 @@ import json
|
|
|
5
5
|
import logging
|
|
6
6
|
import re
|
|
7
7
|
import time
|
|
8
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
8
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
9
9
|
|
|
10
10
|
from chia_rs import AugSchemeMPL, G1Element, G2Element
|
|
11
11
|
|
|
@@ -77,12 +77,12 @@ class DIDWallet:
|
|
|
77
77
|
wallet: Wallet,
|
|
78
78
|
amount: uint64,
|
|
79
79
|
action_scope: WalletActionScope,
|
|
80
|
-
backups_ids:
|
|
80
|
+
backups_ids: list[bytes32] = [],
|
|
81
81
|
num_of_backup_ids_needed: uint64 = None,
|
|
82
|
-
metadata:
|
|
82
|
+
metadata: dict[str, str] = {},
|
|
83
83
|
name: Optional[str] = None,
|
|
84
84
|
fee: uint64 = uint64(0),
|
|
85
|
-
extra_conditions:
|
|
85
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
86
86
|
):
|
|
87
87
|
"""
|
|
88
88
|
Create a brand new DID wallet
|
|
@@ -142,7 +142,7 @@ class DIDWallet:
|
|
|
142
142
|
try:
|
|
143
143
|
await self.generate_new_decentralised_id(amount, action_scope, fee, extra_conditions)
|
|
144
144
|
except Exception:
|
|
145
|
-
await wallet_state_manager.
|
|
145
|
+
await wallet_state_manager.delete_wallet(self.id())
|
|
146
146
|
raise
|
|
147
147
|
|
|
148
148
|
await self.wallet_state_manager.add_new_wallet(self)
|
|
@@ -208,7 +208,6 @@ class DIDWallet:
|
|
|
208
208
|
:param name: Wallet name
|
|
209
209
|
:return: DID wallet
|
|
210
210
|
"""
|
|
211
|
-
|
|
212
211
|
self = DIDWallet()
|
|
213
212
|
self.wallet_state_manager = wallet_state_manager
|
|
214
213
|
if name is None:
|
|
@@ -226,7 +225,7 @@ class DIDWallet:
|
|
|
226
225
|
_, recovery_list_hash, num_verification, _, metadata = args
|
|
227
226
|
full_solution: Program = Program.from_bytes(bytes(coin_spend.solution))
|
|
228
227
|
inner_solution: Program = full_solution.rest().rest().first()
|
|
229
|
-
recovery_list:
|
|
228
|
+
recovery_list: list[bytes32] = []
|
|
230
229
|
backup_required: int = num_verification.as_int()
|
|
231
230
|
if recovery_list_hash != NIL_TREEHASH:
|
|
232
231
|
try:
|
|
@@ -269,7 +268,7 @@ class DIDWallet:
|
|
|
269
268
|
wallet_state_manager: Any,
|
|
270
269
|
wallet: Wallet,
|
|
271
270
|
wallet_info: WalletInfo,
|
|
272
|
-
name: str = None,
|
|
271
|
+
name: Optional[str] = None,
|
|
273
272
|
):
|
|
274
273
|
"""
|
|
275
274
|
Create a DID wallet based on the local database
|
|
@@ -317,6 +316,7 @@ class DIDWallet:
|
|
|
317
316
|
|
|
318
317
|
for record in unconfirmed_tx:
|
|
319
318
|
our_spend = False
|
|
319
|
+
# Need to check belonging with hint_dict
|
|
320
320
|
for coin in record.removals:
|
|
321
321
|
if await self.wallet_state_manager.does_coin_belong_to_wallet(coin, self.id()):
|
|
322
322
|
our_spend = True
|
|
@@ -326,7 +326,14 @@ class DIDWallet:
|
|
|
326
326
|
continue
|
|
327
327
|
|
|
328
328
|
for coin in record.additions:
|
|
329
|
-
|
|
329
|
+
hint_dict = {
|
|
330
|
+
coin_id: bytes32(memos[0])
|
|
331
|
+
for coin_id, memos in record.memos
|
|
332
|
+
if len(memos) > 0 and len(memos[0]) == 32
|
|
333
|
+
}
|
|
334
|
+
if (await self.wallet_state_manager.does_coin_belong_to_wallet(coin, self.id(), hint_dict)) and (
|
|
335
|
+
coin not in record.removals
|
|
336
|
+
):
|
|
330
337
|
addition_amount += coin.amount
|
|
331
338
|
|
|
332
339
|
return uint64(addition_amount)
|
|
@@ -338,7 +345,7 @@ class DIDWallet:
|
|
|
338
345
|
self,
|
|
339
346
|
amount: uint64,
|
|
340
347
|
action_scope: WalletActionScope,
|
|
341
|
-
) ->
|
|
348
|
+
) -> set[Coin]:
|
|
342
349
|
try:
|
|
343
350
|
async with action_scope.use() as interface:
|
|
344
351
|
coin = await self.get_coin()
|
|
@@ -528,14 +535,14 @@ class DIDWallet:
|
|
|
528
535
|
return create_singleton_puzzle(innerpuz, self.did_info.origin_coin.name())
|
|
529
536
|
else:
|
|
530
537
|
innerpuz = Program.to((8, 0))
|
|
531
|
-
return create_singleton_puzzle(innerpuz, bytes32
|
|
538
|
+
return create_singleton_puzzle(innerpuz, bytes32.zeros)
|
|
532
539
|
|
|
533
540
|
def puzzle_hash_for_pk(self, pubkey: G1Element) -> bytes32:
|
|
534
541
|
if self.did_info.origin_coin is None:
|
|
535
542
|
# TODO: this seem dumb. Why bother with this case? Is it ever used?
|
|
536
543
|
# inner puzzle: (8 . 0)
|
|
537
544
|
innerpuz_hash = shatree_pair(shatree_int(8), NIL_TREEHASH)
|
|
538
|
-
return create_singleton_puzzle_hash(innerpuz_hash, bytes32
|
|
545
|
+
return create_singleton_puzzle_hash(innerpuz_hash, bytes32.zeros)
|
|
539
546
|
origin_coin_name = self.did_info.origin_coin.name()
|
|
540
547
|
innerpuz_hash = did_wallet_puzzles.get_inner_puzhash_by_p2(
|
|
541
548
|
p2_puzhash=puzzle_hash_for_pk(pubkey),
|
|
@@ -546,11 +553,6 @@ class DIDWallet:
|
|
|
546
553
|
)
|
|
547
554
|
return create_singleton_puzzle_hash(innerpuz_hash, origin_coin_name)
|
|
548
555
|
|
|
549
|
-
async def get_new_puzzle(self) -> Program:
|
|
550
|
-
return self.puzzle_for_pk(
|
|
551
|
-
(await self.wallet_state_manager.get_unused_derivation_record(self.wallet_info.id)).pubkey
|
|
552
|
-
)
|
|
553
|
-
|
|
554
556
|
def get_my_DID(self) -> str:
|
|
555
557
|
assert self.did_info.origin_coin is not None
|
|
556
558
|
core = self.did_info.origin_coin.name()
|
|
@@ -569,12 +571,12 @@ class DIDWallet:
|
|
|
569
571
|
self,
|
|
570
572
|
action_scope: WalletActionScope,
|
|
571
573
|
fee: uint64 = uint64(0),
|
|
572
|
-
extra_conditions:
|
|
574
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
573
575
|
) -> None:
|
|
574
576
|
assert self.did_info.current_inner is not None
|
|
575
577
|
assert self.did_info.origin_coin is not None
|
|
576
578
|
coin = await self.get_coin()
|
|
577
|
-
new_inner_puzzle = await self.
|
|
579
|
+
new_inner_puzzle = await self.get_did_innerpuz(new=not action_scope.config.tx_config.reuse_puzhash)
|
|
578
580
|
uncurried = did_wallet_puzzles.uncurry_innerpuz(new_inner_puzzle)
|
|
579
581
|
assert uncurried is not None
|
|
580
582
|
p2_puzzle = uncurried[0]
|
|
@@ -668,7 +670,7 @@ class DIDWallet:
|
|
|
668
670
|
fee: uint64,
|
|
669
671
|
with_recovery: bool,
|
|
670
672
|
action_scope: WalletActionScope,
|
|
671
|
-
extra_conditions:
|
|
673
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
672
674
|
) -> None:
|
|
673
675
|
"""
|
|
674
676
|
Transfer the current DID to another owner
|
|
@@ -757,7 +759,7 @@ class DIDWallet:
|
|
|
757
759
|
async def create_message_spend(
|
|
758
760
|
self,
|
|
759
761
|
action_scope: WalletActionScope,
|
|
760
|
-
extra_conditions:
|
|
762
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
761
763
|
) -> None:
|
|
762
764
|
assert self.did_info.current_inner is not None
|
|
763
765
|
assert self.did_info.origin_coin is not None
|
|
@@ -890,8 +892,8 @@ class DIDWallet:
|
|
|
890
892
|
newpuz: bytes32,
|
|
891
893
|
pubkey: G1Element,
|
|
892
894
|
action_scope: WalletActionScope,
|
|
893
|
-
extra_conditions:
|
|
894
|
-
) ->
|
|
895
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
896
|
+
) -> tuple[WalletSpendBundle, str]:
|
|
895
897
|
"""
|
|
896
898
|
Create an attestment
|
|
897
899
|
TODO:
|
|
@@ -969,7 +971,7 @@ class DIDWallet:
|
|
|
969
971
|
attest_str += f"{self.did_info.current_inner.get_tree_hash().hex()}:{coin.amount}"
|
|
970
972
|
return message_spend_bundle, attest_str
|
|
971
973
|
|
|
972
|
-
async def get_info_for_recovery(self) -> Optional[
|
|
974
|
+
async def get_info_for_recovery(self) -> Optional[tuple[bytes32, bytes32, uint64]]:
|
|
973
975
|
assert self.did_info.current_inner is not None
|
|
974
976
|
assert self.did_info.origin_coin is not None
|
|
975
977
|
try:
|
|
@@ -981,7 +983,7 @@ class DIDWallet:
|
|
|
981
983
|
amount = uint64(coin.amount)
|
|
982
984
|
return (parent, innerpuzhash, amount)
|
|
983
985
|
|
|
984
|
-
async def load_attest_files_for_recovery_spend(self, attest_data:
|
|
986
|
+
async def load_attest_files_for_recovery_spend(self, attest_data: list[str]) -> tuple[list, WalletSpendBundle]:
|
|
985
987
|
spend_bundle_list = []
|
|
986
988
|
info_dict = {}
|
|
987
989
|
for attest in attest_data:
|
|
@@ -994,7 +996,7 @@ class DIDWallet:
|
|
|
994
996
|
new_sb = WalletSpendBundle.from_bytes(bytes.fromhex(info[1]))
|
|
995
997
|
spend_bundle_list.append(new_sb)
|
|
996
998
|
# info_dict {0xidentity: "(0xparent_info 0xinnerpuz amount)"}
|
|
997
|
-
my_recovery_list:
|
|
999
|
+
my_recovery_list: list[bytes32] = self.did_info.backup_ids
|
|
998
1000
|
|
|
999
1001
|
# convert info dict into recovery list - same order as wallet
|
|
1000
1002
|
info_list = []
|
|
@@ -1016,7 +1018,7 @@ class DIDWallet:
|
|
|
1016
1018
|
self,
|
|
1017
1019
|
coin: Coin,
|
|
1018
1020
|
puzhash: bytes32,
|
|
1019
|
-
parent_innerpuzhash_amounts_for_recovery_ids:
|
|
1021
|
+
parent_innerpuzhash_amounts_for_recovery_ids: list[tuple[bytes, bytes, int]],
|
|
1020
1022
|
pubkey: G1Element,
|
|
1021
1023
|
spend_bundle: WalletSpendBundle,
|
|
1022
1024
|
action_scope: WalletActionScope,
|
|
@@ -1095,14 +1097,13 @@ class DIDWallet:
|
|
|
1095
1097
|
)
|
|
1096
1098
|
await self.save_info(new_did_info)
|
|
1097
1099
|
|
|
1098
|
-
async def
|
|
1099
|
-
|
|
1100
|
-
return puzzle.get_tree_hash()
|
|
1100
|
+
async def get_p2_inner_hash(self, new: bool) -> bytes32:
|
|
1101
|
+
return await self.standard_wallet.get_puzzle_hash(new=new)
|
|
1101
1102
|
|
|
1102
|
-
async def
|
|
1103
|
-
return await self.standard_wallet.
|
|
1103
|
+
async def get_p2_inner_puzzle(self, new: bool) -> Program:
|
|
1104
|
+
return await self.standard_wallet.get_puzzle(new=new)
|
|
1104
1105
|
|
|
1105
|
-
async def
|
|
1106
|
+
async def get_did_innerpuz(self, new: bool, origin_id: Optional[bytes32] = None) -> Program:
|
|
1106
1107
|
if self.did_info.origin_coin is not None:
|
|
1107
1108
|
launcher_id = self.did_info.origin_coin.name()
|
|
1108
1109
|
elif origin_id is not None:
|
|
@@ -1110,15 +1111,15 @@ class DIDWallet:
|
|
|
1110
1111
|
else:
|
|
1111
1112
|
raise ValueError("must have origin coin")
|
|
1112
1113
|
return did_wallet_puzzles.create_innerpuz(
|
|
1113
|
-
p2_puzzle_or_hash=await self.
|
|
1114
|
+
p2_puzzle_or_hash=await self.get_p2_inner_puzzle(new=new),
|
|
1114
1115
|
recovery_list=self.did_info.backup_ids,
|
|
1115
1116
|
num_of_backup_ids_needed=self.did_info.num_of_backup_ids_needed,
|
|
1116
1117
|
launcher_id=launcher_id,
|
|
1117
1118
|
metadata=did_wallet_puzzles.metadata_to_program(json.loads(self.did_info.metadata)),
|
|
1118
1119
|
)
|
|
1119
1120
|
|
|
1120
|
-
async def
|
|
1121
|
-
innerpuz = await self.
|
|
1121
|
+
async def get_did_inner_hash(self, new: bool) -> bytes32:
|
|
1122
|
+
innerpuz = await self.get_did_innerpuz(new=new)
|
|
1122
1123
|
return innerpuz.get_tree_hash()
|
|
1123
1124
|
|
|
1124
1125
|
async def get_innerpuz_for_new_innerhash(self, pubkey: G1Element):
|
|
@@ -1174,7 +1175,7 @@ class DIDWallet:
|
|
|
1174
1175
|
|
|
1175
1176
|
return parent_info
|
|
1176
1177
|
|
|
1177
|
-
async def sign_message(self, message: str, mode: SigningMode) ->
|
|
1178
|
+
async def sign_message(self, message: str, mode: SigningMode) -> tuple[G1Element, G2Element]:
|
|
1178
1179
|
if self.did_info.current_inner is None:
|
|
1179
1180
|
raise ValueError("Missing DID inner puzzle.")
|
|
1180
1181
|
puzzle_args = did_wallet_puzzles.uncurry_innerpuz(self.did_info.current_inner)
|
|
@@ -1201,7 +1202,7 @@ class DIDWallet:
|
|
|
1201
1202
|
amount: uint64,
|
|
1202
1203
|
action_scope: WalletActionScope,
|
|
1203
1204
|
fee: uint64 = uint64(0),
|
|
1204
|
-
extra_conditions:
|
|
1205
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1205
1206
|
) -> None:
|
|
1206
1207
|
"""
|
|
1207
1208
|
This must be called under the wallet state manager lock
|
|
@@ -1213,7 +1214,9 @@ class DIDWallet:
|
|
|
1213
1214
|
genesis_launcher_puz = SINGLETON_LAUNCHER_PUZZLE
|
|
1214
1215
|
launcher_coin = Coin(origin.name(), genesis_launcher_puz.get_tree_hash(), amount)
|
|
1215
1216
|
|
|
1216
|
-
did_inner: Program = await self.
|
|
1217
|
+
did_inner: Program = await self.get_did_innerpuz(
|
|
1218
|
+
new=not action_scope.config.tx_config.reuse_puzhash, origin_id=launcher_coin.name()
|
|
1219
|
+
)
|
|
1217
1220
|
did_inner_hash = did_inner.get_tree_hash()
|
|
1218
1221
|
did_full_puz = create_singleton_puzzle(did_inner, launcher_coin.name())
|
|
1219
1222
|
did_puzzle_hash = did_full_puz.get_tree_hash()
|
|
@@ -1298,7 +1301,7 @@ class DIDWallet:
|
|
|
1298
1301
|
coin: Coin,
|
|
1299
1302
|
full_puzzle: Program,
|
|
1300
1303
|
innerpuz: Program,
|
|
1301
|
-
extra_conditions:
|
|
1304
|
+
extra_conditions: tuple[Condition, ...] = tuple(),
|
|
1302
1305
|
):
|
|
1303
1306
|
assert self.did_info.origin_coin is not None
|
|
1304
1307
|
uncurried = did_wallet_puzzles.uncurry_innerpuz(innerpuz)
|
|
@@ -1328,9 +1331,11 @@ class DIDWallet:
|
|
|
1328
1331
|
)
|
|
1329
1332
|
return spendable_am
|
|
1330
1333
|
|
|
1331
|
-
async def get_max_send_amount(self, records: Optional[
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
+
async def get_max_send_amount(self, records: Optional[set[WalletCoinRecord]] = None):
|
|
1335
|
+
spendable: list[WalletCoinRecord] = list(
|
|
1336
|
+
await self.wallet_state_manager.get_spendable_coins_for_wallet(self.id(), records)
|
|
1337
|
+
)
|
|
1338
|
+
max_send_amount = sum(cr.coin.amount for cr in spendable)
|
|
1334
1339
|
return max_send_amount
|
|
1335
1340
|
|
|
1336
1341
|
async def add_parent(self, name: bytes32, parent: Optional[LineageProof]):
|
|
@@ -1351,7 +1356,7 @@ class DIDWallet:
|
|
|
1351
1356
|
)
|
|
1352
1357
|
await self.save_info(did_info)
|
|
1353
1358
|
|
|
1354
|
-
async def update_recovery_list(self, recover_list:
|
|
1359
|
+
async def update_recovery_list(self, recover_list: list[bytes32], num_of_backup_ids_needed: uint64) -> bool:
|
|
1355
1360
|
if num_of_backup_ids_needed > len(recover_list):
|
|
1356
1361
|
return False
|
|
1357
1362
|
did_info = DIDInfo(
|
|
@@ -1370,7 +1375,7 @@ class DIDWallet:
|
|
|
1370
1375
|
await self.wallet_state_manager.update_wallet_puzzle_hashes(self.wallet_info.id)
|
|
1371
1376
|
return True
|
|
1372
1377
|
|
|
1373
|
-
async def update_metadata(self, metadata:
|
|
1378
|
+
async def update_metadata(self, metadata: dict[str, str]) -> bool:
|
|
1374
1379
|
# validate metadata
|
|
1375
1380
|
if not all(isinstance(k, str) and isinstance(v, str) for k, v in metadata.items()):
|
|
1376
1381
|
raise ValueError("Metadata key value pairs must be strings.")
|
|
@@ -1441,7 +1446,11 @@ class DIDWallet:
|
|
|
1441
1446
|
if num_of_backup_ids_needed > len(backup_ids):
|
|
1442
1447
|
raise Exception
|
|
1443
1448
|
innerpuz: Program = Program.from_bytes(bytes.fromhex(details[4]))
|
|
1444
|
-
metadata: str =
|
|
1449
|
+
metadata: str = ""
|
|
1450
|
+
for d in details[6:]:
|
|
1451
|
+
metadata = metadata + d + ":"
|
|
1452
|
+
if len(metadata) > 0:
|
|
1453
|
+
metadata = metadata[:-1]
|
|
1445
1454
|
did_info = DIDInfo(
|
|
1446
1455
|
origin_coin=origin,
|
|
1447
1456
|
backup_ids=backup_ids,
|
|
@@ -1460,7 +1469,7 @@ class DIDWallet:
|
|
|
1460
1469
|
return True
|
|
1461
1470
|
|
|
1462
1471
|
async def get_coin(self) -> Coin:
|
|
1463
|
-
spendable_coins:
|
|
1472
|
+
spendable_coins: set[WalletCoinRecord] = await self.wallet_state_manager.get_spendable_coins_for_wallet(
|
|
1464
1473
|
self.wallet_info.id
|
|
1465
1474
|
)
|
|
1466
1475
|
if len(spendable_coins) == 0:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Iterator
|
|
4
|
+
from typing import Optional, Union
|
|
4
5
|
|
|
5
6
|
from chia_rs import G1Element
|
|
6
7
|
|
|
@@ -40,7 +41,7 @@ INTERMEDIATE_LAUNCHER_MOD = load_clvm_maybe_recompile(
|
|
|
40
41
|
|
|
41
42
|
def create_innerpuz(
|
|
42
43
|
p2_puzzle_or_hash: Union[Program, bytes32],
|
|
43
|
-
recovery_list:
|
|
44
|
+
recovery_list: list[bytes32],
|
|
44
45
|
num_of_backup_ids_needed: uint64,
|
|
45
46
|
launcher_id: bytes32,
|
|
46
47
|
metadata: Program = Program.to([]),
|
|
@@ -69,7 +70,7 @@ def create_innerpuz(
|
|
|
69
70
|
|
|
70
71
|
def get_inner_puzhash_by_p2(
|
|
71
72
|
p2_puzhash: bytes32,
|
|
72
|
-
recovery_list:
|
|
73
|
+
recovery_list: list[bytes32],
|
|
73
74
|
num_of_backup_ids_needed: uint64,
|
|
74
75
|
launcher_id: bytes32,
|
|
75
76
|
metadata: Program = Program.to([]),
|
|
@@ -111,7 +112,7 @@ def is_did_innerpuz(inner_f: Program) -> bool:
|
|
|
111
112
|
return inner_f == DID_INNERPUZ_MOD
|
|
112
113
|
|
|
113
114
|
|
|
114
|
-
def uncurry_innerpuz(puzzle: Program) -> Optional[
|
|
115
|
+
def uncurry_innerpuz(puzzle: Program) -> Optional[tuple[Program, Program, Program, Program, Program]]:
|
|
115
116
|
"""
|
|
116
117
|
Uncurry a DID inner puzzle
|
|
117
118
|
:param puzzle: DID puzzle
|
|
@@ -196,7 +197,7 @@ def check_is_did_puzzle(puzzle: Program) -> bool:
|
|
|
196
197
|
return is_singleton(inner_f)
|
|
197
198
|
|
|
198
199
|
|
|
199
|
-
def metadata_to_program(metadata:
|
|
200
|
+
def metadata_to_program(metadata: dict[str, str]) -> Program:
|
|
200
201
|
"""
|
|
201
202
|
Convert the metadata dict to a Chialisp program
|
|
202
203
|
:param metadata: User defined metadata
|
|
@@ -208,7 +209,7 @@ def metadata_to_program(metadata: Dict[str, str]) -> Program:
|
|
|
208
209
|
return Program.to(kv_list)
|
|
209
210
|
|
|
210
211
|
|
|
211
|
-
def did_program_to_metadata(program: Program) ->
|
|
212
|
+
def did_program_to_metadata(program: Program) -> dict[str, str]:
|
|
212
213
|
"""
|
|
213
214
|
Convert a program to a metadata dict
|
|
214
215
|
:param program: Chialisp program contains the metadata
|
chia/wallet/lineage_proof.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from enum import Enum
|
|
5
|
-
from typing import Any,
|
|
5
|
+
from typing import Any, Optional
|
|
6
6
|
|
|
7
7
|
from chia.types.blockchain_format.program import Program
|
|
8
8
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -24,8 +24,8 @@ class LineageProof(Streamable):
|
|
|
24
24
|
amount: Optional[uint64] = None
|
|
25
25
|
|
|
26
26
|
@classmethod
|
|
27
|
-
def from_program(cls, program: Program, fields:
|
|
28
|
-
lineage_proof_info:
|
|
27
|
+
def from_program(cls, program: Program, fields: list[LineageProofField]) -> LineageProof:
|
|
28
|
+
lineage_proof_info: dict[str, Any] = {}
|
|
29
29
|
field_iter = iter(fields)
|
|
30
30
|
program_iter = program.as_iter()
|
|
31
31
|
for program_value in program_iter:
|
|
@@ -45,7 +45,7 @@ class LineageProof(Streamable):
|
|
|
45
45
|
return LineageProof(**lineage_proof_info)
|
|
46
46
|
|
|
47
47
|
def to_program(self) -> Program:
|
|
48
|
-
final_list:
|
|
48
|
+
final_list: list[Any] = []
|
|
49
49
|
if self.parent_name is not None:
|
|
50
50
|
final_list.append(self.parent_name)
|
|
51
51
|
if self.inner_puzzle_hash is not None:
|
|
@@ -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
|
|
@@ -15,7 +15,7 @@ NFT_STATE_LAYER_MOD = load_clvm_maybe_recompile(
|
|
|
15
15
|
NFT_STATE_LAYER_MOD_HASH = NFT_STATE_LAYER_MOD.get_tree_hash()
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
def match_metadata_layer_puzzle(puzzle: UncurriedPuzzle) ->
|
|
18
|
+
def match_metadata_layer_puzzle(puzzle: UncurriedPuzzle) -> tuple[bool, list[Program]]:
|
|
19
19
|
if puzzle.mod == NFT_STATE_LAYER_MOD:
|
|
20
20
|
return True, list(puzzle.args.as_iter())
|
|
21
21
|
return False, []
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.coin import Coin
|
|
7
7
|
from chia.types.blockchain_format.program import Program
|
|
@@ -40,19 +40,19 @@ class NFTInfo(Streamable):
|
|
|
40
40
|
|
|
41
41
|
royalty_puzzle_hash: Optional[bytes32]
|
|
42
42
|
"""Puzzle hash where royalty will be sent to"""
|
|
43
|
-
data_uris:
|
|
43
|
+
data_uris: list[str]
|
|
44
44
|
""" A list of content URIs"""
|
|
45
45
|
|
|
46
46
|
data_hash: bytes
|
|
47
47
|
"""Hash of the content"""
|
|
48
48
|
|
|
49
|
-
metadata_uris:
|
|
49
|
+
metadata_uris: list[str]
|
|
50
50
|
"""A list of metadata URIs"""
|
|
51
51
|
|
|
52
52
|
metadata_hash: bytes
|
|
53
53
|
"""Hash of the metadata"""
|
|
54
54
|
|
|
55
|
-
license_uris:
|
|
55
|
+
license_uris: list[str]
|
|
56
56
|
"""A list of license URIs"""
|
|
57
57
|
|
|
58
58
|
license_hash: bytes
|
|
@@ -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, Literal, Optional, Union
|
|
5
5
|
|
|
6
6
|
from clvm_tools.binutils import disassemble
|
|
7
7
|
|
|
@@ -86,7 +86,7 @@ def create_full_puzzle(
|
|
|
86
86
|
return full_puzzle
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config:
|
|
89
|
+
async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: dict[str, Any]) -> NFTInfo:
|
|
90
90
|
"""
|
|
91
91
|
Extract NFT info from a full puzzle
|
|
92
92
|
:param nft_coin_info NFTCoinInfo in local database
|
|
@@ -96,15 +96,15 @@ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: Dict[str,
|
|
|
96
96
|
"""
|
|
97
97
|
uncurried_nft: Optional[UncurriedNFT] = UncurriedNFT.uncurry(*nft_coin_info.full_puzzle.uncurry())
|
|
98
98
|
assert uncurried_nft is not None
|
|
99
|
-
data_uris:
|
|
99
|
+
data_uris: list[str] = []
|
|
100
100
|
|
|
101
|
-
for uri in uncurried_nft.data_uris.as_python():
|
|
101
|
+
for uri in uncurried_nft.data_uris.as_python():
|
|
102
102
|
data_uris.append(str(uri, "utf-8"))
|
|
103
|
-
meta_uris:
|
|
104
|
-
for uri in uncurried_nft.meta_uris.as_python():
|
|
103
|
+
meta_uris: list[str] = []
|
|
104
|
+
for uri in uncurried_nft.meta_uris.as_python():
|
|
105
105
|
meta_uris.append(str(uri, "utf-8"))
|
|
106
|
-
license_uris:
|
|
107
|
-
for uri in uncurried_nft.license_uris.as_python():
|
|
106
|
+
license_uris: list[str] = []
|
|
107
|
+
for uri in uncurried_nft.license_uris.as_python():
|
|
108
108
|
license_uris.append(str(uri, "utf-8"))
|
|
109
109
|
off_chain_metadata: Optional[str] = None
|
|
110
110
|
nft_info = NFTInfo(
|
|
@@ -135,7 +135,7 @@ async def get_nft_info_from_puzzle(nft_coin_info: NFTCoinInfo, config: Dict[str,
|
|
|
135
135
|
return nft_info
|
|
136
136
|
|
|
137
137
|
|
|
138
|
-
def metadata_to_program(metadata:
|
|
138
|
+
def metadata_to_program(metadata: dict[bytes, Any]) -> Program:
|
|
139
139
|
"""
|
|
140
140
|
Convert the metadata dict to a Chialisp program
|
|
141
141
|
:param metadata: User defined metadata
|
|
@@ -148,7 +148,7 @@ def metadata_to_program(metadata: Dict[bytes, Any]) -> Program:
|
|
|
148
148
|
return program
|
|
149
149
|
|
|
150
150
|
|
|
151
|
-
def nft_program_to_metadata(program: Program) ->
|
|
151
|
+
def nft_program_to_metadata(program: Program) -> dict[bytes, Any]:
|
|
152
152
|
"""
|
|
153
153
|
Convert a program to a metadata dict
|
|
154
154
|
:param program: Chialisp program contains the metadata
|
|
@@ -160,7 +160,7 @@ def nft_program_to_metadata(program: Program) -> Dict[bytes, Any]:
|
|
|
160
160
|
return metadata
|
|
161
161
|
|
|
162
162
|
|
|
163
|
-
def prepend_value(key: bytes, value: Program, metadata:
|
|
163
|
+
def prepend_value(key: bytes, value: Program, metadata: dict[bytes, Any]) -> None:
|
|
164
164
|
"""
|
|
165
165
|
Prepend a value to a list in the metadata
|
|
166
166
|
:param key: Key of the field
|
|
@@ -182,7 +182,7 @@ def update_metadata(metadata: Program, update_condition: Program) -> Program:
|
|
|
182
182
|
:param update_condition: Update metadata conditions
|
|
183
183
|
:return: Updated metadata
|
|
184
184
|
"""
|
|
185
|
-
new_metadata:
|
|
185
|
+
new_metadata: dict[bytes, Any] = nft_program_to_metadata(metadata)
|
|
186
186
|
uri: Program = update_condition.rest().rest().first()
|
|
187
187
|
prepend_value(uri.first().as_python(), uri.rest(), new_metadata)
|
|
188
188
|
return metadata_to_program(new_metadata)
|
|
@@ -223,7 +223,7 @@ def create_ownership_layer_puzzle(
|
|
|
223
223
|
|
|
224
224
|
|
|
225
225
|
def create_ownership_layer_transfer_solution(
|
|
226
|
-
new_did: bytes, new_did_inner_hash: bytes, trade_prices_list:
|
|
226
|
+
new_did: bytes, new_did_inner_hash: bytes, trade_prices_list: list[list[int]], new_puzhash: bytes32
|
|
227
227
|
) -> Program:
|
|
228
228
|
log.debug(
|
|
229
229
|
"Creating a transfer solution with: DID:%s Inner_puzhash:%s trade_price:%s puzhash:%s",
|
|
@@ -239,7 +239,7 @@ def create_ownership_layer_transfer_solution(
|
|
|
239
239
|
return solution
|
|
240
240
|
|
|
241
241
|
|
|
242
|
-
def get_metadata_and_phs(unft: UncurriedNFT, solution: SerializedProgram) ->
|
|
242
|
+
def get_metadata_and_phs(unft: UncurriedNFT, solution: SerializedProgram) -> tuple[Program, bytes32]:
|
|
243
243
|
conditions = unft.p2_puzzle.run(unft.get_innermost_solution(solution.to_program()))
|
|
244
244
|
metadata = unft.metadata
|
|
245
245
|
puzhash_for_derivation: Optional[bytes32] = None
|
|
@@ -291,9 +291,9 @@ def recurry_nft_puzzle(unft: UncurriedNFT, solution: Program, new_inner_puzzle:
|
|
|
291
291
|
return new_ownership_puzzle
|
|
292
292
|
|
|
293
293
|
|
|
294
|
-
def get_new_owner_did(unft: UncurriedNFT, solution: Program) -> Union[
|
|
294
|
+
def get_new_owner_did(unft: UncurriedNFT, solution: Program) -> Union[Literal[b""], bytes32, None]:
|
|
295
295
|
conditions = unft.p2_puzzle.run(unft.get_innermost_solution(solution))
|
|
296
|
-
new_did_id: Union[
|
|
296
|
+
new_did_id: Union[Literal[b""], bytes32, None] = None
|
|
297
297
|
for condition in conditions.as_iter():
|
|
298
298
|
if condition.first().as_int() == -10:
|
|
299
299
|
# this is the change owner magic condition
|