chia-blockchain 2.5.1rc1__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 +10 -0
- chia/__main__.py +5 -0
- chia/_tests/README.md +53 -0
- chia/_tests/__init__.py +0 -0
- chia/_tests/blockchain/__init__.py +0 -0
- chia/_tests/blockchain/blockchain_test_utils.py +195 -0
- chia/_tests/blockchain/config.py +4 -0
- chia/_tests/blockchain/test_augmented_chain.py +145 -0
- chia/_tests/blockchain/test_blockchain.py +4202 -0
- chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
- chia/_tests/blockchain/test_build_chains.py +59 -0
- chia/_tests/blockchain/test_get_block_generator.py +72 -0
- chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
- chia/_tests/build-init-files.py +92 -0
- chia/_tests/build-job-matrix.py +204 -0
- chia/_tests/check_pytest_monitor_output.py +34 -0
- chia/_tests/check_sql_statements.py +72 -0
- chia/_tests/chia-start-sim +42 -0
- chia/_tests/clvm/__init__.py +0 -0
- chia/_tests/clvm/benchmark_costs.py +23 -0
- chia/_tests/clvm/coin_store.py +149 -0
- chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
- chia/_tests/clvm/test_clvm_step.py +37 -0
- chia/_tests/clvm/test_condition_codes.py +13 -0
- chia/_tests/clvm/test_curry_and_treehash.py +55 -0
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_program.py +150 -0
- chia/_tests/clvm/test_puzzle_compression.py +143 -0
- chia/_tests/clvm/test_puzzle_drivers.py +45 -0
- chia/_tests/clvm/test_puzzles.py +242 -0
- chia/_tests/clvm/test_singletons.py +540 -0
- chia/_tests/clvm/test_spend_sim.py +181 -0
- chia/_tests/cmds/__init__.py +0 -0
- chia/_tests/cmds/cmd_test_utils.py +469 -0
- chia/_tests/cmds/config.py +3 -0
- chia/_tests/cmds/conftest.py +23 -0
- chia/_tests/cmds/test_click_types.py +200 -0
- chia/_tests/cmds/test_cmd_framework.py +620 -0
- chia/_tests/cmds/test_cmds_util.py +97 -0
- chia/_tests/cmds/test_daemon.py +92 -0
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +66 -0
- chia/_tests/cmds/test_show.py +116 -0
- chia/_tests/cmds/test_sim.py +207 -0
- chia/_tests/cmds/test_timelock_args.py +75 -0
- chia/_tests/cmds/test_tx_config_args.py +154 -0
- chia/_tests/cmds/testing_classes.py +59 -0
- chia/_tests/cmds/wallet/__init__.py +0 -0
- chia/_tests/cmds/wallet/test_consts.py +47 -0
- chia/_tests/cmds/wallet/test_dao.py +565 -0
- chia/_tests/cmds/wallet/test_did.py +403 -0
- chia/_tests/cmds/wallet/test_nft.py +471 -0
- chia/_tests/cmds/wallet/test_notifications.py +124 -0
- chia/_tests/cmds/wallet/test_offer.toffer +1 -0
- chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
- chia/_tests/cmds/wallet/test_vcs.py +400 -0
- chia/_tests/cmds/wallet/test_wallet.py +1125 -0
- chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
- chia/_tests/conftest.py +1419 -0
- chia/_tests/connection_utils.py +125 -0
- chia/_tests/core/__init__.py +0 -0
- chia/_tests/core/cmds/__init__.py +0 -0
- chia/_tests/core/cmds/test_beta.py +382 -0
- chia/_tests/core/cmds/test_keys.py +1734 -0
- chia/_tests/core/cmds/test_wallet.py +126 -0
- chia/_tests/core/config.py +3 -0
- chia/_tests/core/consensus/__init__.py +0 -0
- chia/_tests/core/consensus/test_block_creation.py +54 -0
- chia/_tests/core/consensus/test_pot_iterations.py +117 -0
- chia/_tests/core/custom_types/__init__.py +0 -0
- chia/_tests/core/custom_types/test_coin.py +107 -0
- chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
- chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
- chia/_tests/core/daemon/__init__.py +0 -0
- chia/_tests/core/daemon/config.py +4 -0
- chia/_tests/core/daemon/test_daemon.py +2128 -0
- chia/_tests/core/daemon/test_daemon_register.py +109 -0
- chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
- chia/_tests/core/data_layer/__init__.py +0 -0
- chia/_tests/core/data_layer/config.py +5 -0
- chia/_tests/core/data_layer/conftest.py +106 -0
- chia/_tests/core/data_layer/test_data_cli.py +56 -0
- chia/_tests/core/data_layer/test_data_layer.py +83 -0
- chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
- chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
- chia/_tests/core/data_layer/test_data_store.py +2424 -0
- chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
- chia/_tests/core/data_layer/test_plugin.py +91 -0
- chia/_tests/core/data_layer/util.py +233 -0
- chia/_tests/core/farmer/__init__.py +0 -0
- chia/_tests/core/farmer/config.py +3 -0
- chia/_tests/core/farmer/test_farmer_api.py +103 -0
- chia/_tests/core/full_node/__init__.py +0 -0
- chia/_tests/core/full_node/config.py +4 -0
- chia/_tests/core/full_node/dos/__init__.py +0 -0
- chia/_tests/core/full_node/dos/config.py +3 -0
- chia/_tests/core/full_node/full_sync/__init__.py +0 -0
- chia/_tests/core/full_node/full_sync/config.py +4 -0
- chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
- chia/_tests/core/full_node/ram_db.py +27 -0
- chia/_tests/core/full_node/stores/__init__.py +0 -0
- chia/_tests/core/full_node/stores/config.py +4 -0
- chia/_tests/core/full_node/stores/test_block_store.py +590 -0
- chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
- chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
- chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
- chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
- chia/_tests/core/full_node/test_address_manager.py +588 -0
- chia/_tests/core/full_node/test_block_height_map.py +556 -0
- chia/_tests/core/full_node/test_conditions.py +556 -0
- chia/_tests/core/full_node/test_full_node.py +2700 -0
- chia/_tests/core/full_node/test_generator_tools.py +82 -0
- chia/_tests/core/full_node/test_hint_management.py +104 -0
- chia/_tests/core/full_node/test_node_load.py +34 -0
- chia/_tests/core/full_node/test_performance.py +179 -0
- chia/_tests/core/full_node/test_subscriptions.py +492 -0
- chia/_tests/core/full_node/test_transactions.py +203 -0
- chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
- chia/_tests/core/large_block.py +2388 -0
- chia/_tests/core/make_block_generator.py +70 -0
- chia/_tests/core/mempool/__init__.py +0 -0
- chia/_tests/core/mempool/config.py +4 -0
- chia/_tests/core/mempool/test_mempool.py +3255 -0
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
- chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
- chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
- chia/_tests/core/mempool/test_mempool_performance.py +64 -0
- chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
- chia/_tests/core/node_height.py +28 -0
- chia/_tests/core/server/__init__.py +0 -0
- chia/_tests/core/server/config.py +3 -0
- chia/_tests/core/server/flood.py +84 -0
- chia/_tests/core/server/serve.py +135 -0
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +66 -0
- chia/_tests/core/server/test_dos.py +319 -0
- chia/_tests/core/server/test_event_loop.py +109 -0
- chia/_tests/core/server/test_loop.py +294 -0
- chia/_tests/core/server/test_node_discovery.py +73 -0
- chia/_tests/core/server/test_rate_limits.py +482 -0
- chia/_tests/core/server/test_server.py +226 -0
- chia/_tests/core/server/test_upnp.py +8 -0
- chia/_tests/core/services/__init__.py +0 -0
- chia/_tests/core/services/config.py +3 -0
- chia/_tests/core/services/test_services.py +188 -0
- chia/_tests/core/ssl/__init__.py +0 -0
- chia/_tests/core/ssl/config.py +3 -0
- chia/_tests/core/ssl/test_ssl.py +202 -0
- chia/_tests/core/test_coins.py +33 -0
- chia/_tests/core/test_cost_calculation.py +313 -0
- chia/_tests/core/test_crawler.py +175 -0
- chia/_tests/core/test_crawler_rpc.py +53 -0
- chia/_tests/core/test_daemon_rpc.py +24 -0
- chia/_tests/core/test_db_conversion.py +130 -0
- chia/_tests/core/test_db_validation.py +162 -0
- chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
- chia/_tests/core/test_filter.py +35 -0
- chia/_tests/core/test_full_node_rpc.py +768 -0
- chia/_tests/core/test_merkle_set.py +343 -0
- chia/_tests/core/test_program.py +47 -0
- chia/_tests/core/test_rpc_util.py +86 -0
- chia/_tests/core/test_seeder.py +420 -0
- chia/_tests/core/test_setproctitle.py +13 -0
- chia/_tests/core/util/__init__.py +0 -0
- chia/_tests/core/util/config.py +4 -0
- chia/_tests/core/util/test_block_cache.py +44 -0
- chia/_tests/core/util/test_cached_bls.py +57 -0
- chia/_tests/core/util/test_config.py +337 -0
- chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
- chia/_tests/core/util/test_files.py +391 -0
- chia/_tests/core/util/test_jsonify.py +146 -0
- chia/_tests/core/util/test_keychain.py +522 -0
- chia/_tests/core/util/test_keyring_wrapper.py +491 -0
- chia/_tests/core/util/test_lockfile.py +380 -0
- chia/_tests/core/util/test_log_exceptions.py +187 -0
- chia/_tests/core/util/test_lru_cache.py +56 -0
- chia/_tests/core/util/test_significant_bits.py +40 -0
- chia/_tests/core/util/test_streamable.py +883 -0
- chia/_tests/db/__init__.py +0 -0
- chia/_tests/db/test_db_wrapper.py +566 -0
- chia/_tests/environments/__init__.py +0 -0
- chia/_tests/environments/common.py +35 -0
- chia/_tests/environments/full_node.py +47 -0
- chia/_tests/environments/wallet.py +429 -0
- chia/_tests/ether.py +19 -0
- chia/_tests/farmer_harvester/__init__.py +0 -0
- chia/_tests/farmer_harvester/config.py +3 -0
- chia/_tests/farmer_harvester/test_farmer.py +1264 -0
- chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
- chia/_tests/fee_estimation/__init__.py +0 -0
- chia/_tests/fee_estimation/config.py +3 -0
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
- chia/_tests/generator/__init__.py +0 -0
- chia/_tests/generator/puzzles/__init__.py +0 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
- chia/_tests/generator/test_compression.py +201 -0
- chia/_tests/generator/test_generator_types.py +44 -0
- chia/_tests/generator/test_rom.py +180 -0
- chia/_tests/plot_sync/__init__.py +0 -0
- chia/_tests/plot_sync/config.py +3 -0
- chia/_tests/plot_sync/test_delta.py +101 -0
- chia/_tests/plot_sync/test_plot_sync.py +618 -0
- chia/_tests/plot_sync/test_receiver.py +451 -0
- chia/_tests/plot_sync/test_sender.py +116 -0
- chia/_tests/plot_sync/test_sync_simulated.py +451 -0
- chia/_tests/plot_sync/util.py +68 -0
- chia/_tests/plotting/__init__.py +0 -0
- chia/_tests/plotting/config.py +3 -0
- chia/_tests/plotting/test_plot_manager.py +781 -0
- chia/_tests/plotting/util.py +12 -0
- chia/_tests/pools/__init__.py +0 -0
- chia/_tests/pools/config.py +5 -0
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +1001 -0
- chia/_tests/pools/test_pool_config.py +42 -0
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
- chia/_tests/pools/test_pool_rpc.py +1123 -0
- chia/_tests/pools/test_pool_wallet.py +205 -0
- chia/_tests/pools/test_wallet_pool_store.py +161 -0
- chia/_tests/process_junit.py +348 -0
- chia/_tests/rpc/__init__.py +0 -0
- chia/_tests/rpc/test_rpc_client.py +138 -0
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/__init__.py +0 -0
- chia/_tests/simulation/config.py +6 -0
- chia/_tests/simulation/test_simulation.py +501 -0
- chia/_tests/simulation/test_simulator.py +232 -0
- chia/_tests/simulation/test_start_simulator.py +107 -0
- chia/_tests/testconfig.py +13 -0
- chia/_tests/timelord/__init__.py +0 -0
- chia/_tests/timelord/config.py +3 -0
- chia/_tests/timelord/test_new_peak.py +437 -0
- chia/_tests/timelord/test_timelord.py +11 -0
- chia/_tests/tools/1315537.json +170 -0
- chia/_tests/tools/1315544.json +160 -0
- chia/_tests/tools/1315630.json +150 -0
- chia/_tests/tools/300000.json +105 -0
- chia/_tests/tools/442734.json +140 -0
- chia/_tests/tools/466212.json +130 -0
- chia/_tests/tools/__init__.py +0 -0
- chia/_tests/tools/config.py +5 -0
- chia/_tests/tools/test-blockchain-db.sqlite +0 -0
- chia/_tests/tools/test_full_sync.py +30 -0
- chia/_tests/tools/test_legacy_keyring.py +82 -0
- chia/_tests/tools/test_run_block.py +128 -0
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/__init__.py +0 -0
- chia/_tests/util/benchmark_cost.py +170 -0
- chia/_tests/util/benchmarks.py +153 -0
- chia/_tests/util/bip39_test_vectors.json +148 -0
- chia/_tests/util/blockchain.py +134 -0
- chia/_tests/util/blockchain_mock.py +132 -0
- chia/_tests/util/build_network_protocol_files.py +302 -0
- chia/_tests/util/clvm_generator.bin +0 -0
- chia/_tests/util/config.py +3 -0
- chia/_tests/util/constants.py +20 -0
- chia/_tests/util/db_connection.py +37 -0
- chia/_tests/util/full_sync.py +253 -0
- chia/_tests/util/gen_ssl_certs.py +114 -0
- chia/_tests/util/generator_tools_testing.py +45 -0
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +36 -0
- chia/_tests/util/misc.py +675 -0
- chia/_tests/util/network_protocol_data.py +1072 -0
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +2701 -0
- chia/_tests/util/rpc.py +26 -0
- chia/_tests/util/run_block.py +163 -0
- chia/_tests/util/setup_nodes.py +481 -0
- chia/_tests/util/spend_sim.py +492 -0
- chia/_tests/util/split_managers.py +102 -0
- chia/_tests/util/temp_file.py +14 -0
- chia/_tests/util/test_action_scope.py +144 -0
- chia/_tests/util/test_async_pool.py +366 -0
- chia/_tests/util/test_build_job_matrix.py +42 -0
- chia/_tests/util/test_build_network_protocol_files.py +7 -0
- chia/_tests/util/test_chia_version.py +50 -0
- chia/_tests/util/test_collection.py +11 -0
- chia/_tests/util/test_condition_tools.py +229 -0
- chia/_tests/util/test_config.py +426 -0
- chia/_tests/util/test_dump_keyring.py +60 -0
- chia/_tests/util/test_errors.py +10 -0
- chia/_tests/util/test_full_block_utils.py +279 -0
- chia/_tests/util/test_installed.py +20 -0
- chia/_tests/util/test_limited_semaphore.py +53 -0
- chia/_tests/util/test_logging_filter.py +42 -0
- chia/_tests/util/test_misc.py +445 -0
- chia/_tests/util/test_network.py +73 -0
- chia/_tests/util/test_network_protocol_files.py +578 -0
- chia/_tests/util/test_network_protocol_json.py +267 -0
- chia/_tests/util/test_network_protocol_test.py +256 -0
- chia/_tests/util/test_paginator.py +71 -0
- chia/_tests/util/test_pprint.py +17 -0
- chia/_tests/util/test_priority_mutex.py +488 -0
- chia/_tests/util/test_recursive_replace.py +116 -0
- chia/_tests/util/test_replace_str_to_bytes.py +137 -0
- chia/_tests/util/test_service_groups.py +15 -0
- chia/_tests/util/test_ssl_check.py +31 -0
- chia/_tests/util/test_testnet_overrides.py +19 -0
- chia/_tests/util/test_tests_misc.py +38 -0
- chia/_tests/util/test_timing.py +37 -0
- chia/_tests/util/test_trusted_peer.py +51 -0
- chia/_tests/util/time_out_assert.py +191 -0
- chia/_tests/wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/config.py +4 -0
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
- chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
- chia/_tests/wallet/clawback/__init__.py +0 -0
- chia/_tests/wallet/clawback/config.py +3 -0
- chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
- chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
- chia/_tests/wallet/config.py +4 -0
- chia/_tests/wallet/conftest.py +278 -0
- chia/_tests/wallet/dao_wallet/__init__.py +0 -0
- chia/_tests/wallet/dao_wallet/config.py +3 -0
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
- chia/_tests/wallet/db_wallet/__init__.py +0 -0
- chia/_tests/wallet/db_wallet/config.py +3 -0
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
- chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
- chia/_tests/wallet/did_wallet/__init__.py +0 -0
- chia/_tests/wallet/did_wallet/config.py +4 -0
- chia/_tests/wallet/did_wallet/test_did.py +2284 -0
- chia/_tests/wallet/nft_wallet/__init__.py +0 -0
- chia/_tests/wallet/nft_wallet/config.py +4 -0
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
- chia/_tests/wallet/rpc/__init__.py +0 -0
- chia/_tests/wallet/rpc/config.py +4 -0
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
- chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
- chia/_tests/wallet/simple_sync/__init__.py +0 -0
- chia/_tests/wallet/simple_sync/config.py +3 -0
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
- chia/_tests/wallet/sync/__init__.py +0 -0
- chia/_tests/wallet/sync/config.py +4 -0
- chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
- chia/_tests/wallet/test_address_type.py +189 -0
- chia/_tests/wallet/test_bech32m.py +45 -0
- chia/_tests/wallet/test_clvm_streamable.py +244 -0
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +588 -0
- chia/_tests/wallet/test_conditions.py +400 -0
- chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
- chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
- chia/_tests/wallet/test_nft_store.py +192 -0
- chia/_tests/wallet/test_notifications.py +196 -0
- chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
- chia/_tests/wallet/test_puzzle_store.py +132 -0
- chia/_tests/wallet/test_sign_coin_spends.py +159 -0
- chia/_tests/wallet/test_signer_protocol.py +947 -0
- chia/_tests/wallet/test_singleton.py +122 -0
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
- chia/_tests/wallet/test_singleton_store.py +152 -0
- chia/_tests/wallet/test_taproot.py +19 -0
- chia/_tests/wallet/test_transaction_store.py +945 -0
- chia/_tests/wallet/test_util.py +185 -0
- chia/_tests/wallet/test_wallet.py +2139 -0
- chia/_tests/wallet/test_wallet_action_scope.py +85 -0
- chia/_tests/wallet/test_wallet_blockchain.py +111 -0
- chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
- chia/_tests/wallet/test_wallet_interested_store.py +43 -0
- chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
- chia/_tests/wallet/test_wallet_node.py +780 -0
- chia/_tests/wallet/test_wallet_retry.py +95 -0
- chia/_tests/wallet/test_wallet_state_manager.py +259 -0
- chia/_tests/wallet/test_wallet_test_framework.py +275 -0
- chia/_tests/wallet/test_wallet_trade_store.py +218 -0
- chia/_tests/wallet/test_wallet_user_store.py +34 -0
- chia/_tests/wallet/test_wallet_utils.py +156 -0
- chia/_tests/wallet/vc_wallet/__init__.py +0 -0
- chia/_tests/wallet/vc_wallet/config.py +3 -0
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
- chia/_tests/wallet/wallet_block_tools.py +327 -0
- chia/_tests/weight_proof/__init__.py +0 -0
- chia/_tests/weight_proof/config.py +3 -0
- chia/_tests/weight_proof/test_weight_proof.py +528 -0
- chia/apis.py +19 -0
- chia/clvm/__init__.py +0 -0
- chia/cmds/__init__.py +0 -0
- chia/cmds/beta.py +184 -0
- chia/cmds/beta_funcs.py +137 -0
- chia/cmds/check_wallet_db.py +420 -0
- chia/cmds/chia.py +151 -0
- chia/cmds/cmd_classes.py +323 -0
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +488 -0
- chia/cmds/coin_funcs.py +275 -0
- chia/cmds/coins.py +182 -0
- chia/cmds/completion.py +49 -0
- chia/cmds/configure.py +332 -0
- chia/cmds/dao.py +1064 -0
- chia/cmds/dao_funcs.py +598 -0
- chia/cmds/data.py +708 -0
- chia/cmds/data_funcs.py +385 -0
- chia/cmds/db.py +87 -0
- chia/cmds/db_backup_func.py +77 -0
- chia/cmds/db_upgrade_func.py +452 -0
- chia/cmds/db_validate_func.py +184 -0
- chia/cmds/dev.py +18 -0
- chia/cmds/farm.py +100 -0
- chia/cmds/farm_funcs.py +200 -0
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +63 -0
- chia/cmds/init_funcs.py +367 -0
- chia/cmds/installers.py +131 -0
- chia/cmds/keys.py +527 -0
- chia/cmds/keys_funcs.py +863 -0
- chia/cmds/netspace.py +50 -0
- chia/cmds/netspace_funcs.py +54 -0
- chia/cmds/options.py +32 -0
- chia/cmds/param_types.py +238 -0
- chia/cmds/passphrase.py +131 -0
- chia/cmds/passphrase_funcs.py +292 -0
- chia/cmds/peer.py +51 -0
- chia/cmds/peer_funcs.py +129 -0
- chia/cmds/plotnft.py +260 -0
- chia/cmds/plotnft_funcs.py +405 -0
- chia/cmds/plots.py +230 -0
- chia/cmds/plotters.py +18 -0
- chia/cmds/rpc.py +208 -0
- chia/cmds/show.py +72 -0
- chia/cmds/show_funcs.py +215 -0
- chia/cmds/signer.py +296 -0
- chia/cmds/sim.py +225 -0
- chia/cmds/sim_funcs.py +509 -0
- chia/cmds/start.py +24 -0
- chia/cmds/start_funcs.py +109 -0
- chia/cmds/stop.py +62 -0
- chia/cmds/units.py +9 -0
- chia/cmds/wallet.py +1901 -0
- chia/cmds/wallet_funcs.py +1874 -0
- chia/consensus/__init__.py +0 -0
- chia/consensus/block_body_validation.py +562 -0
- chia/consensus/block_creation.py +546 -0
- chia/consensus/block_header_validation.py +1059 -0
- chia/consensus/block_record.py +31 -0
- chia/consensus/block_rewards.py +53 -0
- chia/consensus/blockchain.py +1087 -0
- chia/consensus/blockchain_interface.py +56 -0
- chia/consensus/coinbase.py +30 -0
- chia/consensus/condition_costs.py +9 -0
- chia/consensus/constants.py +49 -0
- chia/consensus/cost_calculator.py +15 -0
- chia/consensus/default_constants.py +89 -0
- chia/consensus/deficit.py +55 -0
- chia/consensus/difficulty_adjustment.py +412 -0
- chia/consensus/find_fork_point.py +111 -0
- chia/consensus/full_block_to_block_record.py +167 -0
- chia/consensus/get_block_challenge.py +106 -0
- chia/consensus/get_block_generator.py +27 -0
- chia/consensus/make_sub_epoch_summary.py +210 -0
- chia/consensus/multiprocess_validation.py +268 -0
- chia/consensus/pos_quality.py +19 -0
- chia/consensus/pot_iterations.py +67 -0
- chia/consensus/puzzles/__init__.py +0 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
- chia/consensus/vdf_info_computation.py +156 -0
- chia/daemon/__init__.py +0 -0
- chia/daemon/client.py +252 -0
- chia/daemon/keychain_proxy.py +502 -0
- chia/daemon/keychain_server.py +365 -0
- chia/daemon/server.py +1606 -0
- chia/daemon/windows_signal.py +56 -0
- chia/data_layer/__init__.py +0 -0
- chia/data_layer/data_layer.py +1291 -0
- chia/data_layer/data_layer_api.py +33 -0
- chia/data_layer/data_layer_errors.py +50 -0
- chia/data_layer/data_layer_server.py +170 -0
- chia/data_layer/data_layer_util.py +985 -0
- chia/data_layer/data_layer_wallet.py +1311 -0
- chia/data_layer/data_store.py +2267 -0
- chia/data_layer/dl_wallet_store.py +407 -0
- chia/data_layer/download_data.py +389 -0
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
- chia/data_layer/s3_plugin_config.yml +33 -0
- chia/data_layer/s3_plugin_service.py +468 -0
- chia/data_layer/util/__init__.py +0 -0
- chia/data_layer/util/benchmark.py +107 -0
- chia/data_layer/util/plugin.py +40 -0
- chia/farmer/__init__.py +0 -0
- chia/farmer/farmer.py +923 -0
- chia/farmer/farmer_api.py +820 -0
- chia/full_node/__init__.py +0 -0
- chia/full_node/bitcoin_fee_estimator.py +85 -0
- chia/full_node/block_height_map.py +271 -0
- chia/full_node/block_store.py +576 -0
- chia/full_node/bundle_tools.py +19 -0
- chia/full_node/coin_store.py +647 -0
- chia/full_node/fee_estimate.py +54 -0
- chia/full_node/fee_estimate_store.py +24 -0
- chia/full_node/fee_estimation.py +92 -0
- chia/full_node/fee_estimator.py +90 -0
- chia/full_node/fee_estimator_constants.py +38 -0
- chia/full_node/fee_estimator_interface.py +42 -0
- chia/full_node/fee_history.py +25 -0
- chia/full_node/fee_tracker.py +564 -0
- chia/full_node/full_node.py +3327 -0
- chia/full_node/full_node_api.py +2025 -0
- chia/full_node/full_node_store.py +1033 -0
- chia/full_node/hint_management.py +56 -0
- chia/full_node/hint_store.py +93 -0
- chia/full_node/mempool.py +589 -0
- chia/full_node/mempool_check_conditions.py +146 -0
- chia/full_node/mempool_manager.py +853 -0
- chia/full_node/pending_tx_cache.py +112 -0
- chia/full_node/puzzles/__init__.py +0 -0
- chia/full_node/puzzles/block_program_zero.clsp +14 -0
- chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
- chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
- chia/full_node/signage_point.py +16 -0
- chia/full_node/subscriptions.py +247 -0
- chia/full_node/sync_store.py +146 -0
- chia/full_node/tx_processing_queue.py +78 -0
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +1720 -0
- chia/harvester/__init__.py +0 -0
- chia/harvester/harvester.py +272 -0
- chia/harvester/harvester_api.py +380 -0
- chia/introducer/__init__.py +0 -0
- chia/introducer/introducer.py +122 -0
- chia/introducer/introducer_api.py +70 -0
- chia/legacy/__init__.py +0 -0
- chia/legacy/keyring.py +155 -0
- chia/plot_sync/__init__.py +0 -0
- chia/plot_sync/delta.py +61 -0
- chia/plot_sync/exceptions.py +56 -0
- chia/plot_sync/receiver.py +386 -0
- chia/plot_sync/sender.py +340 -0
- chia/plot_sync/util.py +43 -0
- chia/plotters/__init__.py +0 -0
- chia/plotters/bladebit.py +388 -0
- chia/plotters/chiapos.py +63 -0
- chia/plotters/madmax.py +224 -0
- chia/plotters/plotters.py +577 -0
- chia/plotters/plotters_util.py +133 -0
- chia/plotting/__init__.py +0 -0
- chia/plotting/cache.py +213 -0
- chia/plotting/check_plots.py +283 -0
- chia/plotting/create_plots.py +278 -0
- chia/plotting/manager.py +436 -0
- chia/plotting/util.py +336 -0
- chia/pools/__init__.py +0 -0
- chia/pools/pool_config.py +110 -0
- chia/pools/pool_puzzles.py +459 -0
- chia/pools/pool_wallet.py +933 -0
- chia/pools/pool_wallet_info.py +118 -0
- chia/pools/puzzles/__init__.py +0 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
- chia/protocols/__init__.py +0 -0
- chia/protocols/farmer_protocol.py +102 -0
- chia/protocols/full_node_protocol.py +219 -0
- chia/protocols/harvester_protocol.py +216 -0
- chia/protocols/introducer_protocol.py +25 -0
- chia/protocols/pool_protocol.py +177 -0
- chia/protocols/protocol_message_types.py +139 -0
- chia/protocols/protocol_state_machine.py +87 -0
- chia/protocols/protocol_timing.py +8 -0
- chia/protocols/shared_protocol.py +86 -0
- chia/protocols/timelord_protocol.py +93 -0
- chia/protocols/wallet_protocol.py +401 -0
- chia/py.typed +0 -0
- chia/rpc/__init__.py +0 -0
- chia/rpc/crawler_rpc_api.py +80 -0
- chia/rpc/data_layer_rpc_api.py +644 -0
- chia/rpc/data_layer_rpc_client.py +188 -0
- chia/rpc/data_layer_rpc_util.py +58 -0
- chia/rpc/farmer_rpc_api.py +365 -0
- chia/rpc/farmer_rpc_client.py +86 -0
- chia/rpc/full_node_rpc_api.py +959 -0
- chia/rpc/full_node_rpc_client.py +292 -0
- chia/rpc/harvester_rpc_api.py +141 -0
- chia/rpc/harvester_rpc_client.py +54 -0
- chia/rpc/rpc_client.py +164 -0
- chia/rpc/rpc_server.py +521 -0
- chia/rpc/timelord_rpc_api.py +32 -0
- chia/rpc/util.py +93 -0
- chia/rpc/wallet_request_types.py +904 -0
- chia/rpc/wallet_rpc_api.py +4943 -0
- chia/rpc/wallet_rpc_client.py +1814 -0
- chia/seeder/__init__.py +0 -0
- chia/seeder/crawl_store.py +425 -0
- chia/seeder/crawler.py +410 -0
- chia/seeder/crawler_api.py +135 -0
- chia/seeder/dns_server.py +593 -0
- chia/seeder/peer_record.py +146 -0
- chia/seeder/start_crawler.py +92 -0
- chia/server/__init__.py +0 -0
- chia/server/address_manager.py +658 -0
- chia/server/address_manager_store.py +237 -0
- chia/server/api_protocol.py +116 -0
- chia/server/capabilities.py +24 -0
- chia/server/chia_policy.py +346 -0
- chia/server/introducer_peers.py +76 -0
- chia/server/node_discovery.py +714 -0
- chia/server/outbound_message.py +33 -0
- chia/server/rate_limit_numbers.py +214 -0
- chia/server/rate_limits.py +153 -0
- chia/server/server.py +741 -0
- chia/server/signal_handlers.py +120 -0
- chia/server/ssl_context.py +32 -0
- chia/server/start_data_layer.py +151 -0
- chia/server/start_farmer.py +98 -0
- chia/server/start_full_node.py +112 -0
- chia/server/start_harvester.py +93 -0
- chia/server/start_introducer.py +81 -0
- chia/server/start_service.py +316 -0
- chia/server/start_timelord.py +89 -0
- chia/server/start_wallet.py +113 -0
- chia/server/upnp.py +118 -0
- chia/server/ws_connection.py +766 -0
- chia/simulator/__init__.py +0 -0
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +2054 -0
- chia/simulator/full_node_simulator.py +794 -0
- chia/simulator/keyring.py +128 -0
- chia/simulator/setup_services.py +506 -0
- chia/simulator/simulator_constants.py +13 -0
- chia/simulator/simulator_full_node_rpc_api.py +99 -0
- chia/simulator/simulator_full_node_rpc_client.py +60 -0
- chia/simulator/simulator_protocol.py +29 -0
- chia/simulator/simulator_test_tools.py +164 -0
- chia/simulator/socket.py +24 -0
- chia/simulator/ssl_certs.py +114 -0
- chia/simulator/ssl_certs_1.py +697 -0
- chia/simulator/ssl_certs_10.py +697 -0
- chia/simulator/ssl_certs_2.py +697 -0
- chia/simulator/ssl_certs_3.py +697 -0
- chia/simulator/ssl_certs_4.py +697 -0
- chia/simulator/ssl_certs_5.py +697 -0
- chia/simulator/ssl_certs_6.py +697 -0
- chia/simulator/ssl_certs_7.py +697 -0
- chia/simulator/ssl_certs_8.py +697 -0
- chia/simulator/ssl_certs_9.py +697 -0
- chia/simulator/start_simulator.py +143 -0
- chia/simulator/wallet_tools.py +246 -0
- chia/ssl/__init__.py +0 -0
- chia/ssl/chia_ca.crt +19 -0
- chia/ssl/chia_ca.key +28 -0
- chia/ssl/create_ssl.py +249 -0
- chia/ssl/dst_root_ca.pem +20 -0
- chia/timelord/__init__.py +0 -0
- chia/timelord/iters_from_block.py +50 -0
- chia/timelord/timelord.py +1226 -0
- chia/timelord/timelord_api.py +138 -0
- chia/timelord/timelord_launcher.py +190 -0
- chia/timelord/timelord_state.py +244 -0
- chia/timelord/types.py +22 -0
- chia/types/__init__.py +0 -0
- chia/types/aliases.py +35 -0
- chia/types/block_protocol.py +20 -0
- chia/types/blockchain_format/__init__.py +0 -0
- chia/types/blockchain_format/classgroup.py +5 -0
- chia/types/blockchain_format/coin.py +28 -0
- chia/types/blockchain_format/foliage.py +8 -0
- chia/types/blockchain_format/pool_target.py +5 -0
- chia/types/blockchain_format/program.py +269 -0
- chia/types/blockchain_format/proof_of_space.py +135 -0
- chia/types/blockchain_format/reward_chain_block.py +6 -0
- chia/types/blockchain_format/serialized_program.py +5 -0
- chia/types/blockchain_format/sized_bytes.py +11 -0
- chia/types/blockchain_format/slots.py +9 -0
- chia/types/blockchain_format/sub_epoch_summary.py +5 -0
- chia/types/blockchain_format/tree_hash.py +72 -0
- chia/types/blockchain_format/vdf.py +86 -0
- chia/types/clvm_cost.py +13 -0
- chia/types/coin_record.py +43 -0
- chia/types/coin_spend.py +115 -0
- chia/types/condition_opcodes.py +73 -0
- chia/types/condition_with_args.py +16 -0
- chia/types/eligible_coin_spends.py +365 -0
- chia/types/end_of_slot_bundle.py +5 -0
- chia/types/fee_rate.py +38 -0
- chia/types/full_block.py +5 -0
- chia/types/generator_types.py +13 -0
- chia/types/header_block.py +5 -0
- chia/types/internal_mempool_item.py +18 -0
- chia/types/mempool_inclusion_status.py +9 -0
- chia/types/mempool_item.py +85 -0
- chia/types/mempool_submission_status.py +30 -0
- chia/types/mojos.py +7 -0
- chia/types/peer_info.py +64 -0
- chia/types/signing_mode.py +29 -0
- chia/types/spend_bundle.py +30 -0
- chia/types/spend_bundle_conditions.py +7 -0
- chia/types/transaction_queue_entry.py +55 -0
- chia/types/unfinished_block.py +5 -0
- chia/types/unfinished_header_block.py +37 -0
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +49 -0
- chia/util/__init__.py +0 -0
- chia/util/action_scope.py +168 -0
- chia/util/async_pool.py +226 -0
- chia/util/augmented_chain.py +134 -0
- chia/util/batches.py +42 -0
- chia/util/bech32m.py +126 -0
- chia/util/beta_metrics.py +119 -0
- chia/util/block_cache.py +56 -0
- chia/util/byte_types.py +12 -0
- chia/util/check_fork_next_block.py +33 -0
- chia/util/chia_logging.py +144 -0
- chia/util/chia_version.py +33 -0
- chia/util/collection.py +17 -0
- chia/util/condition_tools.py +201 -0
- chia/util/config.py +367 -0
- chia/util/cpu.py +22 -0
- chia/util/db_synchronous.py +23 -0
- chia/util/db_version.py +32 -0
- chia/util/db_wrapper.py +430 -0
- chia/util/default_root.py +27 -0
- chia/util/dump_keyring.py +93 -0
- chia/util/english.txt +2048 -0
- chia/util/errors.py +353 -0
- chia/util/file_keyring.py +469 -0
- chia/util/files.py +97 -0
- chia/util/full_block_utils.py +345 -0
- chia/util/generator_tools.py +72 -0
- chia/util/hash.py +31 -0
- chia/util/initial-config.yaml +694 -0
- chia/util/inline_executor.py +26 -0
- chia/util/ints.py +19 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +37 -0
- chia/util/keychain.py +676 -0
- chia/util/keyring_wrapper.py +327 -0
- chia/util/limited_semaphore.py +41 -0
- chia/util/lock.py +49 -0
- chia/util/log_exceptions.py +32 -0
- chia/util/logging.py +36 -0
- chia/util/lru_cache.py +31 -0
- chia/util/math.py +20 -0
- chia/util/network.py +182 -0
- chia/util/paginator.py +48 -0
- chia/util/path.py +31 -0
- chia/util/permissions.py +20 -0
- chia/util/prev_transaction_block.py +21 -0
- chia/util/priority_mutex.py +95 -0
- chia/util/profiler.py +197 -0
- chia/util/recursive_replace.py +24 -0
- chia/util/safe_cancel_task.py +16 -0
- chia/util/service_groups.py +47 -0
- chia/util/setproctitle.py +22 -0
- chia/util/significant_bits.py +32 -0
- chia/util/ssl_check.py +213 -0
- chia/util/streamable.py +642 -0
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +382 -0
- chia/util/timing.py +67 -0
- chia/util/vdf_prover.py +30 -0
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +66 -0
- chia/wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/cat_constants.py +75 -0
- chia/wallet/cat_wallet/cat_info.py +47 -0
- chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
- chia/wallet/cat_wallet/cat_utils.py +164 -0
- chia/wallet/cat_wallet/cat_wallet.py +855 -0
- chia/wallet/cat_wallet/dao_cat_info.py +28 -0
- chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
- chia/wallet/cat_wallet/lineage_store.py +74 -0
- chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
- chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
- chia/wallet/coin_selection.py +188 -0
- chia/wallet/conditions.py +1512 -0
- chia/wallet/dao_wallet/__init__.py +0 -0
- chia/wallet/dao_wallet/dao_info.py +61 -0
- chia/wallet/dao_wallet/dao_utils.py +811 -0
- chia/wallet/dao_wallet/dao_wallet.py +2119 -0
- chia/wallet/db_wallet/__init__.py +0 -0
- chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
- chia/wallet/derivation_record.py +30 -0
- chia/wallet/derive_keys.py +146 -0
- chia/wallet/did_wallet/__init__.py +0 -0
- chia/wallet/did_wallet/did_info.py +39 -0
- chia/wallet/did_wallet/did_wallet.py +1494 -0
- chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
- chia/wallet/did_wallet/puzzles/__init__.py +0 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
- chia/wallet/driver_protocol.py +26 -0
- chia/wallet/key_val_store.py +55 -0
- chia/wallet/lineage_proof.py +58 -0
- chia/wallet/nft_wallet/__init__.py +0 -0
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
- chia/wallet/nft_wallet/nft_info.py +120 -0
- chia/wallet/nft_wallet/nft_puzzles.py +305 -0
- chia/wallet/nft_wallet/nft_wallet.py +1687 -0
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
- chia/wallet/nft_wallet/uncurry_nft.py +217 -0
- chia/wallet/notification_manager.py +117 -0
- chia/wallet/notification_store.py +178 -0
- chia/wallet/outer_puzzles.py +84 -0
- chia/wallet/payment.py +33 -0
- chia/wallet/puzzle_drivers.py +118 -0
- chia/wallet/puzzles/__init__.py +0 -0
- chia/wallet/puzzles/augmented_condition.clsp +13 -0
- chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
- chia/wallet/puzzles/clawback/__init__.py +0 -0
- chia/wallet/puzzles/clawback/drivers.py +188 -0
- chia/wallet/puzzles/clawback/metadata.py +38 -0
- chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
- chia/wallet/puzzles/condition_codes.clib +77 -0
- chia/wallet/puzzles/curry-and-treehash.clib +102 -0
- chia/wallet/puzzles/curry.clib +135 -0
- chia/wallet/puzzles/curry_by_index.clib +16 -0
- chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
- chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp +35 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_lockup.clsp +288 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal.clsp +377 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_treasury.clsp +115 -0
- chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
- chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
- chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
- chia/wallet/puzzles/json.clib +25 -0
- chia/wallet/puzzles/load_clvm.py +161 -0
- chia/wallet/puzzles/merkle_utils.clib +18 -0
- chia/wallet/puzzles/notification.clsp +7 -0
- chia/wallet/puzzles/notification.clsp.hex +1 -0
- chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
- chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.clsp +3 -0
- chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.py +26 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
- chia/wallet/puzzles/p2_parent.clsp +19 -0
- chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
- chia/wallet/puzzles/p2_singleton.clsp +30 -0
- chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/puzzle_utils.py +34 -0
- chia/wallet/puzzles/settlement_payments.clsp +49 -0
- chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
- chia/wallet/puzzles/sha256tree.clib +11 -0
- chia/wallet/puzzles/singleton_launcher.clsp +16 -0
- chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
- chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.py +296 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
- chia/wallet/puzzles/singleton_truths.clib +21 -0
- chia/wallet/puzzles/tails.py +348 -0
- chia/wallet/puzzles/utility_macros.clib +48 -0
- chia/wallet/signer_protocol.py +125 -0
- chia/wallet/singleton.py +106 -0
- chia/wallet/singleton_record.py +30 -0
- chia/wallet/trade_manager.py +1102 -0
- chia/wallet/trade_record.py +67 -0
- chia/wallet/trading/__init__.py +0 -0
- chia/wallet/trading/offer.py +702 -0
- chia/wallet/trading/trade_status.py +13 -0
- chia/wallet/trading/trade_store.py +526 -0
- chia/wallet/transaction_record.py +158 -0
- chia/wallet/transaction_sorting.py +14 -0
- chia/wallet/uncurried_puzzle.py +17 -0
- chia/wallet/util/__init__.py +0 -0
- chia/wallet/util/address_type.py +55 -0
- chia/wallet/util/blind_signer_tl.py +164 -0
- chia/wallet/util/clvm_streamable.py +203 -0
- chia/wallet/util/compute_hints.py +66 -0
- chia/wallet/util/compute_memos.py +43 -0
- chia/wallet/util/curry_and_treehash.py +91 -0
- chia/wallet/util/debug_spend_bundle.py +232 -0
- chia/wallet/util/merkle_tree.py +100 -0
- chia/wallet/util/merkle_utils.py +102 -0
- chia/wallet/util/new_peak_queue.py +82 -0
- chia/wallet/util/notifications.py +12 -0
- chia/wallet/util/peer_request_cache.py +174 -0
- chia/wallet/util/pprint.py +39 -0
- chia/wallet/util/puzzle_compression.py +95 -0
- chia/wallet/util/puzzle_decorator.py +100 -0
- chia/wallet/util/puzzle_decorator_type.py +7 -0
- chia/wallet/util/query_filter.py +59 -0
- chia/wallet/util/transaction_type.py +23 -0
- chia/wallet/util/tx_config.py +158 -0
- chia/wallet/util/wallet_sync_utils.py +351 -0
- chia/wallet/util/wallet_types.py +72 -0
- chia/wallet/vc_wallet/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
- chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
- chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
- chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_drivers.py +838 -0
- chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_store.py +263 -0
- chia/wallet/vc_wallet/vc_wallet.py +638 -0
- chia/wallet/wallet.py +698 -0
- chia/wallet/wallet_action_scope.py +96 -0
- chia/wallet/wallet_blockchain.py +244 -0
- chia/wallet/wallet_coin_record.py +72 -0
- chia/wallet/wallet_coin_store.py +351 -0
- chia/wallet/wallet_info.py +35 -0
- chia/wallet/wallet_interested_store.py +188 -0
- chia/wallet/wallet_nft_store.py +279 -0
- chia/wallet/wallet_node.py +1765 -0
- chia/wallet/wallet_node_api.py +207 -0
- chia/wallet/wallet_pool_store.py +119 -0
- chia/wallet/wallet_protocol.py +90 -0
- chia/wallet/wallet_puzzle_store.py +396 -0
- chia/wallet/wallet_retry_store.py +70 -0
- chia/wallet/wallet_singleton_store.py +259 -0
- chia/wallet/wallet_spend_bundle.py +25 -0
- chia/wallet/wallet_state_manager.py +2819 -0
- chia/wallet/wallet_transaction_store.py +496 -0
- chia/wallet/wallet_user_store.py +110 -0
- chia/wallet/wallet_weight_proof_handler.py +126 -0
- chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
- chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
- chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
- chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
- chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
- mozilla-ca/cacert.pem +3611 -0
|
@@ -0,0 +1,1493 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import logging
|
|
5
|
+
import random
|
|
6
|
+
from collections.abc import Coroutine
|
|
7
|
+
from typing import Any, Callable, Optional
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
|
|
12
|
+
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
13
|
+
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
14
|
+
from chia.simulator.simulator_protocol import FarmNewBlockProtocol
|
|
15
|
+
from chia.types.blockchain_format.program import Program
|
|
16
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
17
|
+
from chia.types.peer_info import PeerInfo
|
|
18
|
+
from chia.util.ints import uint16, uint32, uint64, uint128
|
|
19
|
+
from chia.wallet.cat_wallet.cat_wallet import CATWallet
|
|
20
|
+
from chia.wallet.did_wallet.did_wallet import DIDWallet
|
|
21
|
+
from chia.wallet.nft_wallet.nft_wallet import NFTWallet
|
|
22
|
+
from chia.wallet.outer_puzzles import create_asset_id, match_puzzle
|
|
23
|
+
from chia.wallet.puzzle_drivers import PuzzleInfo
|
|
24
|
+
from chia.wallet.trading.offer import Offer
|
|
25
|
+
from chia.wallet.trading.trade_status import TradeStatus
|
|
26
|
+
from chia.wallet.uncurried_puzzle import uncurry_puzzle
|
|
27
|
+
from chia.wallet.util.compute_memos import compute_memos
|
|
28
|
+
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
29
|
+
from chia.wallet.wallet_node import WalletNode
|
|
30
|
+
|
|
31
|
+
# from clvm_tools.binutils import disassemble
|
|
32
|
+
|
|
33
|
+
logging.getLogger("aiosqlite").setLevel(logging.INFO) # Too much logging on debug level
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def mempool_not_empty(fnapi: FullNodeSimulator) -> bool:
|
|
37
|
+
return fnapi.full_node.mempool_manager.mempool.size() > 0
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def farm_blocks_until(
|
|
41
|
+
predicate_f: Callable[[], Coroutine[Any, Any, bool]], fnapi: FullNodeSimulator, ph: bytes32
|
|
42
|
+
) -> None:
|
|
43
|
+
for i in range(50):
|
|
44
|
+
await fnapi.farm_new_transaction_block(FarmNewBlockProtocol(ph))
|
|
45
|
+
if await predicate_f():
|
|
46
|
+
return None
|
|
47
|
+
await asyncio.sleep(0.3)
|
|
48
|
+
raise TimeoutError()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def get_nft_count(wallet: NFTWallet) -> int:
|
|
52
|
+
return await wallet.get_nft_count()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def trusted_setup_helper(
|
|
56
|
+
trusted: bool, wallet_node_maker: WalletNode, wallet_node_taker: WalletNode, full_node_api: FullNodeSimulator
|
|
57
|
+
) -> None:
|
|
58
|
+
if trusted:
|
|
59
|
+
wallet_node_maker.config["trusted_peers"] = {
|
|
60
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
61
|
+
}
|
|
62
|
+
wallet_node_taker.config["trusted_peers"] = {
|
|
63
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
64
|
+
}
|
|
65
|
+
else:
|
|
66
|
+
wallet_node_maker.config["trusted_peers"] = {}
|
|
67
|
+
wallet_node_taker.config["trusted_peers"] = {}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@pytest.mark.parametrize("trusted", [True, False])
|
|
71
|
+
@pytest.mark.parametrize("zero_royalties", [True, False])
|
|
72
|
+
@pytest.mark.anyio
|
|
73
|
+
async def test_nft_offer_sell_nft(
|
|
74
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
|
|
75
|
+
) -> None:
|
|
76
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
77
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
78
|
+
full_node_server = full_node_api.server
|
|
79
|
+
wallet_node_maker, server_0 = wallets[0]
|
|
80
|
+
wallet_node_taker, server_1 = wallets[1]
|
|
81
|
+
wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
|
|
82
|
+
wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
|
|
83
|
+
|
|
84
|
+
ph_maker = await wallet_maker.get_new_puzzlehash()
|
|
85
|
+
ph_token = bytes32.random(seeded_random)
|
|
86
|
+
|
|
87
|
+
trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
|
|
88
|
+
|
|
89
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
90
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
91
|
+
|
|
92
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
93
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
|
|
94
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
|
|
95
|
+
|
|
96
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
97
|
+
did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
98
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
|
|
99
|
+
)
|
|
100
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
101
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
102
|
+
|
|
103
|
+
await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
|
|
104
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
|
|
105
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
|
|
106
|
+
|
|
107
|
+
hex_did_id = did_wallet_maker.get_my_DID()
|
|
108
|
+
did_id = bytes32.fromhex(hex_did_id)
|
|
109
|
+
target_puzhash = ph_maker
|
|
110
|
+
royalty_puzhash = ph_maker
|
|
111
|
+
royalty_basis_pts = uint16(0 if zero_royalties else 200)
|
|
112
|
+
|
|
113
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
114
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
|
|
115
|
+
)
|
|
116
|
+
metadata = Program.to(
|
|
117
|
+
[
|
|
118
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
119
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
120
|
+
]
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
124
|
+
await nft_wallet_maker.generate_new_nft(
|
|
125
|
+
metadata,
|
|
126
|
+
action_scope,
|
|
127
|
+
target_puzhash,
|
|
128
|
+
royalty_puzhash,
|
|
129
|
+
royalty_basis_pts,
|
|
130
|
+
did_id,
|
|
131
|
+
)
|
|
132
|
+
for tx in action_scope.side_effects.transactions:
|
|
133
|
+
if tx.spend_bundle is not None:
|
|
134
|
+
assert compute_memos(tx.spend_bundle)
|
|
135
|
+
await time_out_assert_not_none(
|
|
136
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
140
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
141
|
+
|
|
142
|
+
await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
|
|
143
|
+
|
|
144
|
+
# TAKER SETUP - NO DID
|
|
145
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
146
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER"
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# maker create offer: NFT for xch
|
|
150
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
151
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
152
|
+
|
|
153
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
154
|
+
assert len(coins_maker) == 1
|
|
155
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
156
|
+
|
|
157
|
+
nft_to_offer = coins_maker[0]
|
|
158
|
+
nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
159
|
+
nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
|
|
160
|
+
xch_requested = 1000
|
|
161
|
+
maker_fee = uint64(433)
|
|
162
|
+
|
|
163
|
+
offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
|
|
164
|
+
|
|
165
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
166
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
167
|
+
offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
|
|
168
|
+
)
|
|
169
|
+
assert success is True
|
|
170
|
+
assert error is None
|
|
171
|
+
assert trade_make is not None
|
|
172
|
+
|
|
173
|
+
taker_fee = 1
|
|
174
|
+
assert not mempool_not_empty(full_node_api)
|
|
175
|
+
peer = wallet_node_taker.get_full_node_peer()
|
|
176
|
+
|
|
177
|
+
[_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
|
|
178
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
179
|
+
)
|
|
180
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
181
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
182
|
+
) as action_scope:
|
|
183
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
184
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
188
|
+
|
|
189
|
+
assert trade_take is not None
|
|
190
|
+
|
|
191
|
+
async def maker_0_taker_1() -> bool:
|
|
192
|
+
return await nft_wallet_maker.get_nft_count() == 0 and await nft_wallet_taker.get_nft_count() == 1
|
|
193
|
+
|
|
194
|
+
await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
|
|
195
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
196
|
+
|
|
197
|
+
await time_out_assert(20, get_nft_count, 0, nft_wallet_maker)
|
|
198
|
+
await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
|
|
199
|
+
|
|
200
|
+
# assert payments and royalties
|
|
201
|
+
expected_royalty = uint64(xch_requested * royalty_basis_pts / 10000)
|
|
202
|
+
expected_maker_balance = funds - 2 - maker_fee + xch_requested + expected_royalty
|
|
203
|
+
expected_taker_balance = funds - taker_fee - xch_requested - expected_royalty
|
|
204
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
|
|
205
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
@pytest.mark.parametrize("trusted", [True, False])
|
|
209
|
+
@pytest.mark.parametrize("zero_royalties", [True, False])
|
|
210
|
+
@pytest.mark.anyio
|
|
211
|
+
async def test_nft_offer_request_nft(
|
|
212
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
|
|
213
|
+
) -> None:
|
|
214
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
215
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
216
|
+
full_node_server = full_node_api.server
|
|
217
|
+
wallet_node_maker, server_0 = wallets[0]
|
|
218
|
+
wallet_node_taker, server_1 = wallets[1]
|
|
219
|
+
wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
|
|
220
|
+
wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
|
|
221
|
+
|
|
222
|
+
ph_taker = await wallet_taker.get_new_puzzlehash()
|
|
223
|
+
ph_token = bytes32.random(seeded_random)
|
|
224
|
+
|
|
225
|
+
trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
|
|
226
|
+
|
|
227
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
228
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
229
|
+
|
|
230
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
231
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
|
|
232
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
|
|
233
|
+
|
|
234
|
+
async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
235
|
+
did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
236
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
|
|
237
|
+
)
|
|
238
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
239
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
240
|
+
|
|
241
|
+
await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
|
|
242
|
+
|
|
243
|
+
hex_did_id = did_wallet_taker.get_my_DID()
|
|
244
|
+
did_id = bytes32.fromhex(hex_did_id)
|
|
245
|
+
target_puzhash = ph_taker
|
|
246
|
+
royalty_puzhash = ph_taker
|
|
247
|
+
royalty_basis_pts = uint16(0 if zero_royalties else 200)
|
|
248
|
+
|
|
249
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
250
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID TAKER", did_id=did_id
|
|
251
|
+
)
|
|
252
|
+
metadata = Program.to(
|
|
253
|
+
[
|
|
254
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
255
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
256
|
+
]
|
|
257
|
+
)
|
|
258
|
+
await time_out_assert(20, wallet_taker.get_unconfirmed_balance, funds - 1)
|
|
259
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, funds - 1)
|
|
260
|
+
|
|
261
|
+
async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
262
|
+
await nft_wallet_taker.generate_new_nft(
|
|
263
|
+
metadata,
|
|
264
|
+
action_scope,
|
|
265
|
+
target_puzhash,
|
|
266
|
+
royalty_puzhash,
|
|
267
|
+
royalty_basis_pts,
|
|
268
|
+
did_id,
|
|
269
|
+
)
|
|
270
|
+
for tx in action_scope.side_effects.transactions:
|
|
271
|
+
if tx.spend_bundle is not None:
|
|
272
|
+
assert compute_memos(tx.spend_bundle)
|
|
273
|
+
await time_out_assert_not_none(
|
|
274
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
278
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
279
|
+
|
|
280
|
+
await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
|
|
281
|
+
|
|
282
|
+
# MAKER SETUP - NO DID
|
|
283
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
284
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET MAKER"
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
# maker create offer: NFT for xch
|
|
288
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
289
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
290
|
+
|
|
291
|
+
coins_taker = await nft_wallet_taker.get_current_nfts()
|
|
292
|
+
assert len(coins_taker) == 1
|
|
293
|
+
|
|
294
|
+
assert await nft_wallet_maker.get_nft_count() == 0
|
|
295
|
+
nft_to_request = coins_taker[0]
|
|
296
|
+
nft_to_request_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_request.full_puzzle))
|
|
297
|
+
|
|
298
|
+
assert isinstance(nft_to_request_info, PuzzleInfo)
|
|
299
|
+
nft_to_request_asset_id = create_asset_id(nft_to_request_info)
|
|
300
|
+
xch_offered = 1000
|
|
301
|
+
maker_fee = 10
|
|
302
|
+
driver_dict = {nft_to_request_asset_id: nft_to_request_info}
|
|
303
|
+
|
|
304
|
+
offer_dict = {nft_to_request_asset_id: 1, wallet_maker.id(): -xch_offered}
|
|
305
|
+
|
|
306
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
307
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
308
|
+
offer_dict, action_scope, driver_dict, fee=maker_fee
|
|
309
|
+
)
|
|
310
|
+
assert success is True
|
|
311
|
+
assert error is None
|
|
312
|
+
assert trade_make is not None
|
|
313
|
+
|
|
314
|
+
taker_fee = 1
|
|
315
|
+
|
|
316
|
+
peer = wallet_node_taker.get_full_node_peer()
|
|
317
|
+
[_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
|
|
318
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
319
|
+
)
|
|
320
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
321
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
322
|
+
) as action_scope:
|
|
323
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
324
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
|
|
325
|
+
)
|
|
326
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
327
|
+
assert trade_take is not None
|
|
328
|
+
|
|
329
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
330
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
331
|
+
|
|
332
|
+
async def maker_1_taker_0() -> bool:
|
|
333
|
+
return await nft_wallet_maker.get_nft_count() == 1 and await nft_wallet_taker.get_nft_count() == 0
|
|
334
|
+
|
|
335
|
+
await farm_blocks_until(maker_1_taker_0, full_node_api, ph_token)
|
|
336
|
+
|
|
337
|
+
# assert payments and royalties
|
|
338
|
+
expected_royalty = uint64(xch_offered * royalty_basis_pts / 10000)
|
|
339
|
+
expected_maker_balance = funds - maker_fee - xch_offered - expected_royalty
|
|
340
|
+
expected_taker_balance = funds - 2 - taker_fee + xch_offered + expected_royalty
|
|
341
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
|
|
342
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
@pytest.mark.parametrize("trusted", [True, False])
|
|
346
|
+
@pytest.mark.parametrize("zero_royalties", [True, False])
|
|
347
|
+
@pytest.mark.anyio
|
|
348
|
+
async def test_nft_offer_sell_did_to_did(
|
|
349
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
|
|
350
|
+
) -> None:
|
|
351
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
352
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
353
|
+
full_node_server = full_node_api.server
|
|
354
|
+
wallet_node_maker, server_0 = wallets[0]
|
|
355
|
+
wallet_node_taker, server_1 = wallets[1]
|
|
356
|
+
wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
|
|
357
|
+
wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
|
|
358
|
+
|
|
359
|
+
ph_maker = await wallet_maker.get_new_puzzlehash()
|
|
360
|
+
ph_token = bytes32.random(seeded_random)
|
|
361
|
+
|
|
362
|
+
trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
|
|
363
|
+
|
|
364
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
365
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
366
|
+
|
|
367
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
368
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
|
|
369
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
|
|
370
|
+
|
|
371
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
372
|
+
did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
373
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
|
|
374
|
+
)
|
|
375
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
376
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
377
|
+
|
|
378
|
+
await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
|
|
379
|
+
|
|
380
|
+
hex_did_id = did_wallet_maker.get_my_DID()
|
|
381
|
+
did_id = bytes32.fromhex(hex_did_id)
|
|
382
|
+
target_puzhash = ph_maker
|
|
383
|
+
royalty_puzhash = ph_maker
|
|
384
|
+
royalty_basis_pts = uint16(0 if zero_royalties else 200)
|
|
385
|
+
|
|
386
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
387
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
|
|
388
|
+
)
|
|
389
|
+
metadata = Program.to(
|
|
390
|
+
[
|
|
391
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
392
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
393
|
+
]
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
|
|
397
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
|
|
398
|
+
|
|
399
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
400
|
+
await nft_wallet_maker.generate_new_nft(
|
|
401
|
+
metadata,
|
|
402
|
+
action_scope,
|
|
403
|
+
target_puzhash,
|
|
404
|
+
royalty_puzhash,
|
|
405
|
+
royalty_basis_pts,
|
|
406
|
+
did_id,
|
|
407
|
+
)
|
|
408
|
+
for tx in action_scope.side_effects.transactions:
|
|
409
|
+
if tx.spend_bundle is not None:
|
|
410
|
+
assert compute_memos(tx.spend_bundle)
|
|
411
|
+
await time_out_assert_not_none(
|
|
412
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
|
|
416
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
417
|
+
|
|
418
|
+
await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
|
|
419
|
+
|
|
420
|
+
# TAKER SETUP - WITH DID
|
|
421
|
+
async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
422
|
+
did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
423
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
|
|
424
|
+
)
|
|
425
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
426
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
427
|
+
|
|
428
|
+
await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
|
|
429
|
+
|
|
430
|
+
hex_did_id_taker = did_wallet_taker.get_my_DID()
|
|
431
|
+
did_id_taker = bytes32.fromhex(hex_did_id_taker)
|
|
432
|
+
|
|
433
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
434
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER", did_id=did_id_taker
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
# maker create offer: NFT for xch
|
|
438
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
439
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
440
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
441
|
+
assert len(coins_maker) == 1
|
|
442
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
443
|
+
nft_to_offer = coins_maker[0]
|
|
444
|
+
nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
445
|
+
nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
|
|
446
|
+
xch_requested = 1000
|
|
447
|
+
maker_fee = uint64(433)
|
|
448
|
+
|
|
449
|
+
offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
|
|
450
|
+
|
|
451
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
452
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
453
|
+
offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
|
|
454
|
+
)
|
|
455
|
+
assert success is True
|
|
456
|
+
assert error is None
|
|
457
|
+
assert trade_make is not None
|
|
458
|
+
|
|
459
|
+
taker_fee = 1
|
|
460
|
+
|
|
461
|
+
peer = wallet_node_taker.get_full_node_peer()
|
|
462
|
+
[_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
|
|
463
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
464
|
+
)
|
|
465
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
466
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
467
|
+
) as action_scope:
|
|
468
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
469
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
473
|
+
assert trade_take is not None
|
|
474
|
+
|
|
475
|
+
async def maker_0_taker_1() -> bool:
|
|
476
|
+
return (
|
|
477
|
+
await nft_wallet_maker.get_nft_count() == 0
|
|
478
|
+
and len(wallet_taker.wallet_state_manager.wallets) == 4
|
|
479
|
+
and await wallet_taker.wallet_state_manager.wallets[4].get_nft_count() == 1
|
|
480
|
+
)
|
|
481
|
+
|
|
482
|
+
await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
|
|
483
|
+
|
|
484
|
+
await time_out_assert(20, get_nft_count, 0, nft_wallet_maker)
|
|
485
|
+
# assert nnew nft wallet is created for taker
|
|
486
|
+
await time_out_assert(20, len, 4, wallet_taker.wallet_state_manager.wallets)
|
|
487
|
+
await time_out_assert(20, get_nft_count, 1, wallet_taker.wallet_state_manager.wallets[4])
|
|
488
|
+
assert await wallet_taker.wallet_state_manager.wallets[4].nft_store.get_nft_by_id(nft_to_offer_asset_id) is not None
|
|
489
|
+
# assert payments and royalties
|
|
490
|
+
expected_royalty = uint64(xch_requested * royalty_basis_pts / 10000)
|
|
491
|
+
expected_maker_balance = funds - 2 - maker_fee + xch_requested + expected_royalty
|
|
492
|
+
expected_taker_balance = funds - 1 - taker_fee - xch_requested - expected_royalty
|
|
493
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
|
|
494
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
@pytest.mark.parametrize("trusted", [True, False])
|
|
498
|
+
@pytest.mark.parametrize("zero_royalties", [True, False])
|
|
499
|
+
@pytest.mark.anyio
|
|
500
|
+
async def test_nft_offer_sell_nft_for_cat(
|
|
501
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, zero_royalties: bool, seeded_random: random.Random
|
|
502
|
+
) -> None:
|
|
503
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
504
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
505
|
+
full_node_server = full_node_api.server
|
|
506
|
+
wallet_node_maker, server_0 = wallets[0]
|
|
507
|
+
wallet_node_taker, server_1 = wallets[1]
|
|
508
|
+
wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
|
|
509
|
+
wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
|
|
510
|
+
|
|
511
|
+
ph_maker = await wallet_maker.get_new_puzzlehash()
|
|
512
|
+
ph_token = bytes32.random(seeded_random)
|
|
513
|
+
|
|
514
|
+
trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
|
|
515
|
+
|
|
516
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
517
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
518
|
+
|
|
519
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
520
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
|
|
521
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
|
|
522
|
+
|
|
523
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
524
|
+
did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
525
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
|
|
526
|
+
)
|
|
527
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
528
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
529
|
+
|
|
530
|
+
await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
|
|
531
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
|
|
532
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
|
|
533
|
+
|
|
534
|
+
hex_did_id = did_wallet_maker.get_my_DID()
|
|
535
|
+
did_id = bytes32.fromhex(hex_did_id)
|
|
536
|
+
target_puzhash = ph_maker
|
|
537
|
+
royalty_puzhash = ph_maker
|
|
538
|
+
royalty_basis_pts = uint16(0 if zero_royalties else 200)
|
|
539
|
+
|
|
540
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
541
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
|
|
542
|
+
)
|
|
543
|
+
metadata = Program.to(
|
|
544
|
+
[
|
|
545
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
546
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
547
|
+
]
|
|
548
|
+
)
|
|
549
|
+
|
|
550
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
551
|
+
await nft_wallet_maker.generate_new_nft(
|
|
552
|
+
metadata,
|
|
553
|
+
action_scope,
|
|
554
|
+
target_puzhash,
|
|
555
|
+
royalty_puzhash,
|
|
556
|
+
royalty_basis_pts,
|
|
557
|
+
did_id,
|
|
558
|
+
)
|
|
559
|
+
for tx in action_scope.side_effects.transactions:
|
|
560
|
+
if tx.spend_bundle is not None:
|
|
561
|
+
assert compute_memos(tx.spend_bundle)
|
|
562
|
+
await time_out_assert_not_none(
|
|
563
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
564
|
+
)
|
|
565
|
+
|
|
566
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
567
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
568
|
+
|
|
569
|
+
await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
|
|
570
|
+
|
|
571
|
+
# TAKER SETUP - NO DID
|
|
572
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
573
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER"
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
# maker create offer: NFT for xch
|
|
577
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
578
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
579
|
+
|
|
580
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
581
|
+
assert len(coins_maker) == 1
|
|
582
|
+
coins_taker = await nft_wallet_taker.get_current_nfts()
|
|
583
|
+
assert len(coins_taker) == 0
|
|
584
|
+
|
|
585
|
+
# Create new CAT and wallets for maker and taker
|
|
586
|
+
# Trade them between maker and taker to ensure multiple coins for each cat
|
|
587
|
+
cats_to_mint = 100000
|
|
588
|
+
cats_to_trade = uint64(10000)
|
|
589
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
590
|
+
full_node_api.full_node.log.warning(f"Mempool size: {full_node_api.full_node.mempool_manager.mempool.size()}")
|
|
591
|
+
cat_wallet_maker = await CATWallet.create_new_cat_wallet(
|
|
592
|
+
wallet_node_maker.wallet_state_manager,
|
|
593
|
+
wallet_maker,
|
|
594
|
+
{"identifier": "genesis_by_id"},
|
|
595
|
+
uint64(cats_to_mint),
|
|
596
|
+
action_scope,
|
|
597
|
+
)
|
|
598
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
599
|
+
|
|
600
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
601
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
602
|
+
|
|
603
|
+
await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
|
|
604
|
+
await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
|
|
605
|
+
|
|
606
|
+
cat_wallet_taker: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
|
|
607
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
|
|
608
|
+
)
|
|
609
|
+
|
|
610
|
+
ph_taker_cat_1 = await wallet_taker.get_new_puzzlehash()
|
|
611
|
+
ph_taker_cat_2 = await wallet_taker.get_new_puzzlehash()
|
|
612
|
+
async with cat_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
613
|
+
await cat_wallet_maker.generate_signed_transaction(
|
|
614
|
+
[cats_to_trade, cats_to_trade],
|
|
615
|
+
[ph_taker_cat_1, ph_taker_cat_2],
|
|
616
|
+
action_scope,
|
|
617
|
+
memos=[[ph_taker_cat_1], [ph_taker_cat_2]],
|
|
618
|
+
)
|
|
619
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
620
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
621
|
+
|
|
622
|
+
maker_cat_balance = cats_to_mint - (2 * cats_to_trade)
|
|
623
|
+
taker_cat_balance = 2 * cats_to_trade
|
|
624
|
+
await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, maker_cat_balance)
|
|
625
|
+
await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, taker_cat_balance)
|
|
626
|
+
nft_to_offer = coins_maker[0]
|
|
627
|
+
nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
628
|
+
nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
|
|
629
|
+
cats_requested = 1000
|
|
630
|
+
maker_fee = uint64(433)
|
|
631
|
+
|
|
632
|
+
offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, cat_wallet_maker.id(): cats_requested}
|
|
633
|
+
|
|
634
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
635
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
636
|
+
offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
|
|
637
|
+
)
|
|
638
|
+
|
|
639
|
+
assert success is True
|
|
640
|
+
assert error is None
|
|
641
|
+
assert trade_make is not None
|
|
642
|
+
|
|
643
|
+
taker_fee = 1
|
|
644
|
+
|
|
645
|
+
peer = wallet_node_taker.get_full_node_peer()
|
|
646
|
+
[_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
|
|
647
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
648
|
+
)
|
|
649
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
650
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
651
|
+
) as action_scope:
|
|
652
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
653
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
|
|
654
|
+
)
|
|
655
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
656
|
+
assert trade_take is not None
|
|
657
|
+
|
|
658
|
+
async def maker_0_taker_1() -> bool:
|
|
659
|
+
return (
|
|
660
|
+
len(await nft_wallet_maker.get_current_nfts()) == 0 and len(await nft_wallet_taker.get_current_nfts()) == 1
|
|
661
|
+
)
|
|
662
|
+
|
|
663
|
+
await farm_blocks_until(maker_0_taker_1, full_node_api, ph_token)
|
|
664
|
+
|
|
665
|
+
# assert payments and royalties
|
|
666
|
+
expected_royalty = uint64(cats_requested * royalty_basis_pts / 10000)
|
|
667
|
+
expected_maker_balance = funds - 2 - cats_to_mint - maker_fee
|
|
668
|
+
expected_taker_balance = funds - taker_fee
|
|
669
|
+
expected_maker_cat_balance = maker_cat_balance + cats_requested + expected_royalty
|
|
670
|
+
expected_taker_cat_balance = taker_cat_balance - cats_requested - expected_royalty
|
|
671
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
|
|
672
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
|
|
673
|
+
await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, expected_maker_cat_balance)
|
|
674
|
+
await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, expected_taker_cat_balance)
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
@pytest.mark.parametrize("trusted", [True, False])
|
|
678
|
+
@pytest.mark.parametrize("test_change", [True, False])
|
|
679
|
+
@pytest.mark.anyio
|
|
680
|
+
async def test_nft_offer_request_nft_for_cat(
|
|
681
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: bool, test_change: bool, seeded_random: random.Random
|
|
682
|
+
) -> None:
|
|
683
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
684
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
685
|
+
full_node_server = full_node_api.server
|
|
686
|
+
wallet_node_maker, server_0 = wallets[0]
|
|
687
|
+
wallet_node_taker, server_1 = wallets[1]
|
|
688
|
+
wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
|
|
689
|
+
wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
|
|
690
|
+
|
|
691
|
+
ph_taker = await wallet_taker.get_new_puzzlehash()
|
|
692
|
+
ph_token = bytes32.random(seeded_random)
|
|
693
|
+
|
|
694
|
+
trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
|
|
695
|
+
|
|
696
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
697
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
698
|
+
|
|
699
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
700
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
|
|
701
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_taker, timeout=30)
|
|
702
|
+
|
|
703
|
+
async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
704
|
+
did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
705
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, uint64(1), action_scope
|
|
706
|
+
)
|
|
707
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
708
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
709
|
+
|
|
710
|
+
await time_out_assert(20, wallet_taker.get_pending_change_balance, 0)
|
|
711
|
+
await time_out_assert(20, wallet_taker.get_unconfirmed_balance, funds - 1)
|
|
712
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, funds - 1)
|
|
713
|
+
|
|
714
|
+
hex_did_id = did_wallet_taker.get_my_DID()
|
|
715
|
+
did_id = bytes32.fromhex(hex_did_id)
|
|
716
|
+
target_puzhash = ph_taker
|
|
717
|
+
royalty_puzhash = ph_taker
|
|
718
|
+
royalty_basis_pts = uint16(5000) # 50%
|
|
719
|
+
|
|
720
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
721
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID TAKER", did_id=did_id
|
|
722
|
+
)
|
|
723
|
+
metadata = Program.to(
|
|
724
|
+
[
|
|
725
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
726
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
727
|
+
]
|
|
728
|
+
)
|
|
729
|
+
|
|
730
|
+
async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
731
|
+
await nft_wallet_taker.generate_new_nft(
|
|
732
|
+
metadata,
|
|
733
|
+
action_scope,
|
|
734
|
+
target_puzhash,
|
|
735
|
+
royalty_puzhash,
|
|
736
|
+
royalty_basis_pts,
|
|
737
|
+
did_id,
|
|
738
|
+
)
|
|
739
|
+
for tx in action_scope.side_effects.transactions:
|
|
740
|
+
if tx.spend_bundle is not None:
|
|
741
|
+
assert compute_memos(tx.spend_bundle)
|
|
742
|
+
await time_out_assert_not_none(
|
|
743
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
744
|
+
)
|
|
745
|
+
|
|
746
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
747
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
748
|
+
|
|
749
|
+
await time_out_assert(20, get_nft_count, 1, nft_wallet_taker)
|
|
750
|
+
|
|
751
|
+
# MAKER SETUP - NO DID
|
|
752
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
753
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET MAKER"
|
|
754
|
+
)
|
|
755
|
+
|
|
756
|
+
# maker create offer: NFT for CAT
|
|
757
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
758
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
759
|
+
|
|
760
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
761
|
+
assert len(coins_maker) == 0
|
|
762
|
+
coins_taker = await nft_wallet_taker.get_current_nfts()
|
|
763
|
+
assert len(coins_taker) == 1
|
|
764
|
+
|
|
765
|
+
# Create new CAT and wallets for maker and taker
|
|
766
|
+
# Trade them between maker and taker to ensure multiple coins for each cat
|
|
767
|
+
cats_to_mint = 100000
|
|
768
|
+
cats_to_trade = uint64(20000)
|
|
769
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
770
|
+
cat_wallet_maker = await CATWallet.create_new_cat_wallet(
|
|
771
|
+
wallet_node_maker.wallet_state_manager,
|
|
772
|
+
wallet_maker,
|
|
773
|
+
{"identifier": "genesis_by_id"},
|
|
774
|
+
uint64(cats_to_mint),
|
|
775
|
+
action_scope,
|
|
776
|
+
)
|
|
777
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
778
|
+
|
|
779
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
780
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
781
|
+
|
|
782
|
+
await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
|
|
783
|
+
await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
|
|
784
|
+
|
|
785
|
+
cat_wallet_taker: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
|
|
786
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
|
|
787
|
+
)
|
|
788
|
+
if test_change:
|
|
789
|
+
cat_1 = await wallet_maker.get_new_puzzlehash()
|
|
790
|
+
cat_2 = await wallet_maker.get_new_puzzlehash()
|
|
791
|
+
else:
|
|
792
|
+
cat_1 = await wallet_taker.get_new_puzzlehash()
|
|
793
|
+
cat_2 = await wallet_taker.get_new_puzzlehash()
|
|
794
|
+
puzzle_hashes = [cat_1, cat_2]
|
|
795
|
+
amounts = [cats_to_trade, cats_to_trade]
|
|
796
|
+
if test_change:
|
|
797
|
+
ph_taker_cat_1 = await wallet_taker.get_new_puzzlehash()
|
|
798
|
+
extra_change = cats_to_mint - (2 * cats_to_trade)
|
|
799
|
+
amounts.append(uint64(extra_change))
|
|
800
|
+
puzzle_hashes.append(ph_taker_cat_1)
|
|
801
|
+
async with cat_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
802
|
+
await cat_wallet_maker.generate_signed_transaction(amounts, puzzle_hashes, action_scope)
|
|
803
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
804
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=20)
|
|
805
|
+
|
|
806
|
+
if test_change:
|
|
807
|
+
taker_cat_balance = cats_to_mint - (2 * cats_to_trade)
|
|
808
|
+
maker_cat_balance = 2 * cats_to_trade
|
|
809
|
+
else:
|
|
810
|
+
maker_cat_balance = cats_to_mint - (2 * cats_to_trade)
|
|
811
|
+
taker_cat_balance = 2 * cats_to_trade
|
|
812
|
+
await time_out_assert(15, cat_wallet_maker.get_confirmed_balance, maker_cat_balance)
|
|
813
|
+
await time_out_assert(15, cat_wallet_taker.get_confirmed_balance, taker_cat_balance)
|
|
814
|
+
|
|
815
|
+
nft_to_request = coins_taker[0]
|
|
816
|
+
nft_to_request_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_request.full_puzzle))
|
|
817
|
+
nft_to_request_asset_id: bytes32 = create_asset_id(nft_to_request_info) # type: ignore
|
|
818
|
+
cats_requested = 10000
|
|
819
|
+
maker_fee = uint64(433)
|
|
820
|
+
driver_dict = {nft_to_request_asset_id: nft_to_request_info}
|
|
821
|
+
|
|
822
|
+
offer_dict = {nft_to_request_asset_id: 1, cat_wallet_maker.id(): -cats_requested}
|
|
823
|
+
|
|
824
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
825
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
826
|
+
offer_dict, action_scope, driver_dict, fee=maker_fee
|
|
827
|
+
)
|
|
828
|
+
assert success is True
|
|
829
|
+
assert error is None
|
|
830
|
+
assert trade_make is not None
|
|
831
|
+
|
|
832
|
+
taker_fee = 1
|
|
833
|
+
|
|
834
|
+
peer = wallet_node_taker.get_full_node_peer()
|
|
835
|
+
[_maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
|
|
836
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
837
|
+
)
|
|
838
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
839
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
840
|
+
) as action_scope:
|
|
841
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
842
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=uint64(taker_fee)
|
|
843
|
+
)
|
|
844
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
845
|
+
assert trade_take is not None
|
|
846
|
+
|
|
847
|
+
async def maker_1_taker_0() -> bool:
|
|
848
|
+
return (
|
|
849
|
+
len(await nft_wallet_maker.get_current_nfts()) == 1 and len(await nft_wallet_taker.get_current_nfts()) == 0
|
|
850
|
+
)
|
|
851
|
+
|
|
852
|
+
await farm_blocks_until(maker_1_taker_0, full_node_api, ph_token)
|
|
853
|
+
|
|
854
|
+
# assert payments and royalties
|
|
855
|
+
expected_royalty = uint64(cats_requested * royalty_basis_pts / 10000)
|
|
856
|
+
expected_maker_balance = funds - cats_to_mint - maker_fee
|
|
857
|
+
expected_taker_balance = funds - 2 - taker_fee
|
|
858
|
+
expected_maker_cat_balance = maker_cat_balance - cats_requested - expected_royalty
|
|
859
|
+
expected_taker_cat_balance = taker_cat_balance + cats_requested + expected_royalty
|
|
860
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, expected_maker_balance)
|
|
861
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, expected_taker_balance)
|
|
862
|
+
await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, expected_maker_cat_balance)
|
|
863
|
+
await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, expected_taker_cat_balance)
|
|
864
|
+
|
|
865
|
+
|
|
866
|
+
@pytest.mark.parametrize(
|
|
867
|
+
"trusted",
|
|
868
|
+
[True, False],
|
|
869
|
+
)
|
|
870
|
+
@pytest.mark.anyio
|
|
871
|
+
# @pytest.mark.skip
|
|
872
|
+
async def test_nft_offer_sell_cancel(
|
|
873
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
|
|
874
|
+
) -> None:
|
|
875
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
876
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
877
|
+
full_node_server = full_node_api.server
|
|
878
|
+
wallet_node_maker, server_0 = wallets[0]
|
|
879
|
+
wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
|
|
880
|
+
|
|
881
|
+
ph_maker = await wallet_maker.get_new_puzzlehash()
|
|
882
|
+
ph_token = bytes32.random(seeded_random)
|
|
883
|
+
|
|
884
|
+
if trusted:
|
|
885
|
+
wallet_node_maker.config["trusted_peers"] = {
|
|
886
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
887
|
+
}
|
|
888
|
+
else:
|
|
889
|
+
wallet_node_maker.config["trusted_peers"] = {}
|
|
890
|
+
|
|
891
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
892
|
+
|
|
893
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 3))
|
|
894
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
|
|
895
|
+
|
|
896
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
897
|
+
did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
898
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
|
|
899
|
+
)
|
|
900
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
901
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
|
|
902
|
+
|
|
903
|
+
await time_out_assert(20, wallet_maker.get_pending_change_balance, 0)
|
|
904
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds - 1)
|
|
905
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds - 1)
|
|
906
|
+
|
|
907
|
+
hex_did_id = did_wallet_maker.get_my_DID()
|
|
908
|
+
did_id = bytes32.fromhex(hex_did_id)
|
|
909
|
+
target_puzhash = ph_maker
|
|
910
|
+
royalty_puzhash = ph_maker
|
|
911
|
+
royalty_basis_pts = uint16(200)
|
|
912
|
+
|
|
913
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
914
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
|
|
915
|
+
)
|
|
916
|
+
metadata = Program.to(
|
|
917
|
+
[
|
|
918
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
919
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
920
|
+
]
|
|
921
|
+
)
|
|
922
|
+
|
|
923
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
924
|
+
await nft_wallet_maker.generate_new_nft(
|
|
925
|
+
metadata,
|
|
926
|
+
action_scope,
|
|
927
|
+
target_puzhash,
|
|
928
|
+
royalty_puzhash,
|
|
929
|
+
royalty_basis_pts,
|
|
930
|
+
did_id,
|
|
931
|
+
)
|
|
932
|
+
for tx in action_scope.side_effects.transactions:
|
|
933
|
+
if tx.spend_bundle is not None:
|
|
934
|
+
assert compute_memos(tx.spend_bundle)
|
|
935
|
+
await time_out_assert_not_none(
|
|
936
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
937
|
+
)
|
|
938
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
939
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
|
|
940
|
+
|
|
941
|
+
await time_out_assert(20, get_nft_count, 1, nft_wallet_maker)
|
|
942
|
+
|
|
943
|
+
# maker create offer: NFT for xch
|
|
944
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
945
|
+
|
|
946
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
947
|
+
assert len(coins_maker) == 1
|
|
948
|
+
|
|
949
|
+
nft_to_offer = coins_maker[0]
|
|
950
|
+
nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
951
|
+
nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
|
|
952
|
+
xch_requested = 1000
|
|
953
|
+
maker_fee = uint64(433)
|
|
954
|
+
|
|
955
|
+
offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
|
|
956
|
+
|
|
957
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
958
|
+
_success, trade_make, _error = await trade_manager_maker.create_offer_for_ids(
|
|
959
|
+
offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
|
|
960
|
+
)
|
|
961
|
+
|
|
962
|
+
FEE = uint64(2000000000000)
|
|
963
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
964
|
+
await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=FEE, secure=True)
|
|
965
|
+
|
|
966
|
+
async def get_trade_and_status(trade_manager: Any, trade: Any) -> TradeStatus:
|
|
967
|
+
trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
|
|
968
|
+
return TradeStatus(trade_rec.status)
|
|
969
|
+
|
|
970
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
|
|
971
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
972
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker], timeout=20)
|
|
973
|
+
|
|
974
|
+
await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
|
|
975
|
+
|
|
976
|
+
|
|
977
|
+
@pytest.mark.parametrize(
|
|
978
|
+
"trusted",
|
|
979
|
+
[True],
|
|
980
|
+
)
|
|
981
|
+
@pytest.mark.anyio
|
|
982
|
+
async def test_nft_offer_sell_cancel_in_batch(
|
|
983
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
|
|
984
|
+
) -> None:
|
|
985
|
+
num_blocks = 3
|
|
986
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
987
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
988
|
+
full_node_server = full_node_api.server
|
|
989
|
+
wallet_node_maker, server_0 = wallets[0]
|
|
990
|
+
wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
|
|
991
|
+
|
|
992
|
+
ph_maker = await wallet_maker.get_new_puzzlehash()
|
|
993
|
+
ph_token = bytes32.random(seeded_random)
|
|
994
|
+
|
|
995
|
+
if trusted:
|
|
996
|
+
wallet_node_maker.config["trusted_peers"] = {
|
|
997
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
998
|
+
}
|
|
999
|
+
else:
|
|
1000
|
+
wallet_node_maker.config["trusted_peers"] = {}
|
|
1001
|
+
|
|
1002
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
1003
|
+
|
|
1004
|
+
funds = sum(
|
|
1005
|
+
calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, num_blocks)
|
|
1006
|
+
)
|
|
1007
|
+
await full_node_api.farm_rewards_to_wallet(funds, wallet_maker, timeout=30)
|
|
1008
|
+
|
|
1009
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1010
|
+
did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
1011
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1), action_scope
|
|
1012
|
+
)
|
|
1013
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
1014
|
+
|
|
1015
|
+
await time_out_assert(15, wallet_maker.get_pending_change_balance, 0)
|
|
1016
|
+
await time_out_assert(10, wallet_maker.get_unconfirmed_balance, funds - 1)
|
|
1017
|
+
await time_out_assert(10, wallet_maker.get_confirmed_balance, funds - 1)
|
|
1018
|
+
|
|
1019
|
+
hex_did_id = did_wallet_maker.get_my_DID()
|
|
1020
|
+
did_id = bytes32.fromhex(hex_did_id)
|
|
1021
|
+
target_puzhash = ph_maker
|
|
1022
|
+
royalty_puzhash = ph_maker
|
|
1023
|
+
royalty_basis_pts = uint16(200)
|
|
1024
|
+
|
|
1025
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
1026
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
|
|
1027
|
+
)
|
|
1028
|
+
metadata = Program.to(
|
|
1029
|
+
[
|
|
1030
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
1031
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
1032
|
+
]
|
|
1033
|
+
)
|
|
1034
|
+
|
|
1035
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1036
|
+
await nft_wallet_maker.generate_new_nft(
|
|
1037
|
+
metadata,
|
|
1038
|
+
action_scope,
|
|
1039
|
+
target_puzhash,
|
|
1040
|
+
royalty_puzhash,
|
|
1041
|
+
royalty_basis_pts,
|
|
1042
|
+
did_id,
|
|
1043
|
+
)
|
|
1044
|
+
for tx in action_scope.side_effects.transactions:
|
|
1045
|
+
if tx.spend_bundle is not None:
|
|
1046
|
+
assert compute_memos(tx.spend_bundle)
|
|
1047
|
+
await time_out_assert_not_none(
|
|
1048
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
1049
|
+
)
|
|
1050
|
+
|
|
1051
|
+
for i in range(1, num_blocks):
|
|
1052
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
1053
|
+
|
|
1054
|
+
await time_out_assert(10, get_nft_count, 1, nft_wallet_maker)
|
|
1055
|
+
|
|
1056
|
+
# maker create offer: NFT for xch
|
|
1057
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
1058
|
+
|
|
1059
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
1060
|
+
assert len(coins_maker) == 1
|
|
1061
|
+
|
|
1062
|
+
nft_to_offer = coins_maker[0]
|
|
1063
|
+
nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
1064
|
+
nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
|
|
1065
|
+
xch_requested = 1000
|
|
1066
|
+
maker_fee = uint64(433)
|
|
1067
|
+
|
|
1068
|
+
offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
|
|
1069
|
+
|
|
1070
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
1071
|
+
_success, trade_make, _error = await trade_manager_maker.create_offer_for_ids(
|
|
1072
|
+
offer_did_nft_for_xch, action_scope, {}, fee=maker_fee
|
|
1073
|
+
)
|
|
1074
|
+
|
|
1075
|
+
FEE = uint64(2000000000000)
|
|
1076
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1077
|
+
await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], action_scope, fee=FEE, secure=True)
|
|
1078
|
+
|
|
1079
|
+
async def get_trade_and_status(trade_manager: Any, trade: Any) -> TradeStatus:
|
|
1080
|
+
trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
|
|
1081
|
+
return TradeStatus(trade_rec.status)
|
|
1082
|
+
|
|
1083
|
+
await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
|
|
1084
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
1085
|
+
|
|
1086
|
+
for i in range(1, num_blocks):
|
|
1087
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
|
|
1088
|
+
|
|
1089
|
+
await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
@pytest.mark.parametrize("trusted", [True, False])
|
|
1093
|
+
@pytest.mark.parametrize(
|
|
1094
|
+
"royalty_pts",
|
|
1095
|
+
[
|
|
1096
|
+
(200, 500, 500),
|
|
1097
|
+
(200, 500, 500),
|
|
1098
|
+
(0, 0, 0), # test that we can have 0 royalty
|
|
1099
|
+
(10000, 10001, 10005), # tests 100% royalty is not allowed
|
|
1100
|
+
(100000, 10001, 10005), # 1000% shouldn't work
|
|
1101
|
+
],
|
|
1102
|
+
)
|
|
1103
|
+
@pytest.mark.anyio
|
|
1104
|
+
async def test_complex_nft_offer(
|
|
1105
|
+
self_hostname: str,
|
|
1106
|
+
two_wallet_nodes: Any,
|
|
1107
|
+
trusted: Any,
|
|
1108
|
+
royalty_pts: tuple[int, int, int],
|
|
1109
|
+
seeded_random: random.Random,
|
|
1110
|
+
) -> None:
|
|
1111
|
+
"""
|
|
1112
|
+
This test is going to create an offer where the maker offers 1 NFT and 1 CAT for 2 NFTs, an XCH and a CAT
|
|
1113
|
+
"""
|
|
1114
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
1115
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
1116
|
+
full_node_server = full_node_api.server
|
|
1117
|
+
wallet_node_maker, server_0 = wallets[0]
|
|
1118
|
+
wallet_node_taker, server_1 = wallets[1]
|
|
1119
|
+
wsm_maker = wallet_node_maker.wallet_state_manager
|
|
1120
|
+
wsm_taker = wallet_node_taker.wallet_state_manager
|
|
1121
|
+
wallet_maker = wsm_maker.main_wallet
|
|
1122
|
+
wallet_taker = wsm_taker.main_wallet
|
|
1123
|
+
|
|
1124
|
+
ph_maker = await wallet_maker.get_new_puzzlehash()
|
|
1125
|
+
ph_taker = await wallet_taker.get_new_puzzlehash()
|
|
1126
|
+
ph_token = bytes32.random(seeded_random)
|
|
1127
|
+
|
|
1128
|
+
trusted_setup_helper(trusted, wallet_node_maker, wallet_node_taker, full_node_api)
|
|
1129
|
+
wallet_node_maker.config["automatically_add_unknown_cats"] = True
|
|
1130
|
+
wallet_node_taker.config["automatically_add_unknown_cats"] = True
|
|
1131
|
+
|
|
1132
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
1133
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
1134
|
+
|
|
1135
|
+
# Need money for fees and offering
|
|
1136
|
+
funds_maker = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 3))
|
|
1137
|
+
funds_taker = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 6))
|
|
1138
|
+
|
|
1139
|
+
await full_node_api.farm_rewards_to_wallet(amount=funds_maker, wallet=wsm_maker.main_wallet, timeout=60)
|
|
1140
|
+
await full_node_api.farm_rewards_to_wallet(amount=funds_taker, wallet=wsm_taker.main_wallet, timeout=60)
|
|
1141
|
+
|
|
1142
|
+
CAT_AMOUNT = uint64(100000000)
|
|
1143
|
+
txs = []
|
|
1144
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1145
|
+
cat_wallet_maker = await CATWallet.create_new_cat_wallet(
|
|
1146
|
+
wsm_maker, wallet_maker, {"identifier": "genesis_by_id"}, CAT_AMOUNT, action_scope
|
|
1147
|
+
)
|
|
1148
|
+
txs.extend(action_scope.side_effects.transactions)
|
|
1149
|
+
async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1150
|
+
cat_wallet_taker = await CATWallet.create_new_cat_wallet(
|
|
1151
|
+
wsm_taker, wallet_taker, {"identifier": "genesis_by_id"}, CAT_AMOUNT, action_scope
|
|
1152
|
+
)
|
|
1153
|
+
txs.extend(action_scope.side_effects.transactions)
|
|
1154
|
+
|
|
1155
|
+
# We'll need these later
|
|
1156
|
+
basic_nft_wallet_maker = await NFTWallet.create_new_nft_wallet(wsm_maker, wallet_maker, name="NFT WALLET MAKER")
|
|
1157
|
+
basic_nft_wallet_taker = await NFTWallet.create_new_nft_wallet(wsm_taker, wallet_taker, name="NFT WALLET TAKER")
|
|
1158
|
+
|
|
1159
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1160
|
+
did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
1161
|
+
wsm_maker, wallet_maker, uint64(1), action_scope
|
|
1162
|
+
)
|
|
1163
|
+
txs.extend(action_scope.side_effects.transactions)
|
|
1164
|
+
async with wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1165
|
+
did_wallet_taker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
|
1166
|
+
wsm_taker, wallet_taker, uint64(1), action_scope
|
|
1167
|
+
)
|
|
1168
|
+
txs.extend(action_scope.side_effects.transactions)
|
|
1169
|
+
|
|
1170
|
+
await full_node_api.process_transaction_records(records=txs)
|
|
1171
|
+
|
|
1172
|
+
funds_maker = funds_maker - 1 - CAT_AMOUNT
|
|
1173
|
+
funds_taker = funds_taker - 1 - CAT_AMOUNT
|
|
1174
|
+
|
|
1175
|
+
await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
|
|
1176
|
+
await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
|
|
1177
|
+
await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
|
|
1178
|
+
await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
|
|
1179
|
+
await time_out_assert(30, cat_wallet_maker.get_confirmed_balance, CAT_AMOUNT)
|
|
1180
|
+
await time_out_assert(30, cat_wallet_maker.get_unconfirmed_balance, CAT_AMOUNT)
|
|
1181
|
+
await time_out_assert(30, cat_wallet_taker.get_confirmed_balance, CAT_AMOUNT)
|
|
1182
|
+
await time_out_assert(30, cat_wallet_taker.get_unconfirmed_balance, CAT_AMOUNT)
|
|
1183
|
+
did_id_maker = bytes32.fromhex(did_wallet_maker.get_my_DID())
|
|
1184
|
+
did_id_taker = bytes32.fromhex(did_wallet_taker.get_my_DID())
|
|
1185
|
+
target_puzhash_maker = ph_maker
|
|
1186
|
+
target_puzhash_taker = ph_taker
|
|
1187
|
+
royalty_puzhash_maker = ph_maker
|
|
1188
|
+
royalty_puzhash_taker = ph_taker
|
|
1189
|
+
royalty_basis_pts_maker, royalty_basis_pts_taker_1, royalty_basis_pts_taker_2 = (
|
|
1190
|
+
royalty_pts[0],
|
|
1191
|
+
uint16(royalty_pts[1]),
|
|
1192
|
+
uint16(royalty_pts[2]),
|
|
1193
|
+
)
|
|
1194
|
+
|
|
1195
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
1196
|
+
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id_maker
|
|
1197
|
+
)
|
|
1198
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
1199
|
+
wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET DID 1", did_id=did_id_taker
|
|
1200
|
+
)
|
|
1201
|
+
metadata = Program.to(
|
|
1202
|
+
[
|
|
1203
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
1204
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
1205
|
+
]
|
|
1206
|
+
)
|
|
1207
|
+
if royalty_basis_pts_maker > 65535:
|
|
1208
|
+
with pytest.raises(ValueError):
|
|
1209
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(
|
|
1210
|
+
DEFAULT_TX_CONFIG, push=False
|
|
1211
|
+
) as action_scope:
|
|
1212
|
+
await nft_wallet_maker.generate_new_nft(
|
|
1213
|
+
metadata,
|
|
1214
|
+
action_scope,
|
|
1215
|
+
target_puzhash_maker,
|
|
1216
|
+
royalty_puzhash_maker,
|
|
1217
|
+
royalty_basis_pts_maker, # type: ignore
|
|
1218
|
+
did_id_maker,
|
|
1219
|
+
)
|
|
1220
|
+
return
|
|
1221
|
+
else:
|
|
1222
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1223
|
+
await nft_wallet_maker.generate_new_nft(
|
|
1224
|
+
metadata,
|
|
1225
|
+
action_scope,
|
|
1226
|
+
target_puzhash_maker,
|
|
1227
|
+
royalty_puzhash_maker,
|
|
1228
|
+
uint16(royalty_basis_pts_maker),
|
|
1229
|
+
did_id_maker,
|
|
1230
|
+
)
|
|
1231
|
+
for tx in action_scope.side_effects.transactions:
|
|
1232
|
+
if tx.spend_bundle is not None:
|
|
1233
|
+
await time_out_assert_not_none(
|
|
1234
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
1235
|
+
)
|
|
1236
|
+
|
|
1237
|
+
async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1238
|
+
await nft_wallet_taker.generate_new_nft(
|
|
1239
|
+
metadata,
|
|
1240
|
+
action_scope,
|
|
1241
|
+
target_puzhash_taker,
|
|
1242
|
+
royalty_puzhash_taker,
|
|
1243
|
+
royalty_basis_pts_taker_1,
|
|
1244
|
+
did_id_taker,
|
|
1245
|
+
)
|
|
1246
|
+
for tx in action_scope.side_effects.transactions:
|
|
1247
|
+
if tx.spend_bundle is not None:
|
|
1248
|
+
await time_out_assert_not_none(
|
|
1249
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
1250
|
+
)
|
|
1251
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
1252
|
+
|
|
1253
|
+
funds_maker -= 1
|
|
1254
|
+
funds_taker -= 1
|
|
1255
|
+
|
|
1256
|
+
await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
|
|
1257
|
+
await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
|
|
1258
|
+
await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
|
|
1259
|
+
await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
|
|
1260
|
+
await time_out_assert(30, get_nft_count, 1, nft_wallet_maker)
|
|
1261
|
+
await time_out_assert(30, get_nft_count, 1, nft_wallet_taker)
|
|
1262
|
+
|
|
1263
|
+
# MAke one more NFT for the taker
|
|
1264
|
+
async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1265
|
+
await nft_wallet_taker.generate_new_nft(
|
|
1266
|
+
metadata,
|
|
1267
|
+
action_scope,
|
|
1268
|
+
target_puzhash_taker,
|
|
1269
|
+
royalty_puzhash_taker,
|
|
1270
|
+
royalty_basis_pts_taker_2,
|
|
1271
|
+
did_id_taker,
|
|
1272
|
+
)
|
|
1273
|
+
for tx in action_scope.side_effects.transactions:
|
|
1274
|
+
if tx.spend_bundle is not None:
|
|
1275
|
+
await time_out_assert_not_none(
|
|
1276
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
1277
|
+
)
|
|
1278
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
1279
|
+
|
|
1280
|
+
funds_taker -= 1
|
|
1281
|
+
|
|
1282
|
+
await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
|
|
1283
|
+
await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
|
|
1284
|
+
await time_out_assert(30, get_nft_count, 2, nft_wallet_taker)
|
|
1285
|
+
|
|
1286
|
+
trade_manager_maker = wsm_maker.trade_manager
|
|
1287
|
+
trade_manager_taker = wsm_taker.trade_manager
|
|
1288
|
+
maker_nfts = await nft_wallet_maker.get_current_nfts()
|
|
1289
|
+
taker_nfts = await nft_wallet_taker.get_current_nfts()
|
|
1290
|
+
nft_to_offer_asset_id_maker: bytes32 = maker_nfts[0].nft_id
|
|
1291
|
+
nft_to_offer_asset_id_taker_1: bytes32 = taker_nfts[0].nft_id
|
|
1292
|
+
nft_to_offer_asset_id_taker_2: bytes32 = taker_nfts[1].nft_id
|
|
1293
|
+
if royalty_basis_pts_maker > 60000:
|
|
1294
|
+
XCH_REQUESTED = 20000
|
|
1295
|
+
CAT_REQUESTED = 1000
|
|
1296
|
+
FEE = uint64(20000)
|
|
1297
|
+
else:
|
|
1298
|
+
XCH_REQUESTED = 2000000000000
|
|
1299
|
+
CAT_REQUESTED = 100000
|
|
1300
|
+
FEE = uint64(2000000000000)
|
|
1301
|
+
|
|
1302
|
+
complex_nft_offer = {
|
|
1303
|
+
nft_to_offer_asset_id_maker: -1,
|
|
1304
|
+
cat_wallet_maker.id(): CAT_REQUESTED * -1,
|
|
1305
|
+
1: XCH_REQUESTED,
|
|
1306
|
+
nft_to_offer_asset_id_taker_1: 1,
|
|
1307
|
+
nft_to_offer_asset_id_taker_2: 1,
|
|
1308
|
+
bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): CAT_REQUESTED,
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
driver_dict = {
|
|
1312
|
+
nft_to_offer_asset_id_taker_1: match_puzzle(uncurry_puzzle(taker_nfts[0].full_puzzle)),
|
|
1313
|
+
nft_to_offer_asset_id_taker_2: match_puzzle(uncurry_puzzle(taker_nfts[1].full_puzzle)),
|
|
1314
|
+
bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): PuzzleInfo(
|
|
1315
|
+
{
|
|
1316
|
+
"type": "CAT",
|
|
1317
|
+
"tail": "0x" + cat_wallet_taker.get_asset_id(),
|
|
1318
|
+
}
|
|
1319
|
+
),
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
1323
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
1324
|
+
complex_nft_offer, action_scope, driver_dict=driver_dict, fee=FEE
|
|
1325
|
+
)
|
|
1326
|
+
assert error is None
|
|
1327
|
+
assert success
|
|
1328
|
+
assert trade_make is not None
|
|
1329
|
+
|
|
1330
|
+
[maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
|
|
1331
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
1332
|
+
)
|
|
1333
|
+
if royalty_basis_pts_maker == 10000:
|
|
1334
|
+
with pytest.raises(ValueError):
|
|
1335
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
1336
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
1337
|
+
) as action_scope:
|
|
1338
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
1339
|
+
Offer.from_bytes(trade_make.offer),
|
|
1340
|
+
wallet_node_taker.get_full_node_peer(),
|
|
1341
|
+
action_scope,
|
|
1342
|
+
fee=FEE,
|
|
1343
|
+
)
|
|
1344
|
+
# all done for this test
|
|
1345
|
+
return
|
|
1346
|
+
else:
|
|
1347
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
1348
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
1349
|
+
) as action_scope:
|
|
1350
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
1351
|
+
maker_offer,
|
|
1352
|
+
wallet_node_taker.get_full_node_peer(),
|
|
1353
|
+
action_scope,
|
|
1354
|
+
fee=FEE,
|
|
1355
|
+
)
|
|
1356
|
+
assert trade_take is not None
|
|
1357
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
1358
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_maker, wallet_node_taker], timeout=60)
|
|
1359
|
+
|
|
1360
|
+
# Now let's make sure the final wallet state is correct
|
|
1361
|
+
maker_royalty_summary = NFTWallet.royalty_calculation(
|
|
1362
|
+
{
|
|
1363
|
+
nft_to_offer_asset_id_maker: (royalty_puzhash_maker, uint16(royalty_basis_pts_maker)),
|
|
1364
|
+
},
|
|
1365
|
+
{
|
|
1366
|
+
None: uint64(XCH_REQUESTED),
|
|
1367
|
+
bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): uint64(CAT_REQUESTED),
|
|
1368
|
+
},
|
|
1369
|
+
)
|
|
1370
|
+
taker_royalty_summary = NFTWallet.royalty_calculation(
|
|
1371
|
+
{
|
|
1372
|
+
nft_to_offer_asset_id_taker_1: (royalty_puzhash_taker, royalty_basis_pts_taker_1),
|
|
1373
|
+
nft_to_offer_asset_id_taker_2: (royalty_puzhash_taker, royalty_basis_pts_taker_2),
|
|
1374
|
+
},
|
|
1375
|
+
{
|
|
1376
|
+
bytes32.from_hexstr(cat_wallet_maker.get_asset_id()): uint64(CAT_REQUESTED),
|
|
1377
|
+
},
|
|
1378
|
+
)
|
|
1379
|
+
maker_xch_royalties_expected = maker_royalty_summary[nft_to_offer_asset_id_maker][0]["amount"]
|
|
1380
|
+
maker_cat_royalties_expected = maker_royalty_summary[nft_to_offer_asset_id_maker][1]["amount"]
|
|
1381
|
+
taker_cat_royalties_expected = (
|
|
1382
|
+
taker_royalty_summary[nft_to_offer_asset_id_taker_1][0]["amount"]
|
|
1383
|
+
+ taker_royalty_summary[nft_to_offer_asset_id_taker_2][0]["amount"]
|
|
1384
|
+
)
|
|
1385
|
+
funds_maker = int(funds_maker - FEE + XCH_REQUESTED + maker_xch_royalties_expected)
|
|
1386
|
+
funds_taker = int(funds_taker - FEE - XCH_REQUESTED - maker_xch_royalties_expected)
|
|
1387
|
+
|
|
1388
|
+
await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
|
|
1389
|
+
await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
|
|
1390
|
+
await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
|
|
1391
|
+
await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
|
|
1392
|
+
|
|
1393
|
+
async def get_cat_wallet_and_check_balance(asset_id: str, wsm: Any) -> uint128:
|
|
1394
|
+
cat_wallet = await wsm.get_wallet_for_asset_id(asset_id)
|
|
1395
|
+
if cat_wallet is None:
|
|
1396
|
+
return uint128(0)
|
|
1397
|
+
else:
|
|
1398
|
+
return uint128(await cat_wallet.get_confirmed_balance())
|
|
1399
|
+
|
|
1400
|
+
taker_cat_funds_maker = CAT_REQUESTED + maker_cat_royalties_expected
|
|
1401
|
+
maker_cat_funds_taker = CAT_REQUESTED + taker_cat_royalties_expected
|
|
1402
|
+
await time_out_assert(
|
|
1403
|
+
30,
|
|
1404
|
+
get_cat_wallet_and_check_balance,
|
|
1405
|
+
taker_cat_funds_maker,
|
|
1406
|
+
cat_wallet_taker.get_asset_id(),
|
|
1407
|
+
wsm_maker,
|
|
1408
|
+
)
|
|
1409
|
+
await time_out_assert(
|
|
1410
|
+
30,
|
|
1411
|
+
get_cat_wallet_and_check_balance,
|
|
1412
|
+
maker_cat_funds_taker,
|
|
1413
|
+
cat_wallet_maker.get_asset_id(),
|
|
1414
|
+
wsm_taker,
|
|
1415
|
+
)
|
|
1416
|
+
maker_nfts = await basic_nft_wallet_maker.get_current_nfts()
|
|
1417
|
+
taker_nfts = await basic_nft_wallet_taker.get_current_nfts()
|
|
1418
|
+
assert len(maker_nfts) == 2
|
|
1419
|
+
assert len(taker_nfts) == 1
|
|
1420
|
+
|
|
1421
|
+
assert nft_to_offer_asset_id_maker == taker_nfts[0].nft_id
|
|
1422
|
+
assert nft_to_offer_asset_id_taker_1 in [nft.nft_id for nft in maker_nfts]
|
|
1423
|
+
assert nft_to_offer_asset_id_taker_2 in [nft.nft_id for nft in maker_nfts]
|
|
1424
|
+
|
|
1425
|
+
# Try another permutation
|
|
1426
|
+
complex_nft_offer = {
|
|
1427
|
+
cat_wallet_maker.id(): CAT_REQUESTED * -1,
|
|
1428
|
+
1: int(XCH_REQUESTED / 2),
|
|
1429
|
+
bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): CAT_REQUESTED,
|
|
1430
|
+
nft_to_offer_asset_id_maker: 1,
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
driver_dict = {
|
|
1434
|
+
nft_to_offer_asset_id_maker: match_puzzle(uncurry_puzzle(taker_nfts[0].full_puzzle)),
|
|
1435
|
+
bytes32.from_hexstr(cat_wallet_taker.get_asset_id()): PuzzleInfo(
|
|
1436
|
+
{
|
|
1437
|
+
"type": "CAT",
|
|
1438
|
+
"tail": "0x" + cat_wallet_taker.get_asset_id(),
|
|
1439
|
+
}
|
|
1440
|
+
),
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
1444
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
1445
|
+
complex_nft_offer, action_scope, driver_dict=driver_dict, fee=uint64(0)
|
|
1446
|
+
)
|
|
1447
|
+
assert error is None
|
|
1448
|
+
assert success
|
|
1449
|
+
assert trade_make is not None
|
|
1450
|
+
|
|
1451
|
+
[maker_offer], signing_response = await wallet_node_maker.wallet_state_manager.sign_offers(
|
|
1452
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
1453
|
+
)
|
|
1454
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
1455
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
1456
|
+
) as action_scope:
|
|
1457
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
1458
|
+
Offer.from_bytes(trade_make.offer),
|
|
1459
|
+
wallet_node_taker.get_full_node_peer(),
|
|
1460
|
+
action_scope,
|
|
1461
|
+
fee=uint64(0),
|
|
1462
|
+
)
|
|
1463
|
+
assert trade_take is not None
|
|
1464
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
1465
|
+
|
|
1466
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_token))
|
|
1467
|
+
|
|
1468
|
+
# Now let's make sure the final wallet state is correct
|
|
1469
|
+
funds_maker = int(funds_maker + XCH_REQUESTED / 2)
|
|
1470
|
+
funds_taker = int(funds_taker - XCH_REQUESTED / 2)
|
|
1471
|
+
|
|
1472
|
+
await time_out_assert(30, wallet_maker.get_unconfirmed_balance, funds_maker)
|
|
1473
|
+
await time_out_assert(30, wallet_maker.get_confirmed_balance, funds_maker)
|
|
1474
|
+
await time_out_assert(30, wallet_taker.get_unconfirmed_balance, funds_taker)
|
|
1475
|
+
await time_out_assert(30, wallet_taker.get_confirmed_balance, funds_taker)
|
|
1476
|
+
|
|
1477
|
+
await time_out_assert(
|
|
1478
|
+
30,
|
|
1479
|
+
get_cat_wallet_and_check_balance,
|
|
1480
|
+
taker_cat_funds_maker + CAT_REQUESTED,
|
|
1481
|
+
cat_wallet_taker.get_asset_id(),
|
|
1482
|
+
wsm_maker,
|
|
1483
|
+
)
|
|
1484
|
+
await time_out_assert(
|
|
1485
|
+
30,
|
|
1486
|
+
get_cat_wallet_and_check_balance,
|
|
1487
|
+
maker_cat_funds_taker + CAT_REQUESTED,
|
|
1488
|
+
cat_wallet_maker.get_asset_id(),
|
|
1489
|
+
wsm_taker,
|
|
1490
|
+
)
|
|
1491
|
+
await time_out_assert(20, get_nft_count, 3, basic_nft_wallet_maker)
|
|
1492
|
+
await time_out_assert(20, get_nft_count, 0, basic_nft_wallet_taker)
|
|
1493
|
+
assert await basic_nft_wallet_maker.nft_store.get_nft_by_id(nft_to_offer_asset_id_maker) is not None
|