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,1209 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import random
|
|
4
|
+
from typing import Any, Optional
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from chia._tests.conftest import ConsensusMode
|
|
9
|
+
from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
|
|
10
|
+
from chia._tests.wallet.nft_wallet.test_nft_1_offers import mempool_not_empty
|
|
11
|
+
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
12
|
+
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
13
|
+
from chia.simulator.simulator_protocol import FarmNewBlockProtocol
|
|
14
|
+
from chia.types.blockchain_format.program import Program
|
|
15
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
16
|
+
from chia.types.peer_info import PeerInfo
|
|
17
|
+
from chia.util.ints import uint32, uint64
|
|
18
|
+
from chia.wallet.cat_wallet.cat_wallet import CATWallet
|
|
19
|
+
from chia.wallet.nft_wallet.nft_wallet import NFTWallet
|
|
20
|
+
from chia.wallet.outer_puzzles import create_asset_id, match_puzzle
|
|
21
|
+
from chia.wallet.puzzle_drivers import PuzzleInfo
|
|
22
|
+
from chia.wallet.trading.offer import Offer
|
|
23
|
+
from chia.wallet.trading.trade_status import TradeStatus
|
|
24
|
+
from chia.wallet.uncurried_puzzle import uncurry_puzzle
|
|
25
|
+
from chia.wallet.util.debug_spend_bundle import disassemble
|
|
26
|
+
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def get_trade_and_status(trade_manager, trade) -> TradeStatus: # type: ignore
|
|
30
|
+
trade_rec = await trade_manager.get_trade_by_id(trade.trade_id)
|
|
31
|
+
return TradeStatus(trade_rec.status)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@pytest.mark.parametrize(
|
|
35
|
+
"trusted",
|
|
36
|
+
[False],
|
|
37
|
+
)
|
|
38
|
+
@pytest.mark.parametrize(
|
|
39
|
+
"reuse_puzhash",
|
|
40
|
+
[True, False],
|
|
41
|
+
)
|
|
42
|
+
@pytest.mark.anyio
|
|
43
|
+
async def test_nft_offer_with_fee(
|
|
44
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, reuse_puzhash: bool, seeded_random: random.Random
|
|
45
|
+
) -> None:
|
|
46
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
47
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
48
|
+
full_node_server = full_node_api.server
|
|
49
|
+
wallet_node_0, server_0 = wallets[0]
|
|
50
|
+
wallet_node_1, server_1 = wallets[1]
|
|
51
|
+
wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
|
|
52
|
+
wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
|
|
53
|
+
|
|
54
|
+
tx_config = DEFAULT_TX_CONFIG.override(reuse_puzhash=reuse_puzhash)
|
|
55
|
+
|
|
56
|
+
maker_ph = await wallet_maker.get_new_puzzlehash()
|
|
57
|
+
taker_ph = await wallet_taker.get_new_puzzlehash()
|
|
58
|
+
token_ph = bytes32.random(seeded_random)
|
|
59
|
+
|
|
60
|
+
if trusted:
|
|
61
|
+
wallet_node_0.config["trusted_peers"] = {
|
|
62
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
63
|
+
}
|
|
64
|
+
wallet_node_1.config["trusted_peers"] = {
|
|
65
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
66
|
+
}
|
|
67
|
+
else:
|
|
68
|
+
wallet_node_0.config["trusted_peers"] = {}
|
|
69
|
+
wallet_node_1.config["trusted_peers"] = {}
|
|
70
|
+
|
|
71
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
72
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
73
|
+
|
|
74
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
|
|
75
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
|
|
76
|
+
|
|
77
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
78
|
+
|
|
79
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
80
|
+
|
|
81
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
|
|
82
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
|
|
83
|
+
|
|
84
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
85
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
86
|
+
|
|
87
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
88
|
+
wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
92
|
+
wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
96
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
97
|
+
|
|
98
|
+
metadata = Program.to(
|
|
99
|
+
[
|
|
100
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
101
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
102
|
+
]
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
|
|
106
|
+
await nft_wallet_maker.generate_new_nft(metadata, action_scope)
|
|
107
|
+
for tx in action_scope.side_effects.transactions:
|
|
108
|
+
if tx.spend_bundle is not None:
|
|
109
|
+
await time_out_assert_not_none(
|
|
110
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
114
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
115
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
116
|
+
assert len(coins_maker) == 1
|
|
117
|
+
|
|
118
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
119
|
+
# MAKE FIRST TRADE: 1 NFT for 100 xch
|
|
120
|
+
maker_balance_pre = await wallet_maker.get_confirmed_balance()
|
|
121
|
+
taker_balance_pre = await wallet_taker.get_confirmed_balance()
|
|
122
|
+
|
|
123
|
+
nft_to_offer = coins_maker[0]
|
|
124
|
+
nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
125
|
+
nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
|
|
126
|
+
driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
|
|
127
|
+
|
|
128
|
+
xch_request = 100
|
|
129
|
+
maker_fee = uint64(10)
|
|
130
|
+
offer_nft_for_xch = {wallet_maker.id(): xch_request, nft_asset_id: -1}
|
|
131
|
+
maker_unused_index = (
|
|
132
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
133
|
+
).index
|
|
134
|
+
taker_unused_index = (
|
|
135
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
136
|
+
).index
|
|
137
|
+
|
|
138
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
|
|
139
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
140
|
+
offer_nft_for_xch, action_scope, driver_dict, fee=maker_fee
|
|
141
|
+
)
|
|
142
|
+
assert success is True
|
|
143
|
+
assert error is None
|
|
144
|
+
assert trade_make is not None
|
|
145
|
+
|
|
146
|
+
taker_fee = uint64(1)
|
|
147
|
+
|
|
148
|
+
[_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
|
|
149
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
150
|
+
)
|
|
151
|
+
peer = wallet_node_1.get_full_node_peer()
|
|
152
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
153
|
+
tx_config, push=True, additional_signing_responses=signing_response
|
|
154
|
+
) as action_scope:
|
|
155
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
156
|
+
Offer.from_bytes(trade_make.offer),
|
|
157
|
+
peer,
|
|
158
|
+
action_scope,
|
|
159
|
+
fee=taker_fee,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
163
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
164
|
+
|
|
165
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
|
|
166
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
|
|
167
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, maker_balance_pre + xch_request - maker_fee)
|
|
168
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, taker_balance_pre - xch_request - taker_fee)
|
|
169
|
+
coins_taker = await nft_wallet_taker.get_current_nfts()
|
|
170
|
+
assert len(coins_taker) == 1
|
|
171
|
+
|
|
172
|
+
assert await nft_wallet_maker.get_nft_count() == 0
|
|
173
|
+
if reuse_puzhash:
|
|
174
|
+
# Check if unused index changed
|
|
175
|
+
assert (
|
|
176
|
+
maker_unused_index
|
|
177
|
+
== (
|
|
178
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
179
|
+
).index
|
|
180
|
+
)
|
|
181
|
+
assert (
|
|
182
|
+
taker_unused_index
|
|
183
|
+
== (
|
|
184
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
185
|
+
).index
|
|
186
|
+
)
|
|
187
|
+
else:
|
|
188
|
+
assert (
|
|
189
|
+
maker_unused_index
|
|
190
|
+
< (
|
|
191
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
192
|
+
).index
|
|
193
|
+
)
|
|
194
|
+
assert (
|
|
195
|
+
taker_unused_index
|
|
196
|
+
< (
|
|
197
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
198
|
+
).index
|
|
199
|
+
)
|
|
200
|
+
# MAKE SECOND TRADE: 100 xch for 1 NFT
|
|
201
|
+
|
|
202
|
+
maker_balance_pre = await wallet_maker.get_confirmed_balance()
|
|
203
|
+
taker_balance_pre = await wallet_taker.get_confirmed_balance()
|
|
204
|
+
|
|
205
|
+
nft_to_buy = coins_taker[0]
|
|
206
|
+
nft_to_buy_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_buy.full_puzzle))
|
|
207
|
+
nft_to_buy_asset_id: bytes32 = create_asset_id(nft_to_buy_info) # type: ignore
|
|
208
|
+
driver_dict_to_buy: dict[bytes32, Optional[PuzzleInfo]] = {nft_to_buy_asset_id: nft_to_buy_info}
|
|
209
|
+
|
|
210
|
+
xch_offered = 1000
|
|
211
|
+
maker_fee = uint64(10)
|
|
212
|
+
offer_xch_for_nft = {wallet_maker.id(): -xch_offered, nft_to_buy_asset_id: 1}
|
|
213
|
+
|
|
214
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
|
|
215
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
216
|
+
offer_xch_for_nft, action_scope, driver_dict_to_buy, fee=maker_fee
|
|
217
|
+
)
|
|
218
|
+
assert success is True
|
|
219
|
+
assert error is None
|
|
220
|
+
assert trade_make is not None
|
|
221
|
+
|
|
222
|
+
taker_fee = uint64(1)
|
|
223
|
+
|
|
224
|
+
[_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
|
|
225
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
226
|
+
)
|
|
227
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
228
|
+
tx_config, push=True, additional_signing_responses=signing_response
|
|
229
|
+
) as action_scope:
|
|
230
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
231
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=taker_fee
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
235
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
236
|
+
|
|
237
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
|
|
238
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
|
|
239
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, maker_balance_pre - xch_offered - maker_fee)
|
|
240
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, taker_balance_pre + xch_offered - taker_fee)
|
|
241
|
+
|
|
242
|
+
assert await nft_wallet_maker.get_nft_count() == 1
|
|
243
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
@pytest.mark.parametrize(
|
|
247
|
+
"trusted",
|
|
248
|
+
[False],
|
|
249
|
+
)
|
|
250
|
+
@pytest.mark.anyio
|
|
251
|
+
async def test_nft_offer_cancellations(
|
|
252
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
|
|
253
|
+
) -> None:
|
|
254
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
255
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
256
|
+
full_node_server = full_node_api.server
|
|
257
|
+
wallet_node_0, server_0 = wallets[0]
|
|
258
|
+
wallet_node_1, server_1 = wallets[1]
|
|
259
|
+
wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
|
|
260
|
+
wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
|
|
261
|
+
|
|
262
|
+
maker_ph = await wallet_maker.get_new_puzzlehash()
|
|
263
|
+
taker_ph = await wallet_taker.get_new_puzzlehash()
|
|
264
|
+
token_ph = bytes32.random(seeded_random)
|
|
265
|
+
|
|
266
|
+
if trusted:
|
|
267
|
+
wallet_node_0.config["trusted_peers"] = {
|
|
268
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
269
|
+
}
|
|
270
|
+
wallet_node_1.config["trusted_peers"] = {
|
|
271
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
272
|
+
}
|
|
273
|
+
else:
|
|
274
|
+
wallet_node_0.config["trusted_peers"] = {}
|
|
275
|
+
wallet_node_1.config["trusted_peers"] = {}
|
|
276
|
+
|
|
277
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
278
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
279
|
+
|
|
280
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
|
|
281
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
|
|
282
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
283
|
+
|
|
284
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
285
|
+
|
|
286
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
|
|
287
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
|
|
288
|
+
|
|
289
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
290
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
291
|
+
|
|
292
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
293
|
+
wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
297
|
+
wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
301
|
+
# trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
302
|
+
|
|
303
|
+
metadata = Program.to(
|
|
304
|
+
[
|
|
305
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
306
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
307
|
+
]
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
311
|
+
await nft_wallet_maker.generate_new_nft(metadata, action_scope)
|
|
312
|
+
for tx in action_scope.side_effects.transactions:
|
|
313
|
+
if tx.spend_bundle is not None:
|
|
314
|
+
await time_out_assert_not_none(
|
|
315
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
319
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
320
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
321
|
+
assert len(coins_maker) == 1
|
|
322
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
323
|
+
# maker creates offer and cancels
|
|
324
|
+
maker_balance_pre = await wallet_maker.get_confirmed_balance()
|
|
325
|
+
# taker_balance_pre = await wallet_taker.get_confirmed_balance()
|
|
326
|
+
|
|
327
|
+
nft_to_offer = coins_maker[0]
|
|
328
|
+
nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
329
|
+
nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
|
|
330
|
+
driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
|
|
331
|
+
|
|
332
|
+
xch_request = 100
|
|
333
|
+
maker_fee = uint64(10)
|
|
334
|
+
offer_nft_for_xch = {wallet_maker.id(): xch_request, nft_asset_id: -1}
|
|
335
|
+
|
|
336
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
337
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
338
|
+
offer_nft_for_xch, action_scope, driver_dict, fee=maker_fee
|
|
339
|
+
)
|
|
340
|
+
assert success is True
|
|
341
|
+
assert error is None
|
|
342
|
+
assert trade_make is not None
|
|
343
|
+
|
|
344
|
+
# await trade_manager_maker.cancel_pending_offers([trade_make.trade_id], secure=False)
|
|
345
|
+
# await time_out_assert(20, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
|
|
346
|
+
|
|
347
|
+
cancel_fee = uint64(10)
|
|
348
|
+
|
|
349
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
350
|
+
await trade_manager_maker.cancel_pending_offers(
|
|
351
|
+
[trade_make.trade_id], action_scope, fee=cancel_fee, secure=True
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager_maker, trade_make)
|
|
355
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
356
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
357
|
+
|
|
358
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CANCELLED, trade_manager_maker, trade_make)
|
|
359
|
+
|
|
360
|
+
maker_balance = await wallet_maker.get_confirmed_balance()
|
|
361
|
+
assert maker_balance == maker_balance_pre - cancel_fee
|
|
362
|
+
assert await nft_wallet_maker.get_nft_count() == 1
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
@pytest.mark.parametrize(
|
|
366
|
+
"trusted",
|
|
367
|
+
[False],
|
|
368
|
+
)
|
|
369
|
+
@pytest.mark.anyio
|
|
370
|
+
async def test_nft_offer_with_metadata_update(
|
|
371
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
|
|
372
|
+
) -> None:
|
|
373
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
374
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
375
|
+
full_node_server = full_node_api.server
|
|
376
|
+
wallet_node_0, server_0 = wallets[0]
|
|
377
|
+
wallet_node_1, server_1 = wallets[1]
|
|
378
|
+
wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
|
|
379
|
+
wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
|
|
380
|
+
|
|
381
|
+
maker_ph = await wallet_maker.get_new_puzzlehash()
|
|
382
|
+
taker_ph = await wallet_taker.get_new_puzzlehash()
|
|
383
|
+
token_ph = bytes32.random(seeded_random)
|
|
384
|
+
|
|
385
|
+
if trusted:
|
|
386
|
+
wallet_node_0.config["trusted_peers"] = {
|
|
387
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
388
|
+
}
|
|
389
|
+
wallet_node_1.config["trusted_peers"] = {
|
|
390
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
391
|
+
}
|
|
392
|
+
else:
|
|
393
|
+
wallet_node_0.config["trusted_peers"] = {}
|
|
394
|
+
wallet_node_1.config["trusted_peers"] = {}
|
|
395
|
+
|
|
396
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
397
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
398
|
+
|
|
399
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
|
|
400
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
|
|
401
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
402
|
+
|
|
403
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
404
|
+
|
|
405
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
|
|
406
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
|
|
407
|
+
|
|
408
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
409
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
410
|
+
|
|
411
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
412
|
+
wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
416
|
+
wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
420
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
421
|
+
|
|
422
|
+
metadata = Program.to(
|
|
423
|
+
[
|
|
424
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
425
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
426
|
+
("mu", []),
|
|
427
|
+
("lu", []),
|
|
428
|
+
("sn", uint64(1)),
|
|
429
|
+
("st", uint64(1)),
|
|
430
|
+
]
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
434
|
+
await nft_wallet_maker.generate_new_nft(metadata, action_scope)
|
|
435
|
+
for tx in action_scope.side_effects.transactions:
|
|
436
|
+
if tx.spend_bundle is not None:
|
|
437
|
+
await time_out_assert_not_none(
|
|
438
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
442
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
443
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
444
|
+
assert len(coins_maker) == 1
|
|
445
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
446
|
+
|
|
447
|
+
# Maker updates metadata:
|
|
448
|
+
nft_to_update = coins_maker[0]
|
|
449
|
+
url_to_add = "https://new_url.com"
|
|
450
|
+
key = "mu"
|
|
451
|
+
fee_for_update = uint64(10)
|
|
452
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
453
|
+
await nft_wallet_maker.update_metadata(nft_to_update, key, url_to_add, action_scope, fee=fee_for_update)
|
|
454
|
+
mempool_mgr = full_node_api.full_node.mempool_manager
|
|
455
|
+
for tx in action_scope.side_effects.transactions:
|
|
456
|
+
if tx.spend_bundle is not None:
|
|
457
|
+
await time_out_assert_not_none(20, mempool_mgr.get_spendbundle, tx.spend_bundle.name())
|
|
458
|
+
|
|
459
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
460
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
461
|
+
|
|
462
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
463
|
+
updated_nft = coins_maker[0]
|
|
464
|
+
updated_nft_info = match_puzzle(uncurry_puzzle(updated_nft.full_puzzle))
|
|
465
|
+
|
|
466
|
+
assert url_to_add in disassemble(updated_nft_info.also().info["metadata"]) # type: ignore
|
|
467
|
+
|
|
468
|
+
# MAKE FIRST TRADE: 1 NFT for 100 xch
|
|
469
|
+
maker_balance_pre = await wallet_maker.get_confirmed_balance()
|
|
470
|
+
taker_balance_pre = await wallet_taker.get_confirmed_balance()
|
|
471
|
+
|
|
472
|
+
nft_to_offer = coins_maker[0]
|
|
473
|
+
nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
474
|
+
nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
|
|
475
|
+
driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
|
|
476
|
+
|
|
477
|
+
xch_request = 100
|
|
478
|
+
maker_fee = uint64(10)
|
|
479
|
+
offer_nft_for_xch = {wallet_maker.id(): xch_request, nft_asset_id: -1}
|
|
480
|
+
|
|
481
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
482
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
483
|
+
offer_nft_for_xch, action_scope, driver_dict, fee=maker_fee
|
|
484
|
+
)
|
|
485
|
+
assert success is True
|
|
486
|
+
assert error is None
|
|
487
|
+
assert trade_make is not None
|
|
488
|
+
|
|
489
|
+
taker_fee = uint64(1)
|
|
490
|
+
|
|
491
|
+
[_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
|
|
492
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
493
|
+
)
|
|
494
|
+
peer = wallet_node_1.get_full_node_peer()
|
|
495
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
496
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
497
|
+
) as action_scope:
|
|
498
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
499
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=taker_fee
|
|
500
|
+
)
|
|
501
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
502
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
503
|
+
|
|
504
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
|
|
505
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
|
|
506
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, maker_balance_pre + xch_request - maker_fee)
|
|
507
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, taker_balance_pre - xch_request - taker_fee)
|
|
508
|
+
|
|
509
|
+
assert await nft_wallet_maker.get_nft_count() == 0
|
|
510
|
+
assert await nft_wallet_taker.get_nft_count() == 1
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
@pytest.mark.parametrize("trusted", [False])
|
|
514
|
+
@pytest.mark.parametrize("reuse_puzhash", [True, False])
|
|
515
|
+
@pytest.mark.anyio
|
|
516
|
+
async def test_nft_offer_nft_for_cat(
|
|
517
|
+
self_hostname: str,
|
|
518
|
+
two_wallet_nodes: Any,
|
|
519
|
+
trusted: Any,
|
|
520
|
+
reuse_puzhash: bool,
|
|
521
|
+
seeded_random: random.Random,
|
|
522
|
+
) -> None:
|
|
523
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
524
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
525
|
+
full_node_server = full_node_api.server
|
|
526
|
+
wallet_node_0, server_0 = wallets[0]
|
|
527
|
+
wallet_node_1, server_1 = wallets[1]
|
|
528
|
+
wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
|
|
529
|
+
wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
|
|
530
|
+
|
|
531
|
+
maker_ph = await wallet_maker.get_new_puzzlehash()
|
|
532
|
+
taker_ph = await wallet_taker.get_new_puzzlehash()
|
|
533
|
+
token_ph = bytes32.random(seeded_random)
|
|
534
|
+
|
|
535
|
+
if trusted:
|
|
536
|
+
wallet_node_0.config["trusted_peers"] = {
|
|
537
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
538
|
+
}
|
|
539
|
+
wallet_node_1.config["trusted_peers"] = {
|
|
540
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
541
|
+
}
|
|
542
|
+
else:
|
|
543
|
+
wallet_node_0.config["trusted_peers"] = {}
|
|
544
|
+
wallet_node_1.config["trusted_peers"] = {}
|
|
545
|
+
|
|
546
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
547
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
548
|
+
|
|
549
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
|
|
550
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
|
|
551
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
552
|
+
|
|
553
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
554
|
+
|
|
555
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
|
|
556
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
|
|
557
|
+
|
|
558
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
559
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
560
|
+
|
|
561
|
+
tx_config = DEFAULT_TX_CONFIG.override(reuse_puzhash=reuse_puzhash)
|
|
562
|
+
|
|
563
|
+
# Create NFT wallets and nfts for maker and taker
|
|
564
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
565
|
+
wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
569
|
+
wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
|
|
570
|
+
)
|
|
571
|
+
|
|
572
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
573
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
574
|
+
|
|
575
|
+
metadata = Program.to(
|
|
576
|
+
[
|
|
577
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
578
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
579
|
+
]
|
|
580
|
+
)
|
|
581
|
+
|
|
582
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
|
|
583
|
+
await nft_wallet_maker.generate_new_nft(metadata, action_scope)
|
|
584
|
+
for tx in action_scope.side_effects.transactions:
|
|
585
|
+
if tx.spend_bundle is not None:
|
|
586
|
+
await time_out_assert_not_none(
|
|
587
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
588
|
+
)
|
|
589
|
+
|
|
590
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
591
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
592
|
+
|
|
593
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
594
|
+
assert len(coins_maker) == 1
|
|
595
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
596
|
+
# Create two new CATs and wallets for maker and taker
|
|
597
|
+
cats_to_mint = 10000
|
|
598
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
|
|
599
|
+
cat_wallet_maker = await CATWallet.create_new_cat_wallet(
|
|
600
|
+
wallet_node_0.wallet_state_manager,
|
|
601
|
+
wallet_maker,
|
|
602
|
+
{"identifier": "genesis_by_id"},
|
|
603
|
+
uint64(cats_to_mint),
|
|
604
|
+
action_scope,
|
|
605
|
+
)
|
|
606
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
607
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
608
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
609
|
+
|
|
610
|
+
async with wallet_taker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
|
|
611
|
+
cat_wallet_taker = await CATWallet.create_new_cat_wallet(
|
|
612
|
+
wallet_node_1.wallet_state_manager,
|
|
613
|
+
wallet_taker,
|
|
614
|
+
{"identifier": "genesis_by_id"},
|
|
615
|
+
uint64(cats_to_mint),
|
|
616
|
+
action_scope,
|
|
617
|
+
)
|
|
618
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
619
|
+
|
|
620
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
621
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
622
|
+
|
|
623
|
+
await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
|
|
624
|
+
await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
|
|
625
|
+
await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, cats_to_mint)
|
|
626
|
+
await time_out_assert(20, cat_wallet_taker.get_unconfirmed_balance, cats_to_mint)
|
|
627
|
+
|
|
628
|
+
wallet_maker_for_taker_cat: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
|
|
629
|
+
wallet_node_0.wallet_state_manager, wallet_maker, cat_wallet_taker.get_asset_id()
|
|
630
|
+
)
|
|
631
|
+
|
|
632
|
+
wallet_taker_for_maker_cat: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
|
|
633
|
+
wallet_node_1.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
|
|
634
|
+
)
|
|
635
|
+
|
|
636
|
+
assert wallet_taker_for_maker_cat
|
|
637
|
+
# MAKE FIRST TRADE: 1 NFT for 10 taker cats
|
|
638
|
+
maker_balance_pre = await wallet_maker.get_confirmed_balance()
|
|
639
|
+
taker_balance_pre = await wallet_taker.get_confirmed_balance()
|
|
640
|
+
taker_cat_maker_balance_pre = await wallet_maker_for_taker_cat.get_confirmed_balance()
|
|
641
|
+
taker_cat_taker_balance_pre = await cat_wallet_taker.get_confirmed_balance()
|
|
642
|
+
|
|
643
|
+
nft_to_offer = coins_maker[0]
|
|
644
|
+
nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
645
|
+
nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
|
|
646
|
+
driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
|
|
647
|
+
|
|
648
|
+
maker_fee = uint64(10)
|
|
649
|
+
taker_cat_offered = 2500
|
|
650
|
+
offer_nft_for_cat = {nft_asset_id: -1, wallet_maker_for_taker_cat.id(): taker_cat_offered}
|
|
651
|
+
maker_unused_index = (
|
|
652
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
653
|
+
).index
|
|
654
|
+
taker_unused_index = (
|
|
655
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
656
|
+
).index
|
|
657
|
+
|
|
658
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
|
|
659
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
660
|
+
offer_nft_for_cat, action_scope, driver_dict, fee=maker_fee
|
|
661
|
+
)
|
|
662
|
+
assert success is True
|
|
663
|
+
assert error is None
|
|
664
|
+
assert trade_make is not None
|
|
665
|
+
|
|
666
|
+
taker_fee = uint64(1)
|
|
667
|
+
|
|
668
|
+
[_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
|
|
669
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
670
|
+
)
|
|
671
|
+
peer = wallet_node_1.get_full_node_peer()
|
|
672
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
673
|
+
tx_config, push=True, additional_signing_responses=signing_response
|
|
674
|
+
) as action_scope:
|
|
675
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
676
|
+
Offer.from_bytes(trade_make.offer),
|
|
677
|
+
peer,
|
|
678
|
+
action_scope,
|
|
679
|
+
fee=taker_fee,
|
|
680
|
+
)
|
|
681
|
+
|
|
682
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
683
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
684
|
+
|
|
685
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
|
|
686
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
|
|
687
|
+
|
|
688
|
+
taker_cat_maker_balance_post = await wallet_maker_for_taker_cat.get_confirmed_balance()
|
|
689
|
+
taker_cat_taker_balance_post = await cat_wallet_taker.get_confirmed_balance()
|
|
690
|
+
assert taker_cat_maker_balance_post == taker_cat_maker_balance_pre + taker_cat_offered
|
|
691
|
+
assert taker_cat_taker_balance_post == taker_cat_taker_balance_pre - taker_cat_offered
|
|
692
|
+
maker_balance_post = await wallet_maker.get_confirmed_balance()
|
|
693
|
+
taker_balance_post = await wallet_taker.get_confirmed_balance()
|
|
694
|
+
assert maker_balance_post == maker_balance_pre - maker_fee
|
|
695
|
+
assert taker_balance_post == taker_balance_pre - taker_fee
|
|
696
|
+
coins_taker = await nft_wallet_taker.get_current_nfts()
|
|
697
|
+
assert len(coins_taker) == 1
|
|
698
|
+
|
|
699
|
+
assert await nft_wallet_maker.get_nft_count() == 0
|
|
700
|
+
if reuse_puzhash:
|
|
701
|
+
# Check if unused index changed
|
|
702
|
+
assert (
|
|
703
|
+
maker_unused_index
|
|
704
|
+
== (
|
|
705
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
706
|
+
).index
|
|
707
|
+
)
|
|
708
|
+
assert (
|
|
709
|
+
taker_unused_index
|
|
710
|
+
== (
|
|
711
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
712
|
+
).index
|
|
713
|
+
)
|
|
714
|
+
else:
|
|
715
|
+
assert (
|
|
716
|
+
maker_unused_index
|
|
717
|
+
< (
|
|
718
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
719
|
+
).index
|
|
720
|
+
)
|
|
721
|
+
assert (
|
|
722
|
+
taker_unused_index
|
|
723
|
+
< (
|
|
724
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
725
|
+
).index
|
|
726
|
+
)
|
|
727
|
+
# Make an offer for taker NFT for multiple cats
|
|
728
|
+
maker_cat_amount = 400
|
|
729
|
+
taker_cat_amount = 500
|
|
730
|
+
|
|
731
|
+
nft_to_buy = coins_taker[0]
|
|
732
|
+
nft_to_buy_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_buy.full_puzzle))
|
|
733
|
+
nft_to_buy_asset_id: bytes32 = create_asset_id(nft_to_buy_info) # type: ignore
|
|
734
|
+
|
|
735
|
+
driver_dict_to_buy: dict[bytes32, Optional[PuzzleInfo]] = {
|
|
736
|
+
nft_to_buy_asset_id: nft_to_buy_info,
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
maker_fee = uint64(10)
|
|
740
|
+
offer_multi_cats_for_nft = {
|
|
741
|
+
nft_to_buy_asset_id: 1,
|
|
742
|
+
wallet_maker_for_taker_cat.id(): -taker_cat_amount,
|
|
743
|
+
cat_wallet_maker.id(): -maker_cat_amount,
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
|
|
747
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
748
|
+
offer_multi_cats_for_nft, action_scope, driver_dict_to_buy, fee=maker_fee
|
|
749
|
+
)
|
|
750
|
+
assert success is True
|
|
751
|
+
assert error is None
|
|
752
|
+
assert trade_make is not None
|
|
753
|
+
|
|
754
|
+
taker_fee = uint64(1)
|
|
755
|
+
|
|
756
|
+
[_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
|
|
757
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
758
|
+
)
|
|
759
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
760
|
+
tx_config, push=True, additional_signing_responses=signing_response
|
|
761
|
+
) as action_scope:
|
|
762
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
763
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=taker_fee
|
|
764
|
+
)
|
|
765
|
+
|
|
766
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
767
|
+
# check balances: taker wallet down an NFT, up cats
|
|
768
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
769
|
+
|
|
770
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
|
|
771
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
|
|
772
|
+
|
|
773
|
+
taker_cat_maker_balance_post_2 = await wallet_maker_for_taker_cat.get_confirmed_balance()
|
|
774
|
+
taker_cat_taker_balance_post_2 = await cat_wallet_taker.get_confirmed_balance()
|
|
775
|
+
assert taker_cat_maker_balance_post_2 == taker_cat_maker_balance_post - taker_cat_amount
|
|
776
|
+
assert taker_cat_taker_balance_post_2 == taker_cat_taker_balance_post + taker_cat_amount
|
|
777
|
+
maker_balance_post_2 = await wallet_maker.get_confirmed_balance()
|
|
778
|
+
taker_balance_post_2 = await wallet_taker.get_confirmed_balance()
|
|
779
|
+
assert maker_balance_post_2 == maker_balance_post - maker_fee
|
|
780
|
+
assert taker_balance_post_2 == taker_balance_post - taker_fee
|
|
781
|
+
assert await nft_wallet_maker.get_nft_count() == 1
|
|
782
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
@pytest.mark.parametrize(
|
|
786
|
+
"trusted",
|
|
787
|
+
[False],
|
|
788
|
+
)
|
|
789
|
+
@pytest.mark.anyio
|
|
790
|
+
async def test_nft_offer_nft_for_nft(
|
|
791
|
+
self_hostname: str, two_wallet_nodes: Any, trusted: Any, seeded_random: random.Random
|
|
792
|
+
) -> None:
|
|
793
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
794
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
795
|
+
full_node_server = full_node_api.server
|
|
796
|
+
wallet_node_0, server_0 = wallets[0]
|
|
797
|
+
wallet_node_1, server_1 = wallets[1]
|
|
798
|
+
wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
|
|
799
|
+
wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
|
|
800
|
+
|
|
801
|
+
maker_ph = await wallet_maker.get_new_puzzlehash()
|
|
802
|
+
taker_ph = await wallet_taker.get_new_puzzlehash()
|
|
803
|
+
token_ph = bytes32.random(seeded_random)
|
|
804
|
+
|
|
805
|
+
if trusted:
|
|
806
|
+
wallet_node_0.config["trusted_peers"] = {
|
|
807
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
808
|
+
}
|
|
809
|
+
wallet_node_1.config["trusted_peers"] = {
|
|
810
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
811
|
+
}
|
|
812
|
+
else:
|
|
813
|
+
wallet_node_0.config["trusted_peers"] = {}
|
|
814
|
+
wallet_node_1.config["trusted_peers"] = {}
|
|
815
|
+
|
|
816
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
817
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
818
|
+
|
|
819
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
|
|
820
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
|
|
821
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
822
|
+
|
|
823
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
824
|
+
|
|
825
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
|
|
826
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
|
|
827
|
+
|
|
828
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
829
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
830
|
+
|
|
831
|
+
# Create NFT wallets and nfts for maker and taker
|
|
832
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
833
|
+
wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
|
|
834
|
+
)
|
|
835
|
+
|
|
836
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
837
|
+
wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
|
|
838
|
+
)
|
|
839
|
+
|
|
840
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
841
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
842
|
+
|
|
843
|
+
metadata = Program.to(
|
|
844
|
+
[
|
|
845
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
846
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
847
|
+
]
|
|
848
|
+
)
|
|
849
|
+
|
|
850
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
851
|
+
await nft_wallet_maker.generate_new_nft(metadata, action_scope)
|
|
852
|
+
for tx in action_scope.side_effects.transactions:
|
|
853
|
+
if tx.spend_bundle is not None:
|
|
854
|
+
await time_out_assert_not_none(
|
|
855
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
856
|
+
)
|
|
857
|
+
|
|
858
|
+
metadata_2 = Program.to(
|
|
859
|
+
[
|
|
860
|
+
("u", ["https://www.chia.net/image2.html"]),
|
|
861
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F183"),
|
|
862
|
+
]
|
|
863
|
+
)
|
|
864
|
+
|
|
865
|
+
async with nft_wallet_taker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
866
|
+
await nft_wallet_taker.generate_new_nft(metadata_2, action_scope)
|
|
867
|
+
for tx in action_scope.side_effects.transactions:
|
|
868
|
+
if tx.spend_bundle is not None:
|
|
869
|
+
await time_out_assert_not_none(
|
|
870
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
871
|
+
)
|
|
872
|
+
|
|
873
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
874
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
875
|
+
|
|
876
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
877
|
+
assert len(coins_maker) == 1
|
|
878
|
+
coins_taker = await nft_wallet_taker.get_current_nfts()
|
|
879
|
+
assert len(coins_taker) == 1
|
|
880
|
+
|
|
881
|
+
maker_balance_pre = await wallet_maker.get_confirmed_balance()
|
|
882
|
+
taker_balance_pre = await wallet_taker.get_confirmed_balance()
|
|
883
|
+
|
|
884
|
+
nft_to_offer = coins_maker[0]
|
|
885
|
+
nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
886
|
+
nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
|
|
887
|
+
|
|
888
|
+
nft_to_take = coins_taker[0]
|
|
889
|
+
nft_to_take_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_take.full_puzzle))
|
|
890
|
+
nft_to_take_asset_id: bytes32 = create_asset_id(nft_to_take_info) # type: ignore
|
|
891
|
+
|
|
892
|
+
driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {
|
|
893
|
+
nft_to_offer_asset_id: nft_to_offer_info,
|
|
894
|
+
nft_to_take_asset_id: nft_to_take_info,
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
maker_fee = uint64(10)
|
|
898
|
+
offer_nft_for_nft = {nft_to_take_asset_id: 1, nft_to_offer_asset_id: -1}
|
|
899
|
+
|
|
900
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=False) as action_scope:
|
|
901
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
902
|
+
offer_nft_for_nft, action_scope, driver_dict, fee=maker_fee
|
|
903
|
+
)
|
|
904
|
+
assert success is True
|
|
905
|
+
assert error is None
|
|
906
|
+
assert trade_make is not None
|
|
907
|
+
|
|
908
|
+
taker_fee = uint64(1)
|
|
909
|
+
|
|
910
|
+
[_maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
|
|
911
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
912
|
+
)
|
|
913
|
+
peer = wallet_node_1.get_full_node_peer()
|
|
914
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
915
|
+
DEFAULT_TX_CONFIG, push=True, additional_signing_responses=signing_response
|
|
916
|
+
) as action_scope:
|
|
917
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
918
|
+
Offer.from_bytes(trade_make.offer), peer, action_scope, fee=taker_fee
|
|
919
|
+
)
|
|
920
|
+
|
|
921
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
922
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
923
|
+
|
|
924
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
|
|
925
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
|
|
926
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, maker_balance_pre - maker_fee)
|
|
927
|
+
await time_out_assert(20, wallet_taker.get_confirmed_balance, taker_balance_pre - taker_fee)
|
|
928
|
+
|
|
929
|
+
assert await nft_wallet_maker.get_nft_count() == 1
|
|
930
|
+
assert await nft_wallet_taker.get_nft_count() == 1
|
|
931
|
+
|
|
932
|
+
|
|
933
|
+
@pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.PLAIN], reason="save time")
|
|
934
|
+
@pytest.mark.parametrize("trusted", [True, False])
|
|
935
|
+
@pytest.mark.parametrize("reuse_puzhash", [True, False])
|
|
936
|
+
@pytest.mark.anyio
|
|
937
|
+
async def test_nft_offer_nft0_and_xch_for_cat(
|
|
938
|
+
self_hostname: str,
|
|
939
|
+
two_wallet_nodes: Any,
|
|
940
|
+
trusted: Any,
|
|
941
|
+
reuse_puzhash: bool,
|
|
942
|
+
seeded_random: random.Random,
|
|
943
|
+
) -> None:
|
|
944
|
+
full_nodes, wallets, _ = two_wallet_nodes
|
|
945
|
+
full_node_api: FullNodeSimulator = full_nodes[0]
|
|
946
|
+
full_node_server = full_node_api.server
|
|
947
|
+
wallet_node_0, server_0 = wallets[0]
|
|
948
|
+
wallet_node_1, server_1 = wallets[1]
|
|
949
|
+
wallet_maker = wallet_node_0.wallet_state_manager.main_wallet
|
|
950
|
+
wallet_taker = wallet_node_1.wallet_state_manager.main_wallet
|
|
951
|
+
|
|
952
|
+
maker_ph = await wallet_maker.get_new_puzzlehash()
|
|
953
|
+
taker_ph = await wallet_taker.get_new_puzzlehash()
|
|
954
|
+
token_ph = bytes32.random(seeded_random)
|
|
955
|
+
|
|
956
|
+
if trusted:
|
|
957
|
+
wallet_node_0.config["trusted_peers"] = {
|
|
958
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
959
|
+
}
|
|
960
|
+
wallet_node_1.config["trusted_peers"] = {
|
|
961
|
+
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
|
962
|
+
}
|
|
963
|
+
else:
|
|
964
|
+
wallet_node_0.config["trusted_peers"] = {}
|
|
965
|
+
wallet_node_1.config["trusted_peers"] = {}
|
|
966
|
+
|
|
967
|
+
await server_0.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
968
|
+
await server_1.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
969
|
+
|
|
970
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(maker_ph))
|
|
971
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(taker_ph))
|
|
972
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
973
|
+
|
|
974
|
+
funds = sum(calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, 2))
|
|
975
|
+
|
|
976
|
+
await time_out_assert(20, wallet_maker.get_unconfirmed_balance, funds)
|
|
977
|
+
await time_out_assert(20, wallet_maker.get_confirmed_balance, funds)
|
|
978
|
+
|
|
979
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
980
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
981
|
+
|
|
982
|
+
tx_config = DEFAULT_TX_CONFIG.override(reuse_puzhash=reuse_puzhash)
|
|
983
|
+
|
|
984
|
+
# Create NFT wallets and nfts for maker and taker
|
|
985
|
+
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
|
986
|
+
wallet_node_0.wallet_state_manager, wallet_maker, name="NFT WALLET 1"
|
|
987
|
+
)
|
|
988
|
+
|
|
989
|
+
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
|
990
|
+
wallet_node_1.wallet_state_manager, wallet_taker, name="NFT WALLET 2"
|
|
991
|
+
)
|
|
992
|
+
|
|
993
|
+
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
|
994
|
+
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
|
995
|
+
|
|
996
|
+
metadata = Program.to(
|
|
997
|
+
[
|
|
998
|
+
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
|
999
|
+
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
|
1000
|
+
]
|
|
1001
|
+
)
|
|
1002
|
+
|
|
1003
|
+
async with nft_wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
|
|
1004
|
+
await nft_wallet_maker.generate_new_nft(metadata, action_scope)
|
|
1005
|
+
for tx in action_scope.side_effects.transactions:
|
|
1006
|
+
if tx.spend_bundle is not None:
|
|
1007
|
+
await time_out_assert_not_none(
|
|
1008
|
+
20, full_node_api.full_node.mempool_manager.get_spendbundle, tx.spend_bundle.name()
|
|
1009
|
+
)
|
|
1010
|
+
|
|
1011
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
1012
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
1013
|
+
|
|
1014
|
+
coins_maker = await nft_wallet_maker.get_current_nfts()
|
|
1015
|
+
assert len(coins_maker) == 1
|
|
1016
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|
|
1017
|
+
# Create two new CATs and wallets for maker and taker
|
|
1018
|
+
cats_to_mint = 10000
|
|
1019
|
+
async with wallet_maker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
|
|
1020
|
+
cat_wallet_maker = await CATWallet.create_new_cat_wallet(
|
|
1021
|
+
wallet_node_0.wallet_state_manager,
|
|
1022
|
+
wallet_maker,
|
|
1023
|
+
{"identifier": "genesis_by_id"},
|
|
1024
|
+
uint64(cats_to_mint),
|
|
1025
|
+
action_scope,
|
|
1026
|
+
)
|
|
1027
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
1028
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
1029
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
1030
|
+
|
|
1031
|
+
async with wallet_taker.wallet_state_manager.new_action_scope(tx_config, push=True) as action_scope:
|
|
1032
|
+
cat_wallet_taker = await CATWallet.create_new_cat_wallet(
|
|
1033
|
+
wallet_node_1.wallet_state_manager,
|
|
1034
|
+
wallet_taker,
|
|
1035
|
+
{"identifier": "genesis_by_id"},
|
|
1036
|
+
uint64(cats_to_mint),
|
|
1037
|
+
action_scope,
|
|
1038
|
+
)
|
|
1039
|
+
await time_out_assert(20, mempool_not_empty, True, full_node_api)
|
|
1040
|
+
|
|
1041
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(token_ph))
|
|
1042
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
1043
|
+
|
|
1044
|
+
await time_out_assert(20, cat_wallet_maker.get_confirmed_balance, cats_to_mint)
|
|
1045
|
+
await time_out_assert(20, cat_wallet_maker.get_unconfirmed_balance, cats_to_mint)
|
|
1046
|
+
await time_out_assert(20, cat_wallet_taker.get_confirmed_balance, cats_to_mint)
|
|
1047
|
+
await time_out_assert(20, cat_wallet_taker.get_unconfirmed_balance, cats_to_mint)
|
|
1048
|
+
|
|
1049
|
+
wallet_maker_for_taker_cat: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
|
|
1050
|
+
wallet_node_0.wallet_state_manager, wallet_maker, cat_wallet_taker.get_asset_id()
|
|
1051
|
+
)
|
|
1052
|
+
|
|
1053
|
+
wallet_taker_for_maker_cat: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
|
|
1054
|
+
wallet_node_1.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
|
|
1055
|
+
)
|
|
1056
|
+
|
|
1057
|
+
assert wallet_taker_for_maker_cat
|
|
1058
|
+
# MAKE FIRST TRADE: 1 NFT for 10 taker cats
|
|
1059
|
+
maker_balance_pre = await wallet_maker.get_confirmed_balance()
|
|
1060
|
+
taker_balance_pre = await wallet_taker.get_confirmed_balance()
|
|
1061
|
+
taker_cat_maker_balance_pre = await wallet_maker_for_taker_cat.get_confirmed_balance()
|
|
1062
|
+
taker_cat_taker_balance_pre = await cat_wallet_taker.get_confirmed_balance()
|
|
1063
|
+
|
|
1064
|
+
nft_to_offer = coins_maker[0]
|
|
1065
|
+
nft_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_offer.full_puzzle))
|
|
1066
|
+
nft_asset_id: bytes32 = create_asset_id(nft_info) # type: ignore
|
|
1067
|
+
driver_dict: dict[bytes32, Optional[PuzzleInfo]] = {nft_asset_id: nft_info}
|
|
1068
|
+
|
|
1069
|
+
maker_fee = uint64(10)
|
|
1070
|
+
maker_xch_offered = 1000
|
|
1071
|
+
taker_cat_offered = 2500
|
|
1072
|
+
wallet_maker_id = wallet_maker.id()
|
|
1073
|
+
offer_nft_for_cat = {
|
|
1074
|
+
wallet_maker_id: -maker_xch_offered,
|
|
1075
|
+
nft_asset_id: -1,
|
|
1076
|
+
wallet_maker_for_taker_cat.id(): taker_cat_offered,
|
|
1077
|
+
}
|
|
1078
|
+
maker_unused_index = (
|
|
1079
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
1080
|
+
).index
|
|
1081
|
+
taker_unused_index = (
|
|
1082
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
1083
|
+
).index
|
|
1084
|
+
|
|
1085
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
|
|
1086
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
1087
|
+
offer_nft_for_cat, action_scope, driver_dict, fee=maker_fee
|
|
1088
|
+
)
|
|
1089
|
+
assert success is True
|
|
1090
|
+
assert error is None
|
|
1091
|
+
assert trade_make is not None
|
|
1092
|
+
|
|
1093
|
+
[maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
|
|
1094
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
1095
|
+
)
|
|
1096
|
+
|
|
1097
|
+
taker_fee = uint64(1)
|
|
1098
|
+
|
|
1099
|
+
peer = wallet_node_1.get_full_node_peer()
|
|
1100
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
1101
|
+
tx_config, push=True, additional_signing_responses=signing_response
|
|
1102
|
+
) as action_scope:
|
|
1103
|
+
trade_take = await trade_manager_taker.respond_to_offer(
|
|
1104
|
+
maker_offer,
|
|
1105
|
+
peer,
|
|
1106
|
+
action_scope,
|
|
1107
|
+
fee=taker_fee,
|
|
1108
|
+
)
|
|
1109
|
+
|
|
1110
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
1111
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
1112
|
+
|
|
1113
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
|
|
1114
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
|
|
1115
|
+
|
|
1116
|
+
taker_cat_maker_balance_post = await wallet_maker_for_taker_cat.get_confirmed_balance()
|
|
1117
|
+
taker_cat_taker_balance_post = await cat_wallet_taker.get_confirmed_balance()
|
|
1118
|
+
assert taker_cat_maker_balance_post == taker_cat_maker_balance_pre + taker_cat_offered
|
|
1119
|
+
assert taker_cat_taker_balance_post == taker_cat_taker_balance_pre - taker_cat_offered
|
|
1120
|
+
maker_balance_post = await wallet_maker.get_confirmed_balance()
|
|
1121
|
+
taker_balance_post = await wallet_taker.get_confirmed_balance()
|
|
1122
|
+
assert maker_balance_post == maker_balance_pre - maker_fee - maker_xch_offered
|
|
1123
|
+
assert taker_balance_post == taker_balance_pre - taker_fee + maker_xch_offered
|
|
1124
|
+
coins_taker = await nft_wallet_taker.get_current_nfts()
|
|
1125
|
+
assert len(coins_taker) == 1
|
|
1126
|
+
|
|
1127
|
+
assert await nft_wallet_maker.get_nft_count() == 0
|
|
1128
|
+
if reuse_puzhash:
|
|
1129
|
+
# Check if unused index changed
|
|
1130
|
+
assert (
|
|
1131
|
+
maker_unused_index
|
|
1132
|
+
== (
|
|
1133
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
1134
|
+
).index
|
|
1135
|
+
)
|
|
1136
|
+
assert (
|
|
1137
|
+
taker_unused_index
|
|
1138
|
+
== (
|
|
1139
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
1140
|
+
).index
|
|
1141
|
+
)
|
|
1142
|
+
else:
|
|
1143
|
+
assert (
|
|
1144
|
+
maker_unused_index
|
|
1145
|
+
< (
|
|
1146
|
+
await wallet_maker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
1147
|
+
).index
|
|
1148
|
+
)
|
|
1149
|
+
assert (
|
|
1150
|
+
taker_unused_index
|
|
1151
|
+
< (
|
|
1152
|
+
await wallet_taker.wallet_state_manager.puzzle_store.get_current_derivation_record_for_wallet(uint32(1))
|
|
1153
|
+
).index
|
|
1154
|
+
)
|
|
1155
|
+
# Make an offer for taker NFT for multiple cats
|
|
1156
|
+
maker_cat_amount = 400
|
|
1157
|
+
taker_cat_amount = 500
|
|
1158
|
+
|
|
1159
|
+
nft_to_buy = coins_taker[0]
|
|
1160
|
+
nft_to_buy_info: Optional[PuzzleInfo] = match_puzzle(uncurry_puzzle(nft_to_buy.full_puzzle))
|
|
1161
|
+
nft_to_buy_asset_id: bytes32 = create_asset_id(nft_to_buy_info) # type: ignore
|
|
1162
|
+
|
|
1163
|
+
driver_dict_to_buy: dict[bytes32, Optional[PuzzleInfo]] = {
|
|
1164
|
+
nft_to_buy_asset_id: nft_to_buy_info,
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
maker_fee = uint64(10)
|
|
1168
|
+
offer_multi_cats_for_nft = {
|
|
1169
|
+
nft_to_buy_asset_id: 1,
|
|
1170
|
+
wallet_maker_for_taker_cat.id(): -taker_cat_amount,
|
|
1171
|
+
cat_wallet_maker.id(): -maker_cat_amount,
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
async with trade_manager_maker.wallet_state_manager.new_action_scope(tx_config, push=False) as action_scope:
|
|
1175
|
+
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
|
1176
|
+
offer_multi_cats_for_nft, action_scope, driver_dict_to_buy, fee=maker_fee
|
|
1177
|
+
)
|
|
1178
|
+
assert success is True
|
|
1179
|
+
assert error is None
|
|
1180
|
+
assert trade_make is not None
|
|
1181
|
+
|
|
1182
|
+
[maker_offer], signing_response = await wallet_node_0.wallet_state_manager.sign_offers(
|
|
1183
|
+
[Offer.from_bytes(trade_make.offer)]
|
|
1184
|
+
)
|
|
1185
|
+
|
|
1186
|
+
taker_fee = uint64(1)
|
|
1187
|
+
|
|
1188
|
+
async with trade_manager_taker.wallet_state_manager.new_action_scope(
|
|
1189
|
+
tx_config, push=True, additional_signing_responses=signing_response
|
|
1190
|
+
) as action_scope:
|
|
1191
|
+
trade_take = await trade_manager_taker.respond_to_offer(maker_offer, peer, action_scope, fee=taker_fee)
|
|
1192
|
+
|
|
1193
|
+
await full_node_api.process_transaction_records(records=action_scope.side_effects.transactions)
|
|
1194
|
+
# check balances: taker wallet down an NFT, up cats
|
|
1195
|
+
await full_node_api.wait_for_wallets_synced(wallet_nodes=[wallet_node_0, wallet_node_1], timeout=20)
|
|
1196
|
+
|
|
1197
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, trade_make)
|
|
1198
|
+
await time_out_assert(20, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, trade_take)
|
|
1199
|
+
|
|
1200
|
+
taker_cat_maker_balance_post_2 = await wallet_maker_for_taker_cat.get_confirmed_balance()
|
|
1201
|
+
taker_cat_taker_balance_post_2 = await cat_wallet_taker.get_confirmed_balance()
|
|
1202
|
+
assert taker_cat_maker_balance_post_2 == taker_cat_maker_balance_post - taker_cat_amount
|
|
1203
|
+
assert taker_cat_taker_balance_post_2 == taker_cat_taker_balance_post + taker_cat_amount
|
|
1204
|
+
maker_balance_post_2 = await wallet_maker.get_confirmed_balance()
|
|
1205
|
+
taker_balance_post_2 = await wallet_taker.get_confirmed_balance()
|
|
1206
|
+
assert maker_balance_post_2 == maker_balance_post - maker_fee
|
|
1207
|
+
assert taker_balance_post_2 == taker_balance_post - taker_fee
|
|
1208
|
+
assert await nft_wallet_maker.get_nft_count() == 1
|
|
1209
|
+
assert await nft_wallet_taker.get_nft_count() == 0
|