chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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_blockchain_transactions.py +5 -2
- 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 +66 -31
- 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 +273 -70
- chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
- 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 +198 -30
- chia/_tests/core/mempool/test_mempool.py +54 -50
- 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 +988 -854
- 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 +9 -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 +63 -60
- 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 +17 -17
- 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 +16 -15
- 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 +374 -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 +19 -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 +50 -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 +239 -223
- chia/full_node/full_node_api.py +197 -152
- chia/full_node/full_node_rpc_api.py +34 -32
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hard_fork_utils.py +44 -0
- 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 +120 -36
- 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 +4 -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 +24 -10
- 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 +142 -106
- 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.6.0rc2.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
- 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.6.0rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
|
@@ -2,12 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
|
-
from chia_rs import AugSchemeMPL, CoinSpend, G1Element, G2Element
|
|
8
|
+
from chia_rs import AugSchemeMPL, Coin, CoinSpend, G1Element, G2Element
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
10
|
-
from chia_rs.sized_ints import uint16, uint32, uint64
|
|
10
|
+
from chia_rs.sized_ints import uint8, uint16, uint32, uint64
|
|
11
11
|
|
|
12
12
|
from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
|
|
13
13
|
from chia._tests.util.time_out_assert import time_out_assert
|
|
@@ -21,18 +21,23 @@ from chia.types.signing_mode import CHIP_0002_SIGN_MESSAGE_PREFIX
|
|
|
21
21
|
from chia.util.bech32m import encode_puzzle_hash
|
|
22
22
|
from chia.util.byte_types import hexstr_to_bytes
|
|
23
23
|
from chia.util.errors import Err
|
|
24
|
-
from chia.wallet.conditions import ConditionValidTimes
|
|
25
24
|
from chia.wallet.derive_keys import master_sk_to_wallet_sk
|
|
26
25
|
from chia.wallet.estimate_fees import estimate_fees
|
|
27
26
|
from chia.wallet.puzzles.clawback.metadata import AutoClaimSettings
|
|
28
|
-
from chia.wallet.transaction_record import TransactionRecord
|
|
29
27
|
from chia.wallet.util.compute_additions import compute_additions
|
|
30
28
|
from chia.wallet.util.query_filter import TransactionTypeFilter
|
|
31
29
|
from chia.wallet.util.transaction_type import TransactionType
|
|
32
30
|
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
33
|
-
from chia.wallet.util.wallet_types import CoinType
|
|
31
|
+
from chia.wallet.util.wallet_types import CoinType, WalletType
|
|
32
|
+
from chia.wallet.wallet_coin_store import GetCoinRecords
|
|
34
33
|
from chia.wallet.wallet_node import WalletNode, get_wallet_db_path
|
|
35
|
-
from chia.wallet.wallet_request_types import
|
|
34
|
+
from chia.wallet.wallet_request_types import (
|
|
35
|
+
ClawbackPuzzleDecoratorOverride,
|
|
36
|
+
GetTransactionMemo,
|
|
37
|
+
GetTransactions,
|
|
38
|
+
SendTransaction,
|
|
39
|
+
SpendClawbackCoins,
|
|
40
|
+
)
|
|
36
41
|
|
|
37
42
|
|
|
38
43
|
class TestWalletSimulator:
|
|
@@ -169,6 +174,120 @@ class TestWalletSimulator:
|
|
|
169
174
|
]
|
|
170
175
|
)
|
|
171
176
|
|
|
177
|
+
@pytest.mark.parametrize(
|
|
178
|
+
"wallet_environments",
|
|
179
|
+
[{"num_environments": 2, "blocks_needed": [1, 1], "reuse_puzhash": True}],
|
|
180
|
+
indirect=True,
|
|
181
|
+
)
|
|
182
|
+
@pytest.mark.limit_consensus_modes(reason="irrelevant")
|
|
183
|
+
@pytest.mark.anyio
|
|
184
|
+
async def test_wallet_clawback_errors(self, wallet_environments: WalletTestFramework) -> None:
|
|
185
|
+
env_1 = wallet_environments.environments[0]
|
|
186
|
+
env_2 = wallet_environments.environments[1]
|
|
187
|
+
env_1.wallet_aliases = {"xch": 1}
|
|
188
|
+
env_2.wallet_aliases = {"xch": 1}
|
|
189
|
+
|
|
190
|
+
async with env_2.wallet_state_manager.new_action_scope(
|
|
191
|
+
wallet_environments.tx_config, push=True
|
|
192
|
+
) as action_scope:
|
|
193
|
+
wallet_2_puzhash = await action_scope.get_puzzle_hash(env_2.wallet_state_manager)
|
|
194
|
+
|
|
195
|
+
send_response = await env_1.rpc_client.send_transaction(
|
|
196
|
+
SendTransaction(
|
|
197
|
+
wallet_id=uint32(1),
|
|
198
|
+
amount=uint64(500),
|
|
199
|
+
address=encode_puzzle_hash(wallet_2_puzhash, "txch"),
|
|
200
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
|
|
201
|
+
push=True,
|
|
202
|
+
),
|
|
203
|
+
tx_config=wallet_environments.tx_config,
|
|
204
|
+
)
|
|
205
|
+
clawback_coin_id = send_response.transactions[0].additions[0].name()
|
|
206
|
+
|
|
207
|
+
await wallet_environments.process_pending_states(
|
|
208
|
+
[
|
|
209
|
+
WalletStateTransition(
|
|
210
|
+
pre_block_balance_updates={"xch": {"set_remainder": True}},
|
|
211
|
+
post_block_balance_updates={"xch": {"set_remainder": True}},
|
|
212
|
+
),
|
|
213
|
+
WalletStateTransition(
|
|
214
|
+
pre_block_balance_updates={"xch": {"set_remainder": True}},
|
|
215
|
+
post_block_balance_updates={"xch": {"set_remainder": True}},
|
|
216
|
+
),
|
|
217
|
+
]
|
|
218
|
+
)
|
|
219
|
+
await wallet_environments.full_node.farm_blocks_to_puzzlehash(1) # make clawback expire
|
|
220
|
+
|
|
221
|
+
# no transaction from invalid coins specified
|
|
222
|
+
resp = await env_2.rpc_client.spend_clawback_coins(
|
|
223
|
+
SpendClawbackCoins(coin_ids=[bytes32.zeros]), tx_config=wallet_environments.tx_config
|
|
224
|
+
)
|
|
225
|
+
assert resp.transaction_ids == []
|
|
226
|
+
|
|
227
|
+
# no transaction from invalid wallet specified
|
|
228
|
+
coin_record = await env_2.wallet_state_manager.coin_store.get_coin_record(clawback_coin_id)
|
|
229
|
+
assert coin_record is not None
|
|
230
|
+
await env_2.wallet_state_manager.coin_store.add_coin_record(
|
|
231
|
+
dataclasses.replace(coin_record, wallet_type=WalletType.CAT)
|
|
232
|
+
)
|
|
233
|
+
resp = await env_2.rpc_client.spend_clawback_coins(
|
|
234
|
+
SpendClawbackCoins(coin_ids=[clawback_coin_id]), tx_config=wallet_environments.tx_config
|
|
235
|
+
)
|
|
236
|
+
assert resp.transaction_ids == []
|
|
237
|
+
|
|
238
|
+
# no transaction from missing metadata
|
|
239
|
+
await env_2.wallet_state_manager.coin_store.add_coin_record(dataclasses.replace(coin_record, metadata=None))
|
|
240
|
+
resp = await env_2.rpc_client.spend_clawback_coins(
|
|
241
|
+
SpendClawbackCoins(coin_ids=[clawback_coin_id]), tx_config=wallet_environments.tx_config
|
|
242
|
+
)
|
|
243
|
+
assert resp.transaction_ids == []
|
|
244
|
+
|
|
245
|
+
# reset
|
|
246
|
+
await env_2.wallet_state_manager.coin_store.add_coin_record(coin_record)
|
|
247
|
+
|
|
248
|
+
# no transaction from missing corresponding TX record
|
|
249
|
+
fake_coin = Coin(coin_record.coin.parent_coin_info, bytes32.zeros, coin_record.coin.amount)
|
|
250
|
+
fake_coin_id = fake_coin.name()
|
|
251
|
+
await env_2.wallet_state_manager.coin_store.add_coin_record(dataclasses.replace(coin_record, coin=fake_coin))
|
|
252
|
+
resp = await env_2.rpc_client.spend_clawback_coins(
|
|
253
|
+
SpendClawbackCoins(coin_ids=[fake_coin_id]), tx_config=wallet_environments.tx_config
|
|
254
|
+
)
|
|
255
|
+
assert resp.transaction_ids == []
|
|
256
|
+
|
|
257
|
+
# no transaction from coin that doesn't belong to wallet
|
|
258
|
+
farmed_tx = (await env_2.wallet_state_manager.tx_store.get_farming_rewards())[0]
|
|
259
|
+
await env_2.wallet_state_manager.tx_store.add_transaction_record(
|
|
260
|
+
dataclasses.replace(farmed_tx, name=fake_coin_id)
|
|
261
|
+
)
|
|
262
|
+
resp = await env_2.rpc_client.spend_clawback_coins(
|
|
263
|
+
SpendClawbackCoins(coin_ids=[fake_coin_id]), tx_config=wallet_environments.tx_config
|
|
264
|
+
)
|
|
265
|
+
assert resp.transaction_ids == []
|
|
266
|
+
|
|
267
|
+
# reset and claim the coin
|
|
268
|
+
await env_2.wallet_state_manager.coin_store.add_coin_record(coin_record)
|
|
269
|
+
resp = await env_2.rpc_client.spend_clawback_coins(
|
|
270
|
+
SpendClawbackCoins(coin_ids=[clawback_coin_id], push=True), tx_config=wallet_environments.tx_config
|
|
271
|
+
)
|
|
272
|
+
await wallet_environments.process_pending_states(
|
|
273
|
+
[
|
|
274
|
+
WalletStateTransition(
|
|
275
|
+
pre_block_balance_updates={"xch": {"set_remainder": True}},
|
|
276
|
+
post_block_balance_updates={"xch": {"set_remainder": True}},
|
|
277
|
+
),
|
|
278
|
+
WalletStateTransition(
|
|
279
|
+
pre_block_balance_updates={"xch": {"set_remainder": True}},
|
|
280
|
+
post_block_balance_updates={"xch": {"set_remainder": True}},
|
|
281
|
+
),
|
|
282
|
+
]
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
# no transaction for attempting to claim a coin already claimed
|
|
286
|
+
resp = await env_2.rpc_client.spend_clawback_coins(
|
|
287
|
+
SpendClawbackCoins(coin_ids=[clawback_coin_id]), tx_config=wallet_environments.tx_config
|
|
288
|
+
)
|
|
289
|
+
assert resp.transaction_ids == []
|
|
290
|
+
|
|
172
291
|
@pytest.mark.parametrize(
|
|
173
292
|
"wallet_environments",
|
|
174
293
|
[{"num_environments": 2, "blocks_needed": [2, 1], "reuse_puzhash": True}],
|
|
@@ -182,25 +301,27 @@ class TestWalletSimulator:
|
|
|
182
301
|
) -> None:
|
|
183
302
|
env = wallet_environments.environments[0]
|
|
184
303
|
env_1 = wallet_environments.environments[1]
|
|
185
|
-
wallet = env.xch_wallet
|
|
186
|
-
wallet_1 = env_1.xch_wallet
|
|
187
304
|
wsm = env.wallet_state_manager
|
|
188
305
|
wsm_1 = env_1.wallet_state_manager
|
|
189
306
|
|
|
190
307
|
tx_amount = 500
|
|
191
|
-
async with
|
|
192
|
-
normal_puzhash = await action_scope.get_puzzle_hash(
|
|
308
|
+
async with env_1.xch_wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
309
|
+
normal_puzhash = await action_scope.get_puzzle_hash(env_1.xch_wallet.wallet_state_manager)
|
|
193
310
|
|
|
194
311
|
# Transfer to normal wallet
|
|
195
312
|
for _ in range(number_of_coins):
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
313
|
+
await env.rpc_client.send_transaction(
|
|
314
|
+
SendTransaction(
|
|
315
|
+
wallet_id=env.xch_wallet.id(),
|
|
316
|
+
amount=uint64(tx_amount),
|
|
317
|
+
address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
|
|
318
|
+
puzzle_decorator=[
|
|
319
|
+
ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(10))
|
|
320
|
+
],
|
|
321
|
+
push=True,
|
|
322
|
+
),
|
|
323
|
+
wallet_environments.tx_config,
|
|
324
|
+
)
|
|
204
325
|
|
|
205
326
|
await wallet_environments.process_pending_states(
|
|
206
327
|
[
|
|
@@ -236,15 +357,17 @@ class TestWalletSimulator:
|
|
|
236
357
|
20, wsm_1.coin_store.count_small_unspent, number_of_coins, tx_amount * 2, CoinType.CLAWBACK
|
|
237
358
|
)
|
|
238
359
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
uint64(
|
|
245
|
-
|
|
246
|
-
)
|
|
247
|
-
|
|
360
|
+
bad_send = await env.rpc_client.send_transaction(
|
|
361
|
+
SendTransaction(
|
|
362
|
+
wallet_id=env.xch_wallet.id(),
|
|
363
|
+
amount=uint64(tx_amount),
|
|
364
|
+
address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
|
|
365
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(10))],
|
|
366
|
+
push=True,
|
|
367
|
+
),
|
|
368
|
+
wallet_environments.tx_config,
|
|
369
|
+
)
|
|
370
|
+
[tx_bad] = bad_send.transactions
|
|
248
371
|
|
|
249
372
|
await wallet_environments.process_pending_states(
|
|
250
373
|
[
|
|
@@ -281,7 +404,11 @@ class TestWalletSimulator:
|
|
|
281
404
|
assert coin_record is not None
|
|
282
405
|
await wsm_1.coin_store.add_coin_record(dataclasses.replace(coin_record, metadata=None))
|
|
283
406
|
# Claim merkle coin
|
|
284
|
-
env_1.
|
|
407
|
+
original_settings = AutoClaimSettings.from_json_dict(env_1.wallet_state_manager.config["auto_claim"])
|
|
408
|
+
await env_1.rpc_client.set_auto_claim(AutoClaimSettings(enabled=True, batch_size=uint16(2)))
|
|
409
|
+
assert await env_1.rpc_client.get_auto_claim() == dataclasses.replace(
|
|
410
|
+
original_settings, enabled=True, batch_size=uint16(2)
|
|
411
|
+
)
|
|
285
412
|
# Trigger auto claim
|
|
286
413
|
await wallet_environments.process_pending_states(
|
|
287
414
|
[
|
|
@@ -333,25 +460,23 @@ class TestWalletSimulator:
|
|
|
333
460
|
env_2 = wallet_environments.environments[1]
|
|
334
461
|
wsm = env.wallet_state_manager
|
|
335
462
|
wsm_2 = env_2.wallet_state_manager
|
|
336
|
-
wallet = env.xch_wallet
|
|
337
|
-
wallet_1 = env_2.xch_wallet
|
|
338
|
-
api_0 = env.rpc_api
|
|
339
|
-
api_1 = env_2.rpc_api
|
|
340
463
|
|
|
341
464
|
tx_amount = 500
|
|
342
|
-
async with
|
|
343
|
-
normal_puzhash = await action_scope.get_puzzle_hash(
|
|
465
|
+
async with wsm_2.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
466
|
+
normal_puzhash = await action_scope.get_puzzle_hash(wsm_2)
|
|
344
467
|
|
|
345
468
|
# Transfer to normal wallet
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
uint64(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
)
|
|
469
|
+
send_response = await env.rpc_client.send_transaction(
|
|
470
|
+
SendTransaction(
|
|
471
|
+
wallet_id=env.xch_wallet.id(),
|
|
472
|
+
amount=uint64(tx_amount),
|
|
473
|
+
address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
|
|
474
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(500))],
|
|
475
|
+
memos=["Test"],
|
|
476
|
+
push=True,
|
|
477
|
+
),
|
|
478
|
+
wallet_environments.tx_config,
|
|
479
|
+
)
|
|
355
480
|
|
|
356
481
|
await wallet_environments.process_pending_states(
|
|
357
482
|
[
|
|
@@ -385,28 +510,35 @@ class TestWalletSimulator:
|
|
|
385
510
|
# Check merkle coins
|
|
386
511
|
await time_out_assert(20, wsm.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
|
|
387
512
|
await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
|
|
388
|
-
|
|
389
|
-
|
|
513
|
+
txs_response = await env.rpc_client.get_transactions(
|
|
514
|
+
GetTransactions(
|
|
515
|
+
wallet_id=env.xch_wallet.id(),
|
|
516
|
+
type_filter=TransactionTypeFilter(
|
|
517
|
+
values=[uint8(TransactionType.INCOMING_CLAWBACK_SEND.value)], mode=uint8(1)
|
|
518
|
+
),
|
|
519
|
+
),
|
|
390
520
|
)
|
|
391
521
|
# clawback merkle coin
|
|
392
|
-
[tx] =
|
|
522
|
+
[tx] = send_response.transactions
|
|
393
523
|
merkle_coin = tx.additions[0] if tx.additions[0].amount == tx_amount else tx.additions[1]
|
|
394
524
|
interested_coins = await wsm_2.interested_store.get_interested_coin_ids()
|
|
395
525
|
assert merkle_coin.name() in set(interested_coins)
|
|
396
|
-
assert len(
|
|
397
|
-
assert not
|
|
398
|
-
assert
|
|
399
|
-
assert
|
|
526
|
+
assert len(txs_response.transactions) == 1
|
|
527
|
+
assert not txs_response.transactions[0].confirmed
|
|
528
|
+
assert txs_response.transactions[0].metadata is not None
|
|
529
|
+
assert txs_response.transactions[0].metadata.content["recipient_puzzle_hash"] == f"0x{normal_puzhash.hex()}"
|
|
530
|
+
assert txs_response.transactions[0].metadata.coin_id == merkle_coin.name()
|
|
400
531
|
|
|
401
532
|
test_fee = 10
|
|
402
|
-
resp = await
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
533
|
+
resp = await env.rpc_client.spend_clawback_coins(
|
|
534
|
+
SpendClawbackCoins(
|
|
535
|
+
coin_ids=[merkle_coin.name()],
|
|
536
|
+
fee=uint64(test_fee),
|
|
537
|
+
push=True,
|
|
538
|
+
),
|
|
539
|
+
wallet_environments.tx_config,
|
|
408
540
|
)
|
|
409
|
-
assert len(resp
|
|
541
|
+
assert len(resp.transaction_ids) == 1
|
|
410
542
|
|
|
411
543
|
await wallet_environments.process_pending_states(
|
|
412
544
|
[
|
|
@@ -440,33 +572,36 @@ class TestWalletSimulator:
|
|
|
440
572
|
|
|
441
573
|
await time_out_assert(20, wsm.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
|
|
442
574
|
await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
)
|
|
451
|
-
)
|
|
452
|
-
assert len(txs["transactions"]) == 2
|
|
453
|
-
assert txs["transactions"][0]["confirmed"]
|
|
454
|
-
assert txs["transactions"][1]["confirmed"]
|
|
455
|
-
|
|
456
|
-
txs = await api_1.get_transactions(
|
|
457
|
-
dict(
|
|
458
|
-
type_filter={
|
|
459
|
-
"values": [
|
|
460
|
-
TransactionType.INCOMING_CLAWBACK_RECEIVE.value,
|
|
461
|
-
TransactionType.OUTGOING_CLAWBACK.value,
|
|
575
|
+
txs_response = await env.rpc_client.get_transactions(
|
|
576
|
+
GetTransactions(
|
|
577
|
+
wallet_id=env.xch_wallet.id(),
|
|
578
|
+
type_filter=TransactionTypeFilter(
|
|
579
|
+
values=[
|
|
580
|
+
uint8(TransactionType.INCOMING_CLAWBACK_SEND.value),
|
|
581
|
+
uint8(TransactionType.OUTGOING_CLAWBACK.value),
|
|
462
582
|
],
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
583
|
+
mode=uint8(1),
|
|
584
|
+
),
|
|
585
|
+
),
|
|
586
|
+
)
|
|
587
|
+
assert len(txs_response.transactions) == 2
|
|
588
|
+
assert txs_response.transactions[0].confirmed
|
|
589
|
+
assert txs_response.transactions[1].confirmed
|
|
590
|
+
|
|
591
|
+
txs_response = await env_2.rpc_client.get_transactions(
|
|
592
|
+
GetTransactions(
|
|
593
|
+
wallet_id=env_2.xch_wallet.id(),
|
|
594
|
+
type_filter=TransactionTypeFilter(
|
|
595
|
+
values=[
|
|
596
|
+
uint8(TransactionType.INCOMING_CLAWBACK_RECEIVE.value),
|
|
597
|
+
uint8(TransactionType.OUTGOING_CLAWBACK.value),
|
|
598
|
+
],
|
|
599
|
+
mode=uint8(1),
|
|
600
|
+
),
|
|
601
|
+
),
|
|
467
602
|
)
|
|
468
|
-
assert len(
|
|
469
|
-
assert
|
|
603
|
+
assert len(txs_response.transactions) == 1
|
|
604
|
+
assert txs_response.transactions[0].confirmed
|
|
470
605
|
interested_coins = await wsm_2.interested_store.get_interested_coin_ids()
|
|
471
606
|
assert merkle_coin.name() not in set(interested_coins)
|
|
472
607
|
|
|
@@ -481,20 +616,23 @@ class TestWalletSimulator:
|
|
|
481
616
|
env = wallet_environments.environments[0]
|
|
482
617
|
wsm = env.wallet_state_manager
|
|
483
618
|
wallet = env.xch_wallet
|
|
484
|
-
api_0 = env.rpc_api
|
|
485
619
|
|
|
486
620
|
tx_amount = 500
|
|
487
621
|
# Transfer to normal wallet
|
|
488
622
|
async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
489
623
|
normal_puzhash = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
uint64(
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
624
|
+
|
|
625
|
+
send_response = await env.rpc_client.send_transaction(
|
|
626
|
+
SendTransaction(
|
|
627
|
+
wallet_id=env.xch_wallet.id(),
|
|
628
|
+
amount=uint64(tx_amount),
|
|
629
|
+
address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
|
|
630
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
|
|
631
|
+
memos=["Test"],
|
|
632
|
+
push=True,
|
|
633
|
+
),
|
|
634
|
+
wallet_environments.tx_config,
|
|
635
|
+
)
|
|
498
636
|
|
|
499
637
|
await wallet_environments.process_pending_states(
|
|
500
638
|
[
|
|
@@ -528,17 +666,18 @@ class TestWalletSimulator:
|
|
|
528
666
|
# Check merkle coins
|
|
529
667
|
await time_out_assert(20, wsm.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
|
|
530
668
|
# Claim merkle coin
|
|
531
|
-
[tx] =
|
|
669
|
+
[tx] = send_response.transactions
|
|
532
670
|
merkle_coin = tx.additions[0] if tx.additions[0].amount == tx_amount else tx.additions[1]
|
|
533
671
|
test_fee = 10
|
|
534
|
-
resp = await
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
672
|
+
resp = await env.rpc_client.spend_clawback_coins(
|
|
673
|
+
SpendClawbackCoins(
|
|
674
|
+
coin_ids=[merkle_coin.name()],
|
|
675
|
+
fee=uint64(test_fee),
|
|
676
|
+
push=True,
|
|
677
|
+
),
|
|
678
|
+
wallet_environments.tx_config,
|
|
540
679
|
)
|
|
541
|
-
assert len(resp
|
|
680
|
+
assert len(resp.transaction_ids) == 1
|
|
542
681
|
# Wait mempool update
|
|
543
682
|
await wallet_environments.process_pending_states(
|
|
544
683
|
[
|
|
@@ -571,20 +710,23 @@ class TestWalletSimulator:
|
|
|
571
710
|
)
|
|
572
711
|
await time_out_assert(20, wsm.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
|
|
573
712
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
713
|
+
txs_response = await env.rpc_client.get_transactions(
|
|
714
|
+
GetTransactions(
|
|
715
|
+
wallet_id=env.xch_wallet.id(),
|
|
716
|
+
type_filter=TransactionTypeFilter(
|
|
717
|
+
values=[
|
|
718
|
+
uint8(TransactionType.INCOMING_CLAWBACK_SEND.value),
|
|
719
|
+
uint8(TransactionType.OUTGOING_CLAWBACK.value),
|
|
720
|
+
],
|
|
721
|
+
mode=uint8(1),
|
|
722
|
+
),
|
|
723
|
+
),
|
|
582
724
|
)
|
|
583
|
-
assert len(
|
|
584
|
-
assert
|
|
585
|
-
assert
|
|
586
|
-
assert
|
|
587
|
-
assert
|
|
725
|
+
assert len(txs_response.transactions) == 2
|
|
726
|
+
assert txs_response.transactions[0].confirmed
|
|
727
|
+
assert txs_response.transactions[1].confirmed
|
|
728
|
+
assert txs_response.transactions[0].memos != txs_response.transactions[1].memos
|
|
729
|
+
assert b"Test" in next(iter(txs_response.transactions[0].memos.values()))
|
|
588
730
|
|
|
589
731
|
@pytest.mark.parametrize(
|
|
590
732
|
"wallet_environments",
|
|
@@ -598,43 +740,53 @@ class TestWalletSimulator:
|
|
|
598
740
|
env_2 = wallet_environments.environments[1]
|
|
599
741
|
wsm = env.wallet_state_manager
|
|
600
742
|
wsm_2 = env_2.wallet_state_manager
|
|
601
|
-
wallet = env.xch_wallet
|
|
602
|
-
wallet_1 = env_2.xch_wallet
|
|
603
|
-
api_0 = env.rpc_api
|
|
604
|
-
api_1 = env_2.rpc_api
|
|
605
743
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
744
|
+
tx_amount_1 = 500
|
|
745
|
+
tx_amount_2 = 600
|
|
746
|
+
total_tx_amount = tx_amount_1 + tx_amount_2
|
|
747
|
+
async with wsm_2.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
748
|
+
normal_puzhash = await action_scope.get_puzzle_hash(wsm_2)
|
|
609
749
|
# Transfer to normal wallet
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
uint64(
|
|
616
|
-
|
|
617
|
-
)
|
|
750
|
+
send_response_1 = await env.rpc_client.send_transaction(
|
|
751
|
+
SendTransaction(
|
|
752
|
+
wallet_id=env.xch_wallet.id(),
|
|
753
|
+
amount=uint64(tx_amount_1),
|
|
754
|
+
address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
|
|
755
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
|
|
756
|
+
push=True,
|
|
757
|
+
),
|
|
758
|
+
wallet_environments.tx_config,
|
|
759
|
+
)
|
|
760
|
+
send_response_2 = await env.rpc_client.send_transaction(
|
|
761
|
+
SendTransaction(
|
|
762
|
+
wallet_id=env.xch_wallet.id(),
|
|
763
|
+
amount=uint64(tx_amount_2),
|
|
764
|
+
address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
|
|
765
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
|
|
766
|
+
push=True,
|
|
767
|
+
),
|
|
768
|
+
wallet_environments.tx_config,
|
|
769
|
+
)
|
|
618
770
|
|
|
619
771
|
await wallet_environments.process_pending_states(
|
|
620
772
|
[
|
|
621
773
|
WalletStateTransition(
|
|
622
774
|
pre_block_balance_updates={
|
|
623
775
|
1: {
|
|
624
|
-
"unconfirmed_wallet_balance": -1 *
|
|
625
|
-
"<=#spendable_balance": -1 *
|
|
626
|
-
"<=#max_send_amount": -1 *
|
|
776
|
+
"unconfirmed_wallet_balance": -1 * total_tx_amount,
|
|
777
|
+
"<=#spendable_balance": -1 * total_tx_amount,
|
|
778
|
+
"<=#max_send_amount": -1 * total_tx_amount,
|
|
627
779
|
">=#pending_change": 1, # any amount increase
|
|
628
|
-
"pending_coin_removal_count":
|
|
780
|
+
"pending_coin_removal_count": 2,
|
|
629
781
|
}
|
|
630
782
|
},
|
|
631
783
|
post_block_balance_updates={
|
|
632
784
|
1: {
|
|
633
|
-
"confirmed_wallet_balance": -1 *
|
|
785
|
+
"confirmed_wallet_balance": -1 * total_tx_amount,
|
|
634
786
|
">=#spendable_balance": 1, # any amount increase
|
|
635
787
|
">=#max_send_amount": 1, # any amount increase
|
|
636
788
|
"<=#pending_change": -1, # any amount decrease
|
|
637
|
-
"pending_coin_removal_count": -
|
|
789
|
+
"pending_coin_removal_count": -2,
|
|
638
790
|
}
|
|
639
791
|
},
|
|
640
792
|
),
|
|
@@ -646,8 +798,8 @@ class TestWalletSimulator:
|
|
|
646
798
|
)
|
|
647
799
|
|
|
648
800
|
# Check merkle coins
|
|
649
|
-
await time_out_assert(20, wsm.coin_store.count_small_unspent,
|
|
650
|
-
await time_out_assert(20, wsm_2.coin_store.count_small_unspent,
|
|
801
|
+
await time_out_assert(20, wsm.coin_store.count_small_unspent, 2, 1000, CoinType.CLAWBACK)
|
|
802
|
+
await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 2, 1000, CoinType.CLAWBACK)
|
|
651
803
|
|
|
652
804
|
# Farm a block to pass timelock
|
|
653
805
|
await wallet_environments.process_pending_states(
|
|
@@ -664,17 +816,20 @@ class TestWalletSimulator:
|
|
|
664
816
|
)
|
|
665
817
|
|
|
666
818
|
# Claim merkle coin
|
|
667
|
-
[
|
|
668
|
-
|
|
819
|
+
[tx_1] = send_response_1.transactions
|
|
820
|
+
[tx_2] = send_response_2.transactions
|
|
821
|
+
merkle_coin_1 = tx_1.additions[0] if tx_1.additions[0].amount == tx_amount_1 else tx_1.additions[1]
|
|
822
|
+
merkle_coin_2 = tx_2.additions[0] if tx_2.additions[0].amount == tx_amount_2 else tx_2.additions[1]
|
|
669
823
|
test_fee = 10
|
|
670
|
-
resp = await
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
824
|
+
resp = await env_2.rpc_client.spend_clawback_coins(
|
|
825
|
+
SpendClawbackCoins(
|
|
826
|
+
coin_ids=[merkle_coin_1.name(), merkle_coin_2.name()],
|
|
827
|
+
fee=uint64(test_fee),
|
|
828
|
+
push=True,
|
|
829
|
+
),
|
|
830
|
+
wallet_environments.tx_config,
|
|
676
831
|
)
|
|
677
|
-
assert len(resp
|
|
832
|
+
assert len(resp.transaction_ids) == 1
|
|
678
833
|
|
|
679
834
|
await wallet_environments.process_pending_states(
|
|
680
835
|
[
|
|
@@ -685,21 +840,21 @@ class TestWalletSimulator:
|
|
|
685
840
|
WalletStateTransition(
|
|
686
841
|
pre_block_balance_updates={
|
|
687
842
|
1: {
|
|
688
|
-
"unconfirmed_wallet_balance":
|
|
689
|
-
"<=#spendable_balance": -1 *
|
|
690
|
-
"<=#max_send_amount": -1 *
|
|
843
|
+
"unconfirmed_wallet_balance": total_tx_amount - test_fee,
|
|
844
|
+
"<=#spendable_balance": -1 * total_tx_amount,
|
|
845
|
+
"<=#max_send_amount": -1 * total_tx_amount,
|
|
691
846
|
">=#pending_change": 1, # any amount increase
|
|
692
|
-
"pending_coin_removal_count":
|
|
847
|
+
"pending_coin_removal_count": 3, # 1 for fee, 2 for clawback
|
|
693
848
|
}
|
|
694
849
|
},
|
|
695
850
|
post_block_balance_updates={
|
|
696
851
|
1: {
|
|
697
|
-
"confirmed_wallet_balance":
|
|
852
|
+
"confirmed_wallet_balance": total_tx_amount - test_fee,
|
|
698
853
|
">=#spendable_balance": 1, # any amount increase
|
|
699
854
|
">=#max_send_amount": 1, # any amount increase
|
|
700
855
|
"<=#pending_change": -1, # any amount decrease
|
|
701
|
-
"unspent_coin_count":
|
|
702
|
-
"pending_coin_removal_count": -
|
|
856
|
+
"unspent_coin_count": 2,
|
|
857
|
+
"pending_coin_removal_count": -3,
|
|
703
858
|
}
|
|
704
859
|
},
|
|
705
860
|
),
|
|
@@ -709,19 +864,20 @@ class TestWalletSimulator:
|
|
|
709
864
|
await time_out_assert(20, wsm.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
|
|
710
865
|
await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 0, 1000, CoinType.CLAWBACK)
|
|
711
866
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
867
|
+
txs_response = await env.rpc_client.get_transactions(
|
|
868
|
+
GetTransactions(
|
|
869
|
+
wallet_id=env.xch_wallet.id(),
|
|
870
|
+
type_filter=TransactionTypeFilter(
|
|
871
|
+
values=[
|
|
872
|
+
uint8(TransactionType.INCOMING_CLAWBACK_SEND.value),
|
|
717
873
|
],
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
)
|
|
874
|
+
mode=uint8(1),
|
|
875
|
+
),
|
|
876
|
+
),
|
|
722
877
|
)
|
|
723
|
-
assert len(
|
|
724
|
-
assert
|
|
878
|
+
assert len(txs_response.transactions) == 2
|
|
879
|
+
assert txs_response.transactions[0].confirmed
|
|
880
|
+
assert txs_response.transactions[1].confirmed
|
|
725
881
|
|
|
726
882
|
@pytest.mark.parametrize(
|
|
727
883
|
"wallet_environments",
|
|
@@ -736,21 +892,21 @@ class TestWalletSimulator:
|
|
|
736
892
|
env_2 = wallet_environments.environments[1]
|
|
737
893
|
wsm = env.wallet_state_manager
|
|
738
894
|
wsm_2 = env_2.wallet_state_manager
|
|
739
|
-
wallet = env.xch_wallet
|
|
740
|
-
wallet_1 = env_2.xch_wallet
|
|
741
895
|
|
|
742
896
|
tx_amount = 500
|
|
743
|
-
async with
|
|
744
|
-
normal_puzhash = await action_scope.get_puzzle_hash(
|
|
897
|
+
async with wsm_2.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
898
|
+
normal_puzhash = await action_scope.get_puzzle_hash(wsm_2)
|
|
745
899
|
# Transfer to normal wallet
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
uint64(
|
|
752
|
-
|
|
753
|
-
)
|
|
900
|
+
await env.rpc_client.send_transaction(
|
|
901
|
+
SendTransaction(
|
|
902
|
+
wallet_id=env.xch_wallet.id(),
|
|
903
|
+
amount=uint64(tx_amount),
|
|
904
|
+
address=env.wallet_state_manager.encode_puzzle_hash(normal_puzhash),
|
|
905
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
|
|
906
|
+
push=True,
|
|
907
|
+
),
|
|
908
|
+
wallet_environments.tx_config,
|
|
909
|
+
)
|
|
754
910
|
|
|
755
911
|
await wallet_environments.process_pending_states(
|
|
756
912
|
[
|
|
@@ -829,7 +985,7 @@ class TestWalletSimulator:
|
|
|
829
985
|
await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
|
|
830
986
|
|
|
831
987
|
# Claim merkle coin
|
|
832
|
-
env_2.
|
|
988
|
+
await env_2.rpc_client.set_auto_claim(AutoClaimSettings(enabled=True))
|
|
833
989
|
# clawback merkle coin
|
|
834
990
|
await wallet_environments.process_pending_states(
|
|
835
991
|
[
|
|
@@ -921,18 +1077,18 @@ class TestWalletSimulator:
|
|
|
921
1077
|
async def test_get_clawback_coins(self, wallet_environments: WalletTestFramework) -> None:
|
|
922
1078
|
env = wallet_environments.environments[0]
|
|
923
1079
|
wsm = env.wallet_state_manager
|
|
924
|
-
wallet = env.xch_wallet
|
|
925
1080
|
|
|
926
1081
|
tx_amount = 500
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
1082
|
+
send_response = await env.rpc_client.send_transaction(
|
|
1083
|
+
SendTransaction(
|
|
1084
|
+
wallet_id=env.xch_wallet.id(),
|
|
1085
|
+
amount=uint64(tx_amount),
|
|
1086
|
+
address=env.wallet_state_manager.encode_puzzle_hash(bytes32.zeros),
|
|
1087
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
|
|
1088
|
+
push=True,
|
|
1089
|
+
),
|
|
1090
|
+
wallet_environments.tx_config,
|
|
1091
|
+
)
|
|
936
1092
|
|
|
937
1093
|
await wallet_environments.process_pending_states(
|
|
938
1094
|
[
|
|
@@ -966,9 +1122,9 @@ class TestWalletSimulator:
|
|
|
966
1122
|
# Check merkle coins
|
|
967
1123
|
await time_out_assert(20, wsm.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
|
|
968
1124
|
# clawback merkle coin
|
|
969
|
-
[tx] =
|
|
1125
|
+
[tx] = send_response.transactions
|
|
970
1126
|
merkle_coin = tx.additions[0] if tx.additions[0].amount == tx_amount else tx.additions[1]
|
|
971
|
-
resp = await env.
|
|
1127
|
+
resp = await env.rpc_client.get_coin_records(GetCoinRecords(wallet_id=uint32(1), coin_type=uint8(1)))
|
|
972
1128
|
assert len(resp["coin_records"]) == 1
|
|
973
1129
|
assert resp["coin_records"][0]["id"][2:] == merkle_coin.name().hex()
|
|
974
1130
|
|
|
@@ -987,7 +1143,6 @@ class TestWalletSimulator:
|
|
|
987
1143
|
wsm_2 = env_2.wallet_state_manager
|
|
988
1144
|
wallet_1 = env_1.xch_wallet
|
|
989
1145
|
wallet_2 = env_2.xch_wallet
|
|
990
|
-
api_1 = env_1.rpc_api
|
|
991
1146
|
|
|
992
1147
|
async with wallet_1.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
993
1148
|
wallet_1_puzhash = await action_scope.get_puzzle_hash(wallet_1.wallet_state_manager)
|
|
@@ -996,16 +1151,18 @@ class TestWalletSimulator:
|
|
|
996
1151
|
|
|
997
1152
|
tx_amount = 500
|
|
998
1153
|
# Transfer to normal wallet
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
uint64(
|
|
1005
|
-
|
|
1006
|
-
)
|
|
1154
|
+
send_response = await env_1.rpc_client.send_transaction(
|
|
1155
|
+
SendTransaction(
|
|
1156
|
+
wallet_id=env_1.xch_wallet.id(),
|
|
1157
|
+
amount=uint64(tx_amount),
|
|
1158
|
+
address=env_1.wallet_state_manager.encode_puzzle_hash(wallet_2_puzhash),
|
|
1159
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
|
|
1160
|
+
push=True,
|
|
1161
|
+
),
|
|
1162
|
+
wallet_environments.tx_config,
|
|
1163
|
+
)
|
|
1007
1164
|
|
|
1008
|
-
[tx1] =
|
|
1165
|
+
[tx1] = send_response.transactions
|
|
1009
1166
|
clawback_coin_id_1 = tx1.additions[0].name()
|
|
1010
1167
|
assert tx1.spend_bundle is not None
|
|
1011
1168
|
|
|
@@ -1043,15 +1200,17 @@ class TestWalletSimulator:
|
|
|
1043
1200
|
await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
|
|
1044
1201
|
|
|
1045
1202
|
tx_amount2 = 700
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
uint64(
|
|
1052
|
-
|
|
1053
|
-
)
|
|
1054
|
-
|
|
1203
|
+
send_response = await env_1.rpc_client.send_transaction(
|
|
1204
|
+
SendTransaction(
|
|
1205
|
+
wallet_id=env_1.xch_wallet.id(),
|
|
1206
|
+
amount=uint64(tx_amount2),
|
|
1207
|
+
address=env_1.wallet_state_manager.encode_puzzle_hash(wallet_1_puzhash),
|
|
1208
|
+
puzzle_decorator=[ClawbackPuzzleDecoratorOverride(decorator="CLAWBACK", clawback_timelock=uint64(5))],
|
|
1209
|
+
push=True,
|
|
1210
|
+
),
|
|
1211
|
+
wallet_environments.tx_config,
|
|
1212
|
+
)
|
|
1213
|
+
[tx2] = send_response.transactions
|
|
1055
1214
|
clawback_coin_id_2 = tx2.additions[0].name()
|
|
1056
1215
|
assert tx2.spend_bundle is not None
|
|
1057
1216
|
|
|
@@ -1088,10 +1247,14 @@ class TestWalletSimulator:
|
|
|
1088
1247
|
await time_out_assert(20, wsm_1.coin_store.count_small_unspent, 2, 1000, CoinType.CLAWBACK)
|
|
1089
1248
|
await time_out_assert(20, wsm_2.coin_store.count_small_unspent, 1, 1000, CoinType.CLAWBACK)
|
|
1090
1249
|
# clawback merkle coin
|
|
1091
|
-
resp = await
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
assert len(resp
|
|
1250
|
+
resp = await env_1.rpc_client.spend_clawback_coins(
|
|
1251
|
+
SpendClawbackCoins(coin_ids=[clawback_coin_id_1], push=True), wallet_environments.tx_config
|
|
1252
|
+
)
|
|
1253
|
+
assert len(resp.transaction_ids) == 1
|
|
1254
|
+
resp = await env_1.rpc_client.spend_clawback_coins(
|
|
1255
|
+
SpendClawbackCoins(coin_ids=[clawback_coin_id_2], push=True), wallet_environments.tx_config
|
|
1256
|
+
)
|
|
1257
|
+
assert len(resp.transaction_ids) == 1
|
|
1095
1258
|
|
|
1096
1259
|
await wallet_environments.process_pending_states(
|
|
1097
1260
|
[
|
|
@@ -1696,7 +1859,7 @@ class TestWalletSimulator:
|
|
|
1696
1859
|
[tx] = action_scope.side_effects.transactions
|
|
1697
1860
|
assert tx.spend_bundle is not None
|
|
1698
1861
|
|
|
1699
|
-
stolen_cs:
|
|
1862
|
+
stolen_cs: CoinSpend | None = None
|
|
1700
1863
|
# extract coin_spend from generated spend_bundle
|
|
1701
1864
|
for cs in tx.spend_bundle.coin_spends:
|
|
1702
1865
|
if compute_additions(cs) == []:
|
|
@@ -1706,26 +1869,15 @@ class TestWalletSimulator:
|
|
|
1706
1869
|
|
|
1707
1870
|
# get a legit signature
|
|
1708
1871
|
stolen_sb, _ = await wallet.wallet_state_manager.sign_bundle([stolen_cs])
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
created_at_time=uint64(0),
|
|
1713
|
-
to_puzzle_hash=bytes32(32 * b"0"),
|
|
1714
|
-
to_address=encode_puzzle_hash(bytes32(32 * b"0"), "txch"),
|
|
1872
|
+
stolen_tx = wallet.wallet_state_manager.new_outgoing_transaction(
|
|
1873
|
+
wallet_id=wallet.id(),
|
|
1874
|
+
puzzle_hash=bytes32.zeros,
|
|
1715
1875
|
amount=uint64(0),
|
|
1716
|
-
|
|
1717
|
-
confirmed=False,
|
|
1718
|
-
sent=uint32(0),
|
|
1876
|
+
fee=uint64(0),
|
|
1719
1877
|
spend_bundle=stolen_sb,
|
|
1720
1878
|
additions=[],
|
|
1721
1879
|
removals=[],
|
|
1722
|
-
|
|
1723
|
-
sent_to=[],
|
|
1724
|
-
trade_id=None,
|
|
1725
|
-
type=uint32(TransactionType.OUTGOING_TX.value),
|
|
1726
|
-
name=name,
|
|
1727
|
-
memos={},
|
|
1728
|
-
valid_times=ConditionValidTimes(),
|
|
1880
|
+
name=stolen_sb.name(),
|
|
1729
1881
|
)
|
|
1730
1882
|
[stolen_tx] = await wallet.wallet_state_manager.add_pending_transactions([stolen_tx])
|
|
1731
1883
|
|