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,43 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
from chia.protocols.wallet_protocol import CoinState
|
|
7
|
+
from chia.types.blockchain_format.coin import Coin
|
|
8
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
9
|
+
from chia.util.ints import uint32, uint64
|
|
10
|
+
from chia.util.streamable import Streamable, streamable
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@streamable
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class CoinRecord(Streamable):
|
|
16
|
+
"""
|
|
17
|
+
These are values that correspond to a CoinName that are used
|
|
18
|
+
in keeping track of the unspent database.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
coin: Coin
|
|
22
|
+
confirmed_block_index: uint32
|
|
23
|
+
spent_block_index: uint32
|
|
24
|
+
coinbase: bool
|
|
25
|
+
timestamp: uint64 # Timestamp of the block at height confirmed_block_index
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def spent(self) -> bool:
|
|
29
|
+
return self.spent_block_index > 0
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def name(self) -> bytes32:
|
|
33
|
+
return self.coin.name()
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def coin_state(self) -> CoinState:
|
|
37
|
+
spent_h = None
|
|
38
|
+
if self.spent:
|
|
39
|
+
spent_h = self.spent_block_index
|
|
40
|
+
confirmed_height: Optional[uint32] = self.confirmed_block_index
|
|
41
|
+
if self.confirmed_block_index == 0 and self.timestamp == 0:
|
|
42
|
+
confirmed_height = None
|
|
43
|
+
return CoinState(self.coin, spent_h, confirmed_height)
|
chia/types/coin_spend.py
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Union
|
|
5
|
+
|
|
6
|
+
import chia_rs
|
|
7
|
+
|
|
8
|
+
from chia.consensus.condition_costs import ConditionCost
|
|
9
|
+
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
10
|
+
from chia.types.blockchain_format.coin import Coin
|
|
11
|
+
from chia.types.blockchain_format.program import Program
|
|
12
|
+
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
13
|
+
from chia.types.condition_opcodes import ConditionOpcode
|
|
14
|
+
from chia.types.condition_with_args import ConditionWithArgs
|
|
15
|
+
from chia.util.errors import Err, ValidationError
|
|
16
|
+
from chia.util.ints import uint64
|
|
17
|
+
from chia.util.streamable import Streamable, streamable
|
|
18
|
+
|
|
19
|
+
CoinSpend = chia_rs.CoinSpend
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def make_spend(
|
|
23
|
+
coin: Coin,
|
|
24
|
+
puzzle_reveal: Union[Program, SerializedProgram],
|
|
25
|
+
solution: Union[Program, SerializedProgram],
|
|
26
|
+
) -> CoinSpend:
|
|
27
|
+
pr: SerializedProgram
|
|
28
|
+
sol: SerializedProgram
|
|
29
|
+
if isinstance(puzzle_reveal, SerializedProgram):
|
|
30
|
+
pr = puzzle_reveal
|
|
31
|
+
elif isinstance(puzzle_reveal, Program):
|
|
32
|
+
pr = SerializedProgram.from_program(puzzle_reveal)
|
|
33
|
+
else:
|
|
34
|
+
raise ValueError("Only [SerializedProgram, Program] supported for puzzle reveal")
|
|
35
|
+
if isinstance(solution, SerializedProgram):
|
|
36
|
+
sol = solution
|
|
37
|
+
elif isinstance(solution, Program):
|
|
38
|
+
sol = SerializedProgram.from_program(solution)
|
|
39
|
+
else:
|
|
40
|
+
raise ValueError("Only [SerializedProgram, Program] supported for solution")
|
|
41
|
+
|
|
42
|
+
return CoinSpend(coin, pr, sol)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def compute_additions_with_cost(
|
|
46
|
+
cs: CoinSpend,
|
|
47
|
+
*,
|
|
48
|
+
max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM,
|
|
49
|
+
) -> tuple[list[Coin], int]:
|
|
50
|
+
"""
|
|
51
|
+
Run the puzzle in the specified CoinSpend and return the cost and list of
|
|
52
|
+
coins created by the puzzle, i.e. additions. If the cost (CLVM- and
|
|
53
|
+
condition cost) exceeds the specified max_cost, the function fails with a
|
|
54
|
+
ValidationError exception. Byte cost is not included since at this point the
|
|
55
|
+
puzzle and solution may have been decompressed, the true byte-cost can only be
|
|
56
|
+
measured at the block generator level.
|
|
57
|
+
"""
|
|
58
|
+
parent_id = cs.coin.name()
|
|
59
|
+
ret: list[Coin] = []
|
|
60
|
+
cost, r = cs.puzzle_reveal.run_with_cost(max_cost, cs.solution)
|
|
61
|
+
for cond in Program.to(r).as_iter():
|
|
62
|
+
if cost > max_cost:
|
|
63
|
+
raise ValidationError(Err.BLOCK_COST_EXCEEDS_MAX, "compute_additions() for CoinSpend")
|
|
64
|
+
atoms = cond.as_iter()
|
|
65
|
+
op = next(atoms).atom
|
|
66
|
+
if op in {
|
|
67
|
+
ConditionOpcode.AGG_SIG_PARENT,
|
|
68
|
+
ConditionOpcode.AGG_SIG_PUZZLE,
|
|
69
|
+
ConditionOpcode.AGG_SIG_AMOUNT,
|
|
70
|
+
ConditionOpcode.AGG_SIG_PUZZLE_AMOUNT,
|
|
71
|
+
ConditionOpcode.AGG_SIG_PARENT_AMOUNT,
|
|
72
|
+
ConditionOpcode.AGG_SIG_PARENT_PUZZLE,
|
|
73
|
+
ConditionOpcode.AGG_SIG_UNSAFE,
|
|
74
|
+
ConditionOpcode.AGG_SIG_ME,
|
|
75
|
+
}:
|
|
76
|
+
cost += ConditionCost.AGG_SIG.value
|
|
77
|
+
continue
|
|
78
|
+
if op != ConditionOpcode.CREATE_COIN.value:
|
|
79
|
+
continue
|
|
80
|
+
cost += ConditionCost.CREATE_COIN.value
|
|
81
|
+
puzzle_hash = next(atoms).as_atom()
|
|
82
|
+
amount = uint64(next(atoms).as_int())
|
|
83
|
+
ret.append(Coin(parent_id, puzzle_hash, uint64(amount)))
|
|
84
|
+
|
|
85
|
+
return ret, cost
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def compute_additions(cs: CoinSpend, *, max_cost: int = DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM) -> list[Coin]:
|
|
89
|
+
return compute_additions_with_cost(cs, max_cost=max_cost)[0]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@streamable
|
|
93
|
+
@dataclass(frozen=True)
|
|
94
|
+
class SpendInfo(Streamable):
|
|
95
|
+
puzzle: SerializedProgram
|
|
96
|
+
solution: SerializedProgram
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@dataclass(frozen=True)
|
|
100
|
+
class CoinSpendWithConditions:
|
|
101
|
+
coin_spend: CoinSpend
|
|
102
|
+
conditions: list[ConditionWithArgs]
|
|
103
|
+
|
|
104
|
+
@staticmethod
|
|
105
|
+
def from_json_dict(dict: dict[str, Any]) -> CoinSpendWithConditions:
|
|
106
|
+
return CoinSpendWithConditions(
|
|
107
|
+
CoinSpend.from_json_dict(dict["coin_spend"]),
|
|
108
|
+
[
|
|
109
|
+
ConditionWithArgs(
|
|
110
|
+
ConditionOpcode(bytes.fromhex(condition["opcode"][2:])),
|
|
111
|
+
[bytes.fromhex(var) for var in condition["vars"]],
|
|
112
|
+
)
|
|
113
|
+
for condition in dict["conditions"]
|
|
114
|
+
],
|
|
115
|
+
)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import enum
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# See chia/wallet/puzzles/condition_codes.clib
|
|
7
|
+
class ConditionOpcode(bytes, enum.Enum):
|
|
8
|
+
# AGG_SIG is ascii "1"
|
|
9
|
+
|
|
10
|
+
# the conditions below require bls12-381 signatures
|
|
11
|
+
|
|
12
|
+
AGG_SIG_PARENT = bytes([43])
|
|
13
|
+
AGG_SIG_PUZZLE = bytes([44])
|
|
14
|
+
AGG_SIG_AMOUNT = bytes([45])
|
|
15
|
+
AGG_SIG_PUZZLE_AMOUNT = bytes([46])
|
|
16
|
+
AGG_SIG_PARENT_AMOUNT = bytes([47])
|
|
17
|
+
AGG_SIG_PARENT_PUZZLE = bytes([48])
|
|
18
|
+
AGG_SIG_UNSAFE = bytes([49])
|
|
19
|
+
AGG_SIG_ME = bytes([50])
|
|
20
|
+
|
|
21
|
+
# the conditions below reserve coin amounts and have to be accounted for in output totals
|
|
22
|
+
|
|
23
|
+
CREATE_COIN = bytes([51])
|
|
24
|
+
RESERVE_FEE = bytes([52])
|
|
25
|
+
|
|
26
|
+
# the conditions below deal with announcements, for inter-coin communication
|
|
27
|
+
|
|
28
|
+
CREATE_COIN_ANNOUNCEMENT = bytes([60])
|
|
29
|
+
ASSERT_COIN_ANNOUNCEMENT = bytes([61])
|
|
30
|
+
CREATE_PUZZLE_ANNOUNCEMENT = bytes([62])
|
|
31
|
+
ASSERT_PUZZLE_ANNOUNCEMENT = bytes([63])
|
|
32
|
+
ASSERT_CONCURRENT_SPEND = bytes([64])
|
|
33
|
+
ASSERT_CONCURRENT_PUZZLE = bytes([65])
|
|
34
|
+
|
|
35
|
+
# new message conditions in softfork introduced in Chia 2.3
|
|
36
|
+
|
|
37
|
+
SEND_MESSAGE = bytes([66])
|
|
38
|
+
RECEIVE_MESSAGE = bytes([67])
|
|
39
|
+
|
|
40
|
+
# the conditions below let coins inquire about themselves
|
|
41
|
+
|
|
42
|
+
ASSERT_MY_COIN_ID = bytes([70])
|
|
43
|
+
ASSERT_MY_PARENT_ID = bytes([71])
|
|
44
|
+
ASSERT_MY_PUZZLEHASH = bytes([72])
|
|
45
|
+
ASSERT_MY_AMOUNT = bytes([73])
|
|
46
|
+
ASSERT_MY_BIRTH_SECONDS = bytes([74])
|
|
47
|
+
ASSERT_MY_BIRTH_HEIGHT = bytes([75])
|
|
48
|
+
ASSERT_EPHEMERAL = bytes([76])
|
|
49
|
+
|
|
50
|
+
# the conditions below ensure that we're "far enough" in the future
|
|
51
|
+
|
|
52
|
+
# wall-clock time
|
|
53
|
+
ASSERT_SECONDS_RELATIVE = bytes([80])
|
|
54
|
+
ASSERT_SECONDS_ABSOLUTE = bytes([81])
|
|
55
|
+
|
|
56
|
+
# block index
|
|
57
|
+
ASSERT_HEIGHT_RELATIVE = bytes([82])
|
|
58
|
+
ASSERT_HEIGHT_ABSOLUTE = bytes([83])
|
|
59
|
+
|
|
60
|
+
# wall-clock time
|
|
61
|
+
ASSERT_BEFORE_SECONDS_RELATIVE = bytes([84])
|
|
62
|
+
ASSERT_BEFORE_SECONDS_ABSOLUTE = bytes([85])
|
|
63
|
+
|
|
64
|
+
# block index
|
|
65
|
+
ASSERT_BEFORE_HEIGHT_RELATIVE = bytes([86])
|
|
66
|
+
ASSERT_BEFORE_HEIGHT_ABSOLUTE = bytes([87])
|
|
67
|
+
|
|
68
|
+
# to be activated with the 2.0 hard fork.
|
|
69
|
+
# the first parameter is always the cost of the condition
|
|
70
|
+
SOFTFORK = bytes([90])
|
|
71
|
+
|
|
72
|
+
# A condition that is always true and always ignore all arguments
|
|
73
|
+
REMARK = bytes([1])
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from chia.types.condition_opcodes import ConditionOpcode
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class ConditionWithArgs:
|
|
10
|
+
"""
|
|
11
|
+
This structure is used to store parsed CLVM conditions
|
|
12
|
+
Conditions in CLVM have either format of (opcode, var1) or (opcode, var1, var2)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
opcode: ConditionOpcode
|
|
16
|
+
vars: list[bytes]
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
from collections.abc import Awaitable
|
|
5
|
+
from typing import Callable, Optional
|
|
6
|
+
|
|
7
|
+
from chia_rs import fast_forward_singleton, get_conditions_from_spendbundle
|
|
8
|
+
|
|
9
|
+
from chia.consensus.condition_costs import ConditionCost
|
|
10
|
+
from chia.consensus.constants import ConsensusConstants
|
|
11
|
+
from chia.types.blockchain_format.coin import Coin
|
|
12
|
+
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
13
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
14
|
+
from chia.types.coin_spend import CoinSpend
|
|
15
|
+
from chia.types.internal_mempool_item import InternalMempoolItem
|
|
16
|
+
from chia.types.mempool_item import BundleCoinSpend
|
|
17
|
+
from chia.types.spend_bundle import SpendBundle
|
|
18
|
+
from chia.util.errors import Err
|
|
19
|
+
from chia.util.ints import uint32, uint64
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclasses.dataclass(frozen=True)
|
|
23
|
+
class EligibilityAndAdditions:
|
|
24
|
+
is_eligible_for_dedup: bool
|
|
25
|
+
spend_additions: list[Coin]
|
|
26
|
+
is_eligible_for_ff: bool
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def run_for_cost(
|
|
30
|
+
puzzle_reveal: SerializedProgram, solution: SerializedProgram, additions_count: int, max_cost: int
|
|
31
|
+
) -> uint64:
|
|
32
|
+
create_coins_cost = additions_count * ConditionCost.CREATE_COIN.value
|
|
33
|
+
clvm_cost, _ = puzzle_reveal.run_mempool_with_cost(max_cost, solution)
|
|
34
|
+
saved_cost = uint64(clvm_cost + create_coins_cost)
|
|
35
|
+
return saved_cost
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclasses.dataclass(frozen=True)
|
|
39
|
+
class DedupCoinSpend:
|
|
40
|
+
solution: SerializedProgram
|
|
41
|
+
cost: Optional[uint64]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclasses.dataclass(frozen=True)
|
|
45
|
+
class UnspentLineageInfo:
|
|
46
|
+
coin_id: bytes32
|
|
47
|
+
coin_amount: uint64
|
|
48
|
+
parent_id: bytes32
|
|
49
|
+
parent_amount: uint64
|
|
50
|
+
parent_parent_id: bytes32
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def set_next_singleton_version(
|
|
54
|
+
current_singleton: Coin, singleton_additions: list[Coin], fast_forward_spends: dict[bytes32, UnspentLineageInfo]
|
|
55
|
+
) -> None:
|
|
56
|
+
"""
|
|
57
|
+
Finds the next version of the singleton among its additions and updates the
|
|
58
|
+
fast forward spends, currently chained together, accordingly
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
current_singleton: the current iteration of the singleton
|
|
62
|
+
singleton_additions: the additions of the current singleton
|
|
63
|
+
fast_forward_spends: in-out parameter of the spends currently chained together
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
ValueError if none of the additions are considered to be the singleton's
|
|
67
|
+
next iteration
|
|
68
|
+
"""
|
|
69
|
+
singleton_child = next(
|
|
70
|
+
(addition for addition in singleton_additions if addition.puzzle_hash == current_singleton.puzzle_hash), None
|
|
71
|
+
)
|
|
72
|
+
if singleton_child is None:
|
|
73
|
+
raise ValueError("Could not find fast forward child singleton.")
|
|
74
|
+
# Keep track of this in order to chain the next ff
|
|
75
|
+
fast_forward_spends[current_singleton.puzzle_hash] = UnspentLineageInfo(
|
|
76
|
+
coin_id=singleton_child.name(),
|
|
77
|
+
coin_amount=singleton_child.amount,
|
|
78
|
+
parent_id=singleton_child.parent_coin_info,
|
|
79
|
+
parent_amount=current_singleton.amount,
|
|
80
|
+
parent_parent_id=current_singleton.parent_coin_info,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def perform_the_fast_forward(
|
|
85
|
+
unspent_lineage_info: UnspentLineageInfo,
|
|
86
|
+
spend_data: BundleCoinSpend,
|
|
87
|
+
fast_forward_spends: dict[bytes32, UnspentLineageInfo],
|
|
88
|
+
) -> tuple[CoinSpend, list[Coin]]:
|
|
89
|
+
"""
|
|
90
|
+
Performs a singleton fast forward, including the updating of all previous
|
|
91
|
+
additions to point to the most recent version, and updates the fast forward
|
|
92
|
+
spends, currently chained together, accordingly
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
unspent_lineage_info: the singleton's most recent lineage information
|
|
96
|
+
spend_data: the current spend's data
|
|
97
|
+
fast_forward_spends: in-out parameter of the spends currently chained together
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
CoinSpend: the new coin spend after performing the fast forward
|
|
101
|
+
list[Coin]: the updated additions that point to the new coin to spend
|
|
102
|
+
|
|
103
|
+
Raises:
|
|
104
|
+
ValueError if none of the additions are considered to be the singleton's
|
|
105
|
+
next iteration
|
|
106
|
+
"""
|
|
107
|
+
new_coin = Coin(
|
|
108
|
+
unspent_lineage_info.parent_id, spend_data.coin_spend.coin.puzzle_hash, unspent_lineage_info.coin_amount
|
|
109
|
+
)
|
|
110
|
+
new_parent = Coin(
|
|
111
|
+
unspent_lineage_info.parent_parent_id,
|
|
112
|
+
spend_data.coin_spend.coin.puzzle_hash,
|
|
113
|
+
unspent_lineage_info.parent_amount,
|
|
114
|
+
)
|
|
115
|
+
# These hold because puzzle hash is not expected to change
|
|
116
|
+
assert new_coin.name() == unspent_lineage_info.coin_id
|
|
117
|
+
assert new_parent.name() == unspent_lineage_info.parent_id
|
|
118
|
+
new_solution = SerializedProgram.from_bytes(
|
|
119
|
+
fast_forward_singleton(spend=spend_data.coin_spend, new_coin=new_coin, new_parent=new_parent)
|
|
120
|
+
)
|
|
121
|
+
singleton_child = None
|
|
122
|
+
patched_additions = []
|
|
123
|
+
for addition in spend_data.additions:
|
|
124
|
+
patched_addition = Coin(unspent_lineage_info.coin_id, addition.puzzle_hash, addition.amount)
|
|
125
|
+
patched_additions.append(patched_addition)
|
|
126
|
+
if addition.puzzle_hash == spend_data.coin_spend.coin.puzzle_hash:
|
|
127
|
+
# We found the next version of this singleton
|
|
128
|
+
singleton_child = patched_addition
|
|
129
|
+
if singleton_child is None:
|
|
130
|
+
raise ValueError("Could not find fast forward child singleton.")
|
|
131
|
+
new_coin_spend = CoinSpend(new_coin, spend_data.coin_spend.puzzle_reveal, new_solution)
|
|
132
|
+
# Keep track of this in order to chain the next ff
|
|
133
|
+
fast_forward_spends[spend_data.coin_spend.coin.puzzle_hash] = UnspentLineageInfo(
|
|
134
|
+
coin_id=singleton_child.name(),
|
|
135
|
+
coin_amount=singleton_child.amount,
|
|
136
|
+
parent_id=singleton_child.parent_coin_info,
|
|
137
|
+
parent_amount=unspent_lineage_info.coin_amount,
|
|
138
|
+
parent_parent_id=unspent_lineage_info.parent_id,
|
|
139
|
+
)
|
|
140
|
+
return new_coin_spend, patched_additions
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@dataclasses.dataclass(frozen=True)
|
|
144
|
+
class EligibleCoinSpends:
|
|
145
|
+
deduplication_spends: dict[bytes32, DedupCoinSpend] = dataclasses.field(default_factory=dict)
|
|
146
|
+
fast_forward_spends: dict[bytes32, UnspentLineageInfo] = dataclasses.field(default_factory=dict)
|
|
147
|
+
|
|
148
|
+
def get_deduplication_info(
|
|
149
|
+
self, *, bundle_coin_spends: dict[bytes32, BundleCoinSpend], max_cost: int
|
|
150
|
+
) -> tuple[list[CoinSpend], uint64, list[Coin]]:
|
|
151
|
+
"""
|
|
152
|
+
Checks all coin spends of a mempool item for deduplication eligibility and
|
|
153
|
+
provides the caller with the necessary information that allows it to perform
|
|
154
|
+
identical spend aggregation on that mempool item if possible
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
bundle_coin_spends: the mempool item's coin spends data
|
|
158
|
+
max_cost: the maximum limit when running for cost
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
list[CoinSpend]: list of unique coin spends in this mempool item
|
|
162
|
+
uint64: the cost we're saving by deduplicating eligible coins
|
|
163
|
+
list[Coin]: list of unique additions in this mempool item
|
|
164
|
+
|
|
165
|
+
Raises:
|
|
166
|
+
ValueError to skip the mempool item we're currently in, if it's
|
|
167
|
+
attempting to spend an eligible coin with a different solution than the
|
|
168
|
+
one we're already deduplicating on.
|
|
169
|
+
"""
|
|
170
|
+
cost_saving = 0
|
|
171
|
+
unique_coin_spends: list[CoinSpend] = []
|
|
172
|
+
unique_additions: list[Coin] = []
|
|
173
|
+
# Map of coin ID to deduplication information
|
|
174
|
+
new_dedup_spends: dict[bytes32, DedupCoinSpend] = {}
|
|
175
|
+
# See if this item has coin spends that are eligible for deduplication
|
|
176
|
+
for coin_id, spend_data in bundle_coin_spends.items():
|
|
177
|
+
if not spend_data.eligible_for_dedup:
|
|
178
|
+
unique_coin_spends.append(spend_data.coin_spend)
|
|
179
|
+
unique_additions.extend(spend_data.additions)
|
|
180
|
+
continue
|
|
181
|
+
# See if we processed an item with this coin before
|
|
182
|
+
dedup_coin_spend = self.deduplication_spends.get(coin_id)
|
|
183
|
+
if dedup_coin_spend is None:
|
|
184
|
+
# We didn't process an item with this coin before. If we end up including
|
|
185
|
+
# this item, add this pair to deduplication_spends
|
|
186
|
+
new_dedup_spends[coin_id] = DedupCoinSpend(spend_data.coin_spend.solution, None)
|
|
187
|
+
unique_coin_spends.append(spend_data.coin_spend)
|
|
188
|
+
unique_additions.extend(spend_data.additions)
|
|
189
|
+
continue
|
|
190
|
+
# See if the solution was identical
|
|
191
|
+
current_solution, duplicate_cost = dataclasses.astuple(dedup_coin_spend)
|
|
192
|
+
if current_solution != spend_data.coin_spend.solution:
|
|
193
|
+
# It wasn't, so let's skip this whole item because it's relying on
|
|
194
|
+
# spending this coin with a different solution and that would
|
|
195
|
+
# conflict with the coin spends that we're deduplicating already
|
|
196
|
+
# NOTE: We can miss an opportunity to deduplicate on other solutions
|
|
197
|
+
# even if they end up saving more cost, as we're going for the first
|
|
198
|
+
# solution we see from the relatively highest FPC item, to avoid
|
|
199
|
+
# severe performance and/or time-complexity impact
|
|
200
|
+
raise ValueError("Solution is different from what we're deduplicating on")
|
|
201
|
+
# Let's calculate the saved cost if we never did that before
|
|
202
|
+
if duplicate_cost is None:
|
|
203
|
+
# See first if this mempool item had this cost computed before
|
|
204
|
+
# This can happen if this item didn't get included in the previous block
|
|
205
|
+
spend_cost = spend_data.cost
|
|
206
|
+
if spend_cost is None:
|
|
207
|
+
spend_cost = run_for_cost(
|
|
208
|
+
puzzle_reveal=spend_data.coin_spend.puzzle_reveal,
|
|
209
|
+
solution=spend_data.coin_spend.solution,
|
|
210
|
+
additions_count=len(spend_data.additions),
|
|
211
|
+
max_cost=max_cost,
|
|
212
|
+
)
|
|
213
|
+
# Update this mempool item's coin spends map
|
|
214
|
+
bundle_coin_spends[coin_id] = BundleCoinSpend(
|
|
215
|
+
coin_spend=spend_data.coin_spend,
|
|
216
|
+
eligible_for_dedup=spend_data.eligible_for_dedup,
|
|
217
|
+
eligible_for_fast_forward=spend_data.eligible_for_fast_forward,
|
|
218
|
+
additions=spend_data.additions,
|
|
219
|
+
cost=spend_cost,
|
|
220
|
+
)
|
|
221
|
+
duplicate_cost = spend_cost
|
|
222
|
+
# If we end up including this item, update this entry's cost
|
|
223
|
+
new_dedup_spends[coin_id] = DedupCoinSpend(current_solution, duplicate_cost)
|
|
224
|
+
cost_saving += duplicate_cost
|
|
225
|
+
# Update the eligible coin spends data
|
|
226
|
+
self.deduplication_spends.update(new_dedup_spends)
|
|
227
|
+
return unique_coin_spends, uint64(cost_saving), unique_additions
|
|
228
|
+
|
|
229
|
+
async def process_fast_forward_spends(
|
|
230
|
+
self,
|
|
231
|
+
*,
|
|
232
|
+
mempool_item: InternalMempoolItem,
|
|
233
|
+
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
|
|
234
|
+
height: uint32,
|
|
235
|
+
constants: ConsensusConstants,
|
|
236
|
+
) -> None:
|
|
237
|
+
"""
|
|
238
|
+
Provides the caller with an in-place internal mempool item that has a
|
|
239
|
+
proper state of fast forwarded coin spends and additions starting from
|
|
240
|
+
the most recent unspent versions of the related singleton spends.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
mempool_item: in-out parameter for the internal mempool item to process
|
|
244
|
+
get_unspent_lineage_info_for_puzzle_hash: to lookup the most recent
|
|
245
|
+
version of the singleton from the coin store
|
|
246
|
+
constants: needed in order to refresh the mempool item if needed
|
|
247
|
+
height: needed in order to refresh the mempool item if needed
|
|
248
|
+
|
|
249
|
+
Raises:
|
|
250
|
+
If a fast forward cannot proceed, to prevent potential double spends
|
|
251
|
+
"""
|
|
252
|
+
new_coin_spends = []
|
|
253
|
+
ff_bundle_coin_spends = {}
|
|
254
|
+
replaced_coin_ids = []
|
|
255
|
+
for coin_id, spend_data in mempool_item.bundle_coin_spends.items():
|
|
256
|
+
if not spend_data.eligible_for_fast_forward:
|
|
257
|
+
# Nothing to do for this spend, moving on
|
|
258
|
+
new_coin_spends.append(spend_data.coin_spend)
|
|
259
|
+
continue
|
|
260
|
+
|
|
261
|
+
# NOTE: We need to support finding the most recent version of a singleton
|
|
262
|
+
# both in the DB and in the current state of the block we are
|
|
263
|
+
# building, in case we have already spent the singleton
|
|
264
|
+
|
|
265
|
+
# See if we added a fast forward spend with this puzzle hash before
|
|
266
|
+
unspent_lineage_info = self.fast_forward_spends.get(spend_data.coin_spend.coin.puzzle_hash)
|
|
267
|
+
if unspent_lineage_info is None:
|
|
268
|
+
# We didn't, so let's lookup the most recent version from the DB
|
|
269
|
+
unspent_lineage_info = await get_unspent_lineage_info_for_puzzle_hash(
|
|
270
|
+
spend_data.coin_spend.coin.puzzle_hash
|
|
271
|
+
)
|
|
272
|
+
if unspent_lineage_info is None:
|
|
273
|
+
raise ValueError("Cannot proceed with singleton spend fast forward.")
|
|
274
|
+
# See if we're the most recent version
|
|
275
|
+
if unspent_lineage_info.coin_id == coin_id:
|
|
276
|
+
# We are, so we don't need to fast forward, we just need to
|
|
277
|
+
# set the next version from our additions to chain ff spends
|
|
278
|
+
set_next_singleton_version(
|
|
279
|
+
current_singleton=spend_data.coin_spend.coin,
|
|
280
|
+
singleton_additions=spend_data.additions,
|
|
281
|
+
fast_forward_spends=self.fast_forward_spends,
|
|
282
|
+
)
|
|
283
|
+
# Nothing more to do for this spend, moving on
|
|
284
|
+
new_coin_spends.append(spend_data.coin_spend)
|
|
285
|
+
continue
|
|
286
|
+
# We're not the most recent version, so let's fast forward
|
|
287
|
+
new_coin_spend, patched_additions = perform_the_fast_forward(
|
|
288
|
+
unspent_lineage_info=unspent_lineage_info,
|
|
289
|
+
spend_data=spend_data,
|
|
290
|
+
fast_forward_spends=self.fast_forward_spends,
|
|
291
|
+
)
|
|
292
|
+
# Mark this coin for a coin spend data update
|
|
293
|
+
replaced_coin_ids.append(coin_id)
|
|
294
|
+
ff_bundle_coin_spends[new_coin_spend.coin.name()] = BundleCoinSpend(
|
|
295
|
+
coin_spend=new_coin_spend,
|
|
296
|
+
eligible_for_dedup=spend_data.eligible_for_dedup,
|
|
297
|
+
eligible_for_fast_forward=spend_data.eligible_for_fast_forward,
|
|
298
|
+
additions=patched_additions,
|
|
299
|
+
cost=spend_data.cost,
|
|
300
|
+
)
|
|
301
|
+
# Update the list of coins spends that will make the new fast
|
|
302
|
+
# forward spend bundle
|
|
303
|
+
new_coin_spends.append(new_coin_spend)
|
|
304
|
+
# We're done here, moving on
|
|
305
|
+
continue
|
|
306
|
+
# We've added a ff spend with this puzzle hash before, so build on that
|
|
307
|
+
# NOTE: As it's not possible to submit a transaction to the mempool that
|
|
308
|
+
# spends the output of another transaction already in the mempool,
|
|
309
|
+
# we don't need to check if we're the most recent version because
|
|
310
|
+
# at this point we cannot be, so we must fast forward
|
|
311
|
+
new_coin_spend, patched_additions = perform_the_fast_forward(
|
|
312
|
+
unspent_lineage_info=unspent_lineage_info,
|
|
313
|
+
spend_data=spend_data,
|
|
314
|
+
fast_forward_spends=self.fast_forward_spends,
|
|
315
|
+
)
|
|
316
|
+
# Mark this coin for a coin spend data update
|
|
317
|
+
replaced_coin_ids.append(coin_id)
|
|
318
|
+
ff_bundle_coin_spends[new_coin_spend.coin.name()] = BundleCoinSpend(
|
|
319
|
+
coin_spend=new_coin_spend,
|
|
320
|
+
eligible_for_dedup=spend_data.eligible_for_dedup,
|
|
321
|
+
eligible_for_fast_forward=spend_data.eligible_for_fast_forward,
|
|
322
|
+
additions=patched_additions,
|
|
323
|
+
cost=spend_data.cost,
|
|
324
|
+
)
|
|
325
|
+
# Update the list of coins spends that make the new fast forward bundle
|
|
326
|
+
new_coin_spends.append(new_coin_spend)
|
|
327
|
+
if len(ff_bundle_coin_spends) == 0:
|
|
328
|
+
# This item doesn't have any fast forward coins, nothing to do here
|
|
329
|
+
return
|
|
330
|
+
# Update the mempool item after validating the new spend bundle
|
|
331
|
+
new_sb = SpendBundle(
|
|
332
|
+
coin_spends=new_coin_spends, aggregated_signature=mempool_item.spend_bundle.aggregated_signature
|
|
333
|
+
)
|
|
334
|
+
# We need to run the new spend bundle to make sure it remains valid
|
|
335
|
+
assert mempool_item.conds is not None
|
|
336
|
+
try:
|
|
337
|
+
new_conditions = get_conditions_from_spendbundle(
|
|
338
|
+
new_sb,
|
|
339
|
+
mempool_item.conds.cost,
|
|
340
|
+
constants,
|
|
341
|
+
height,
|
|
342
|
+
)
|
|
343
|
+
# validate_clvm_and_signature raises a TypeError with an error code
|
|
344
|
+
except TypeError as e:
|
|
345
|
+
# Convert that to a ValidationError
|
|
346
|
+
if len(e.args) > 0:
|
|
347
|
+
error = Err(e.args[0])
|
|
348
|
+
raise ValueError(f"Mempool item became invalid after singleton fast forward with error {error}.")
|
|
349
|
+
else:
|
|
350
|
+
raise ValueError(
|
|
351
|
+
"Mempool item became invalid after singleton fast forward with an unspecified error."
|
|
352
|
+
) # pragma: no cover
|
|
353
|
+
|
|
354
|
+
# Update bundle_coin_spends using the collected data
|
|
355
|
+
for coin_id in replaced_coin_ids:
|
|
356
|
+
mempool_item.bundle_coin_spends.pop(coin_id, None)
|
|
357
|
+
mempool_item.bundle_coin_spends.update(ff_bundle_coin_spends)
|
|
358
|
+
# Update the mempool item with the new spend bundle related information
|
|
359
|
+
# NOTE: From this point on, in `create_bundle_from_mempool_items`, we rely
|
|
360
|
+
# on `bundle_coin_spends` and we don't use this updated spend bundle
|
|
361
|
+
# information, as we'll only need `aggregated_signature` which doesn't
|
|
362
|
+
# change. Still, it's good form to update the spend bundle with the
|
|
363
|
+
# new coin spends
|
|
364
|
+
mempool_item.spend_bundle = new_sb
|
|
365
|
+
mempool_item.conds = new_conditions
|
chia/types/fee_rate.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
import typing_extensions
|
|
7
|
+
|
|
8
|
+
from chia.types.clvm_cost import CLVMCost
|
|
9
|
+
from chia.types.mojos import Mojos
|
|
10
|
+
from chia.util.ints import uint64
|
|
11
|
+
from chia.util.streamable import Streamable, streamable
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@typing_extensions.final
|
|
15
|
+
@streamable
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class FeeRate(Streamable):
|
|
18
|
+
"""
|
|
19
|
+
Represents Fee Rate in mojos divided by CLVM Cost.
|
|
20
|
+
Performs XCH/mojo conversion.
|
|
21
|
+
Similar to 'Fee per cost'.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
mojos_per_clvm_cost: uint64
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def create(cls, mojos: Mojos, clvm_cost: CLVMCost) -> FeeRate:
|
|
28
|
+
return cls(uint64(math.ceil(mojos / clvm_cost)))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class FeeRateV2:
|
|
33
|
+
"""
|
|
34
|
+
Represents Fee Rate in mojos divided by CLVM Cost.
|
|
35
|
+
Similar to 'Fee per cost'.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
mojos_per_clvm_cost: float
|
chia/types/full_block.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
6
|
+
from chia.util.streamable import Streamable, streamable
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@streamable
|
|
10
|
+
@dataclass(frozen=True)
|
|
11
|
+
class BlockGenerator(Streamable):
|
|
12
|
+
program: SerializedProgram
|
|
13
|
+
generator_refs: list[bytes]
|