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
|
File without changes
|
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import collections
|
|
4
|
+
import logging
|
|
5
|
+
from collections.abc import Awaitable, Collection
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Callable, Optional, Union
|
|
8
|
+
|
|
9
|
+
from chia_rs import SpendBundleConditions, compute_merkle_set_root
|
|
10
|
+
from chiabip158 import PyBIP158
|
|
11
|
+
|
|
12
|
+
from chia.consensus.block_record import BlockRecord
|
|
13
|
+
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
14
|
+
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
15
|
+
from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
|
|
16
|
+
from chia.consensus.constants import ConsensusConstants
|
|
17
|
+
from chia.full_node.mempool_check_conditions import mempool_check_time_locks
|
|
18
|
+
from chia.types.blockchain_format.coin import Coin, hash_coin_ids
|
|
19
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
20
|
+
from chia.types.coin_record import CoinRecord
|
|
21
|
+
from chia.types.full_block import FullBlock
|
|
22
|
+
from chia.types.unfinished_block import UnfinishedBlock
|
|
23
|
+
from chia.util.errors import Err
|
|
24
|
+
from chia.util.hash import std_hash
|
|
25
|
+
from chia.util.ints import uint32, uint64
|
|
26
|
+
|
|
27
|
+
log = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
# peak-> o
|
|
30
|
+
# main |
|
|
31
|
+
# chain o o <- peak_height \ additions and removals
|
|
32
|
+
# | | peak_hash | from these blocks are
|
|
33
|
+
# o o / recorded
|
|
34
|
+
# \ /
|
|
35
|
+
# o <- fork_height
|
|
36
|
+
# | this block is shared by the main chain
|
|
37
|
+
# o and the fork
|
|
38
|
+
# :
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass(frozen=True)
|
|
42
|
+
class ForkAdd:
|
|
43
|
+
coin: Coin
|
|
44
|
+
confirmed_height: uint32
|
|
45
|
+
timestamp: uint64
|
|
46
|
+
hint: Optional[bytes]
|
|
47
|
+
is_coinbase: bool
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass(frozen=True)
|
|
51
|
+
class ForkRem:
|
|
52
|
+
puzzle_hash: bytes32
|
|
53
|
+
height: uint32
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class ForkInfo:
|
|
58
|
+
# defines the last block shared by the fork and the main chain. additions
|
|
59
|
+
# and removals are from the block following this height up to and including
|
|
60
|
+
# the peak_height
|
|
61
|
+
fork_height: int
|
|
62
|
+
# the ForkInfo object contain all additions and removals made by blocks
|
|
63
|
+
# starting at fork_height+1 up to and including peak_height.
|
|
64
|
+
# When validating the block at height 0, the peak_height is -1, that's why
|
|
65
|
+
# it needs to be signed
|
|
66
|
+
peak_height: int
|
|
67
|
+
# the header hash of the peak block of this fork
|
|
68
|
+
peak_hash: bytes32
|
|
69
|
+
# The additions include coinbase additions
|
|
70
|
+
additions_since_fork: dict[bytes32, ForkAdd] = field(default_factory=dict)
|
|
71
|
+
# coin-id, ForkRem
|
|
72
|
+
removals_since_fork: dict[bytes32, ForkRem] = field(default_factory=dict)
|
|
73
|
+
# the header hashes of the blocks, starting with the one-past fork_height
|
|
74
|
+
# i.e. the header hash of fork_height + 1 is stored in block_hashes[0]
|
|
75
|
+
# followed by fork_height + 2, and so on.
|
|
76
|
+
block_hashes: list[bytes32] = field(default_factory=list)
|
|
77
|
+
|
|
78
|
+
def reset(self, fork_height: int, header_hash: bytes32) -> None:
|
|
79
|
+
self.fork_height = fork_height
|
|
80
|
+
self.peak_height = fork_height
|
|
81
|
+
self.peak_hash = header_hash
|
|
82
|
+
self.additions_since_fork = {}
|
|
83
|
+
self.removals_since_fork = {}
|
|
84
|
+
self.block_hashes = []
|
|
85
|
+
|
|
86
|
+
def include_spends(self, conds: Optional[SpendBundleConditions], block: FullBlock, header_hash: bytes32) -> None:
|
|
87
|
+
height = block.height
|
|
88
|
+
|
|
89
|
+
assert self.peak_height == height - 1
|
|
90
|
+
|
|
91
|
+
assert len(self.block_hashes) == self.peak_height - self.fork_height
|
|
92
|
+
assert block.height == self.fork_height + 1 + len(self.block_hashes)
|
|
93
|
+
self.block_hashes.append(header_hash)
|
|
94
|
+
|
|
95
|
+
self.peak_height = int(block.height)
|
|
96
|
+
self.peak_hash = header_hash
|
|
97
|
+
|
|
98
|
+
if conds is not None:
|
|
99
|
+
assert block.foliage_transaction_block is not None
|
|
100
|
+
timestamp = block.foliage_transaction_block.timestamp
|
|
101
|
+
for spend in conds.spends:
|
|
102
|
+
self.removals_since_fork[bytes32(spend.coin_id)] = ForkRem(bytes32(spend.puzzle_hash), height)
|
|
103
|
+
for puzzle_hash, amount, hint in spend.create_coin:
|
|
104
|
+
coin = Coin(bytes32(spend.coin_id), bytes32(puzzle_hash), uint64(amount))
|
|
105
|
+
self.additions_since_fork[coin.name()] = ForkAdd(coin, height, timestamp, hint, False)
|
|
106
|
+
for coin in block.get_included_reward_coins():
|
|
107
|
+
assert block.foliage_transaction_block is not None
|
|
108
|
+
timestamp = block.foliage_transaction_block.timestamp
|
|
109
|
+
assert coin.name() not in self.additions_since_fork
|
|
110
|
+
self.additions_since_fork[coin.name()] = ForkAdd(coin, block.height, timestamp, None, True)
|
|
111
|
+
|
|
112
|
+
def include_block(
|
|
113
|
+
self,
|
|
114
|
+
additions: list[tuple[Coin, Optional[bytes]]],
|
|
115
|
+
removals: list[Coin],
|
|
116
|
+
block: FullBlock,
|
|
117
|
+
header_hash: bytes32,
|
|
118
|
+
) -> None:
|
|
119
|
+
height = block.height
|
|
120
|
+
|
|
121
|
+
assert self.peak_height == height - 1
|
|
122
|
+
|
|
123
|
+
assert len(self.block_hashes) == self.peak_height - self.fork_height
|
|
124
|
+
assert block.height == self.fork_height + 1 + len(self.block_hashes)
|
|
125
|
+
self.block_hashes.append(header_hash)
|
|
126
|
+
|
|
127
|
+
self.peak_height = int(block.height)
|
|
128
|
+
self.peak_hash = header_hash
|
|
129
|
+
|
|
130
|
+
if block.foliage_transaction_block is not None:
|
|
131
|
+
timestamp = block.foliage_transaction_block.timestamp
|
|
132
|
+
for spend in removals:
|
|
133
|
+
self.removals_since_fork[bytes32(spend.name())] = ForkRem(bytes32(spend.puzzle_hash), height)
|
|
134
|
+
for coin, hint in additions:
|
|
135
|
+
self.additions_since_fork[coin.name()] = ForkAdd(coin, height, timestamp, hint, False)
|
|
136
|
+
for coin in block.get_included_reward_coins():
|
|
137
|
+
assert block.foliage_transaction_block is not None
|
|
138
|
+
timestamp = block.foliage_transaction_block.timestamp
|
|
139
|
+
assert coin.name() not in self.additions_since_fork
|
|
140
|
+
self.additions_since_fork[coin.name()] = ForkAdd(coin, block.height, timestamp, None, True)
|
|
141
|
+
|
|
142
|
+
def rollback(self, header_hash: bytes32, height: int) -> None:
|
|
143
|
+
assert height <= self.peak_height
|
|
144
|
+
self.peak_height = height
|
|
145
|
+
self.peak_hash = header_hash
|
|
146
|
+
self.additions_since_fork = {k: v for k, v in self.additions_since_fork.items() if v.confirmed_height <= height}
|
|
147
|
+
self.removals_since_fork = {k: v for k, v in self.removals_since_fork.items() if v.height <= height}
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def validate_block_merkle_roots(
|
|
151
|
+
block_additions_root: bytes32,
|
|
152
|
+
block_removals_root: bytes32,
|
|
153
|
+
tx_additions: list[tuple[Coin, bytes32]],
|
|
154
|
+
tx_removals: list[bytes32],
|
|
155
|
+
) -> Optional[Err]:
|
|
156
|
+
# Create addition Merkle set
|
|
157
|
+
puzzlehash_coins_map: dict[bytes32, list[bytes32]] = {}
|
|
158
|
+
|
|
159
|
+
for coin, coin_name in tx_additions:
|
|
160
|
+
if coin.puzzle_hash in puzzlehash_coins_map:
|
|
161
|
+
puzzlehash_coins_map[coin.puzzle_hash].append(coin_name)
|
|
162
|
+
else:
|
|
163
|
+
puzzlehash_coins_map[coin.puzzle_hash] = [coin_name]
|
|
164
|
+
|
|
165
|
+
# Addition Merkle set contains puzzlehash and hash of all coins with that puzzlehash
|
|
166
|
+
additions_merkle_items: list[bytes32] = []
|
|
167
|
+
for puzzle, coin_ids in puzzlehash_coins_map.items():
|
|
168
|
+
additions_merkle_items.append(puzzle)
|
|
169
|
+
additions_merkle_items.append(hash_coin_ids(coin_ids))
|
|
170
|
+
|
|
171
|
+
additions_root = bytes32(compute_merkle_set_root(additions_merkle_items))
|
|
172
|
+
removals_root = bytes32(compute_merkle_set_root(tx_removals))
|
|
173
|
+
|
|
174
|
+
if block_additions_root != additions_root:
|
|
175
|
+
return Err.BAD_ADDITION_ROOT
|
|
176
|
+
if block_removals_root != removals_root:
|
|
177
|
+
return Err.BAD_REMOVAL_ROOT
|
|
178
|
+
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
async def validate_block_body(
|
|
183
|
+
constants: ConsensusConstants,
|
|
184
|
+
records: BlockRecordsProtocol,
|
|
185
|
+
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
|
|
186
|
+
block: Union[FullBlock, UnfinishedBlock],
|
|
187
|
+
height: uint32,
|
|
188
|
+
conds: Optional[SpendBundleConditions],
|
|
189
|
+
fork_info: ForkInfo,
|
|
190
|
+
*,
|
|
191
|
+
log_coins: bool = False,
|
|
192
|
+
) -> Optional[Err]:
|
|
193
|
+
"""
|
|
194
|
+
This assumes the header block has been completely validated.
|
|
195
|
+
Validates the transactions and body of the block.
|
|
196
|
+
Returns None if everything validates correctly, or an Err if something does
|
|
197
|
+
not validate.
|
|
198
|
+
conds is the result of running the generator with the previous generators
|
|
199
|
+
refs. It must be set for transaction blocks and must be None for
|
|
200
|
+
non-transaction blocks.
|
|
201
|
+
fork_info specifies the fork context of this block. In case the block
|
|
202
|
+
extends the main chain, it can be empty, but if the block extends a fork
|
|
203
|
+
of the main chain, the fork info is mandatory in order to validate the block.
|
|
204
|
+
"""
|
|
205
|
+
if isinstance(block, FullBlock):
|
|
206
|
+
assert height == block.height
|
|
207
|
+
prev_transaction_block_height: uint32 = uint32(0)
|
|
208
|
+
prev_transaction_block_timestamp: uint64 = uint64(0)
|
|
209
|
+
|
|
210
|
+
# 1. For non transaction-blocs: foliage block, transaction filter, transactions info, and generator must
|
|
211
|
+
# be empty. If it is a block but not a transaction block, there is no body to validate. Check that all fields are
|
|
212
|
+
# None
|
|
213
|
+
if block.foliage.foliage_transaction_block_hash is None:
|
|
214
|
+
if (
|
|
215
|
+
block.foliage_transaction_block is not None
|
|
216
|
+
or block.transactions_info is not None
|
|
217
|
+
or block.transactions_generator is not None
|
|
218
|
+
):
|
|
219
|
+
return Err.NOT_BLOCK_BUT_HAS_DATA
|
|
220
|
+
|
|
221
|
+
prev_tb: Optional[BlockRecord] = records.block_record(block.prev_header_hash)
|
|
222
|
+
assert prev_tb is not None
|
|
223
|
+
while not prev_tb.is_transaction_block:
|
|
224
|
+
prev_tb = records.block_record(prev_tb.prev_hash)
|
|
225
|
+
assert prev_tb is not None
|
|
226
|
+
assert prev_tb.timestamp is not None
|
|
227
|
+
if len(block.transactions_generator_ref_list) > 0:
|
|
228
|
+
return Err.NOT_BLOCK_BUT_HAS_DATA
|
|
229
|
+
|
|
230
|
+
assert fork_info.peak_height == height - 1
|
|
231
|
+
|
|
232
|
+
assert conds is None
|
|
233
|
+
# This means the block is valid
|
|
234
|
+
return None
|
|
235
|
+
|
|
236
|
+
# All checks below this point correspond to transaction blocks
|
|
237
|
+
# 2. For blocks, foliage block, transactions info must not be empty
|
|
238
|
+
if block.foliage_transaction_block is None or block.transactions_info is None:
|
|
239
|
+
return Err.IS_TRANSACTION_BLOCK_BUT_NO_DATA
|
|
240
|
+
assert block.foliage_transaction_block is not None
|
|
241
|
+
|
|
242
|
+
# keeps track of the reward coins that need to be incorporated
|
|
243
|
+
expected_reward_coins: set[Coin] = set()
|
|
244
|
+
|
|
245
|
+
# 3. The transaction info hash in the Foliage block must match the transaction info
|
|
246
|
+
if block.foliage_transaction_block.transactions_info_hash != std_hash(block.transactions_info):
|
|
247
|
+
return Err.INVALID_TRANSACTIONS_INFO_HASH
|
|
248
|
+
|
|
249
|
+
# 4. The foliage block hash in the foliage block must match the foliage block
|
|
250
|
+
if block.foliage.foliage_transaction_block_hash != std_hash(block.foliage_transaction_block):
|
|
251
|
+
return Err.INVALID_FOLIAGE_BLOCK_HASH
|
|
252
|
+
|
|
253
|
+
# 5. The reward claims must be valid for the previous blocks, and current block fees
|
|
254
|
+
# If height == 0, expected_reward_coins will be left empty
|
|
255
|
+
if height > 0:
|
|
256
|
+
# Add reward claims for all blocks from the prev prev block, until the prev block (including the latter)
|
|
257
|
+
prev_transaction_block = records.block_record(block.foliage_transaction_block.prev_transaction_block_hash)
|
|
258
|
+
assert prev_transaction_block is not None
|
|
259
|
+
prev_transaction_block_height = prev_transaction_block.height
|
|
260
|
+
assert prev_transaction_block.timestamp
|
|
261
|
+
prev_transaction_block_timestamp = prev_transaction_block.timestamp
|
|
262
|
+
assert prev_transaction_block.fees is not None
|
|
263
|
+
pool_coin = create_pool_coin(
|
|
264
|
+
prev_transaction_block_height,
|
|
265
|
+
prev_transaction_block.pool_puzzle_hash,
|
|
266
|
+
calculate_pool_reward(prev_transaction_block.height),
|
|
267
|
+
constants.GENESIS_CHALLENGE,
|
|
268
|
+
)
|
|
269
|
+
farmer_coin = create_farmer_coin(
|
|
270
|
+
prev_transaction_block_height,
|
|
271
|
+
prev_transaction_block.farmer_puzzle_hash,
|
|
272
|
+
uint64(calculate_base_farmer_reward(prev_transaction_block.height) + prev_transaction_block.fees),
|
|
273
|
+
constants.GENESIS_CHALLENGE,
|
|
274
|
+
)
|
|
275
|
+
# Adds the previous block
|
|
276
|
+
expected_reward_coins.add(pool_coin)
|
|
277
|
+
expected_reward_coins.add(farmer_coin)
|
|
278
|
+
|
|
279
|
+
# For the second block in the chain, don't go back further
|
|
280
|
+
if prev_transaction_block.height > 0:
|
|
281
|
+
curr_b = records.block_record(prev_transaction_block.prev_hash)
|
|
282
|
+
assert curr_b is not None
|
|
283
|
+
while not curr_b.is_transaction_block:
|
|
284
|
+
expected_reward_coins.add(
|
|
285
|
+
create_pool_coin(
|
|
286
|
+
curr_b.height,
|
|
287
|
+
curr_b.pool_puzzle_hash,
|
|
288
|
+
calculate_pool_reward(curr_b.height),
|
|
289
|
+
constants.GENESIS_CHALLENGE,
|
|
290
|
+
)
|
|
291
|
+
)
|
|
292
|
+
expected_reward_coins.add(
|
|
293
|
+
create_farmer_coin(
|
|
294
|
+
curr_b.height,
|
|
295
|
+
curr_b.farmer_puzzle_hash,
|
|
296
|
+
calculate_base_farmer_reward(curr_b.height),
|
|
297
|
+
constants.GENESIS_CHALLENGE,
|
|
298
|
+
)
|
|
299
|
+
)
|
|
300
|
+
curr_b = records.block_record(curr_b.prev_hash)
|
|
301
|
+
assert curr_b is not None
|
|
302
|
+
|
|
303
|
+
if set(block.transactions_info.reward_claims_incorporated) != expected_reward_coins:
|
|
304
|
+
return Err.INVALID_REWARD_COINS
|
|
305
|
+
|
|
306
|
+
if len(block.transactions_info.reward_claims_incorporated) != len(expected_reward_coins):
|
|
307
|
+
return Err.INVALID_REWARD_COINS
|
|
308
|
+
|
|
309
|
+
removals: list[bytes32] = []
|
|
310
|
+
|
|
311
|
+
# we store coins paired with their names in order to avoid computing the
|
|
312
|
+
# coin name multiple times, we store it next to the coin while validating
|
|
313
|
+
# the block
|
|
314
|
+
coinbase_additions: list[tuple[Coin, bytes32]] = [(c, c.name()) for c in expected_reward_coins]
|
|
315
|
+
additions: list[tuple[Coin, bytes32]] = []
|
|
316
|
+
removals_puzzle_dic: dict[bytes32, bytes32] = {}
|
|
317
|
+
cost: uint64 = uint64(0)
|
|
318
|
+
|
|
319
|
+
# In header validation we check that timestamp is not more than 5 minutes into the future
|
|
320
|
+
# 6. No transactions before INITIAL_TRANSACTION_FREEZE timestamp
|
|
321
|
+
# (this test has been removed)
|
|
322
|
+
|
|
323
|
+
# 7a. The generator root must be the hash of the serialized bytes of
|
|
324
|
+
# the generator for this block (or zeroes if no generator)
|
|
325
|
+
if block.transactions_generator is not None:
|
|
326
|
+
if std_hash(bytes(block.transactions_generator)) != block.transactions_info.generator_root:
|
|
327
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_HASH
|
|
328
|
+
else:
|
|
329
|
+
if block.transactions_info.generator_root != bytes([0] * 32):
|
|
330
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_HASH
|
|
331
|
+
|
|
332
|
+
# 8a. The generator_ref_list must be the hash of the serialized bytes of
|
|
333
|
+
# the generator ref list for this block (or 'one' bytes [0x01] if no generator)
|
|
334
|
+
# 8b. The generator ref list length must be less than or equal to MAX_GENERATOR_REF_LIST_SIZE entries
|
|
335
|
+
# 8c. The generator ref list must not point to a height >= this block's height
|
|
336
|
+
if block.transactions_generator_ref_list in (None, []):
|
|
337
|
+
if block.transactions_info.generator_refs_root != bytes([1] * 32):
|
|
338
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
339
|
+
else:
|
|
340
|
+
# If we have a generator reference list, we must have a generator
|
|
341
|
+
if block.transactions_generator is None:
|
|
342
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
343
|
+
|
|
344
|
+
# The generator_refs_root must be the hash of the concatenation of the list[uint32]
|
|
345
|
+
generator_refs_hash = std_hash(b"".join([i.stream_to_bytes() for i in block.transactions_generator_ref_list]))
|
|
346
|
+
if block.transactions_info.generator_refs_root != generator_refs_hash:
|
|
347
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
348
|
+
if len(block.transactions_generator_ref_list) > constants.MAX_GENERATOR_REF_LIST_SIZE:
|
|
349
|
+
return Err.TOO_MANY_GENERATOR_REFS
|
|
350
|
+
if any([index >= height for index in block.transactions_generator_ref_list]):
|
|
351
|
+
return Err.FUTURE_GENERATOR_REFS
|
|
352
|
+
|
|
353
|
+
if block.transactions_generator is not None:
|
|
354
|
+
# Get List of names removed, puzzles hashes for removed coins and conditions created
|
|
355
|
+
|
|
356
|
+
cost = uint64(0 if conds is None else conds.cost)
|
|
357
|
+
|
|
358
|
+
# 7. Check that cost <= MAX_BLOCK_COST_CLVM
|
|
359
|
+
log.debug(
|
|
360
|
+
f"Cost: {cost} max: {constants.MAX_BLOCK_COST_CLVM} "
|
|
361
|
+
f"percent full: {round(100 * (cost / constants.MAX_BLOCK_COST_CLVM), 2)}%"
|
|
362
|
+
)
|
|
363
|
+
if cost > constants.MAX_BLOCK_COST_CLVM:
|
|
364
|
+
return Err.BLOCK_COST_EXCEEDS_MAX
|
|
365
|
+
|
|
366
|
+
# 8. The CLVM program must not return any errors
|
|
367
|
+
assert conds is not None
|
|
368
|
+
assert conds.validated_signature
|
|
369
|
+
|
|
370
|
+
for spend in conds.spends:
|
|
371
|
+
removals.append(bytes32(spend.coin_id))
|
|
372
|
+
removals_puzzle_dic[bytes32(spend.coin_id)] = bytes32(spend.puzzle_hash)
|
|
373
|
+
for puzzle_hash, amount, _ in spend.create_coin:
|
|
374
|
+
c = Coin(bytes32(spend.coin_id), bytes32(puzzle_hash), uint64(amount))
|
|
375
|
+
additions.append((c, c.name()))
|
|
376
|
+
else:
|
|
377
|
+
assert conds is None
|
|
378
|
+
|
|
379
|
+
# 9. Check that the correct cost is in the transactions info
|
|
380
|
+
if block.transactions_info.cost != cost:
|
|
381
|
+
return Err.INVALID_BLOCK_COST
|
|
382
|
+
|
|
383
|
+
additions_dic: dict[bytes32, Coin] = {}
|
|
384
|
+
# 10. Check additions for max coin amount
|
|
385
|
+
# Be careful to check for 64 bit overflows in other languages. This is the max 64 bit unsigned integer
|
|
386
|
+
# We will not even reach here because Coins do type checking (uint64)
|
|
387
|
+
for coin, coin_name in additions + coinbase_additions:
|
|
388
|
+
additions_dic[coin_name] = coin
|
|
389
|
+
if coin.amount < 0:
|
|
390
|
+
return Err.COIN_AMOUNT_NEGATIVE
|
|
391
|
+
|
|
392
|
+
if coin.amount > constants.MAX_COIN_AMOUNT:
|
|
393
|
+
return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM
|
|
394
|
+
|
|
395
|
+
# 11. Validate addition and removal roots
|
|
396
|
+
root_error = validate_block_merkle_roots(
|
|
397
|
+
block.foliage_transaction_block.additions_root,
|
|
398
|
+
block.foliage_transaction_block.removals_root,
|
|
399
|
+
additions + coinbase_additions,
|
|
400
|
+
removals,
|
|
401
|
+
)
|
|
402
|
+
if root_error is not None:
|
|
403
|
+
return root_error
|
|
404
|
+
|
|
405
|
+
# 12. The additions and removals must result in the correct filter
|
|
406
|
+
byte_array_tx: list[bytearray] = []
|
|
407
|
+
|
|
408
|
+
for coin, _ in additions + coinbase_additions:
|
|
409
|
+
byte_array_tx.append(bytearray(coin.puzzle_hash))
|
|
410
|
+
for coin_name in removals:
|
|
411
|
+
byte_array_tx.append(bytearray(coin_name))
|
|
412
|
+
|
|
413
|
+
bip158: PyBIP158 = PyBIP158(byte_array_tx)
|
|
414
|
+
encoded_filter = bytes(bip158.GetEncoded())
|
|
415
|
+
filter_hash = std_hash(encoded_filter)
|
|
416
|
+
|
|
417
|
+
if filter_hash != block.foliage_transaction_block.filter_hash:
|
|
418
|
+
return Err.INVALID_TRANSACTIONS_FILTER_HASH
|
|
419
|
+
|
|
420
|
+
# 13. Check for duplicate outputs in additions
|
|
421
|
+
addition_counter = collections.Counter(coin_name for _, coin_name in additions + coinbase_additions)
|
|
422
|
+
for count in addition_counter.values():
|
|
423
|
+
if count > 1:
|
|
424
|
+
return Err.DUPLICATE_OUTPUT
|
|
425
|
+
|
|
426
|
+
# 14. Check for duplicate spends inside block
|
|
427
|
+
removal_counter = collections.Counter(removals)
|
|
428
|
+
for count in removal_counter.values():
|
|
429
|
+
if count > 1:
|
|
430
|
+
return Err.DOUBLE_SPEND
|
|
431
|
+
|
|
432
|
+
# 15. Check if removals exist and were not previously spent. (unspent_db + diff_store + this_block)
|
|
433
|
+
# The fork point is the last block in common between the peak chain and the chain of `block`
|
|
434
|
+
|
|
435
|
+
assert fork_info.fork_height < height
|
|
436
|
+
assert fork_info.peak_height == height - 1
|
|
437
|
+
|
|
438
|
+
removal_coin_records: dict[bytes32, CoinRecord] = {}
|
|
439
|
+
# the removed coins we need to look up from the DB
|
|
440
|
+
# i.e. all non-ephemeral coins
|
|
441
|
+
removals_from_db: list[bytes32] = []
|
|
442
|
+
for rem in removals:
|
|
443
|
+
if rem in additions_dic:
|
|
444
|
+
# Ephemeral coin
|
|
445
|
+
rem_coin: Coin = additions_dic[rem]
|
|
446
|
+
new_unspent: CoinRecord = CoinRecord(
|
|
447
|
+
rem_coin,
|
|
448
|
+
height,
|
|
449
|
+
height,
|
|
450
|
+
False,
|
|
451
|
+
block.foliage_transaction_block.timestamp,
|
|
452
|
+
)
|
|
453
|
+
removal_coin_records[new_unspent.name] = new_unspent
|
|
454
|
+
else:
|
|
455
|
+
# This check applies to both coins created before fork (pulled from coin_store),
|
|
456
|
+
# and coins created after fork (additions_since_fork)
|
|
457
|
+
if rem in fork_info.removals_since_fork:
|
|
458
|
+
# This coin was spent in the fork
|
|
459
|
+
log.error(f"Err.DOUBLE_SPEND_IN_FORK {fork_info.removals_since_fork[rem]}")
|
|
460
|
+
return Err.DOUBLE_SPEND_IN_FORK
|
|
461
|
+
removals_from_db.append(rem)
|
|
462
|
+
|
|
463
|
+
unspent_records = await get_coin_records(removals_from_db)
|
|
464
|
+
|
|
465
|
+
# some coin spends we need to ensure exist in the fork branch. Both coins we
|
|
466
|
+
# can't find in the DB, but also coins that were spent after the fork point
|
|
467
|
+
look_in_fork: list[bytes32] = []
|
|
468
|
+
for unspent in unspent_records:
|
|
469
|
+
if unspent.confirmed_block_index <= fork_info.fork_height:
|
|
470
|
+
# Spending something in the current chain, confirmed before fork
|
|
471
|
+
# (We ignore all coins confirmed after fork)
|
|
472
|
+
if unspent.spent == 1 and unspent.spent_block_index <= fork_info.fork_height:
|
|
473
|
+
# Check for coins spent in an ancestor block
|
|
474
|
+
return Err.DOUBLE_SPEND
|
|
475
|
+
removal_coin_records[unspent.name] = unspent
|
|
476
|
+
else:
|
|
477
|
+
look_in_fork.append(unspent.name)
|
|
478
|
+
|
|
479
|
+
if log_coins and len(look_in_fork) > 0:
|
|
480
|
+
log.info("%d coins spent after fork", len(look_in_fork))
|
|
481
|
+
|
|
482
|
+
if len(unspent_records) != len(removals_from_db):
|
|
483
|
+
# some coins could not be found in the DB. We need to find out which
|
|
484
|
+
# ones and look for them in additions_since_fork
|
|
485
|
+
found: set[bytes32] = {u.name for u in unspent_records}
|
|
486
|
+
for rem in removals_from_db:
|
|
487
|
+
if rem in found:
|
|
488
|
+
continue
|
|
489
|
+
look_in_fork.append(rem)
|
|
490
|
+
|
|
491
|
+
if log_coins and len(look_in_fork) > 0:
|
|
492
|
+
log.info("coins spent in fork: %s", ",".join([f"{name}"[0:6] for name in look_in_fork]))
|
|
493
|
+
|
|
494
|
+
for rem in look_in_fork:
|
|
495
|
+
# This coin is not in the current heaviest chain, so it must be in the fork
|
|
496
|
+
if rem not in fork_info.additions_since_fork:
|
|
497
|
+
# Check for spending a coin that does not exist in this fork
|
|
498
|
+
log.error(f"Err.UNKNOWN_UNSPENT: COIN ID: {rem} fork_info: {fork_info}")
|
|
499
|
+
return Err.UNKNOWN_UNSPENT
|
|
500
|
+
addition: ForkAdd = fork_info.additions_since_fork[rem]
|
|
501
|
+
new_coin_record: CoinRecord = CoinRecord(
|
|
502
|
+
addition.coin,
|
|
503
|
+
addition.confirmed_height,
|
|
504
|
+
uint32(0),
|
|
505
|
+
False,
|
|
506
|
+
addition.timestamp,
|
|
507
|
+
)
|
|
508
|
+
removal_coin_records[new_coin_record.name] = new_coin_record
|
|
509
|
+
|
|
510
|
+
removed = 0
|
|
511
|
+
for unspent in removal_coin_records.values():
|
|
512
|
+
removed += unspent.coin.amount
|
|
513
|
+
|
|
514
|
+
added = 0
|
|
515
|
+
for coin, _ in additions:
|
|
516
|
+
added += coin.amount
|
|
517
|
+
|
|
518
|
+
# 16. Check that the total coin amount for added is <= removed
|
|
519
|
+
if removed < added:
|
|
520
|
+
return Err.MINTING_COIN
|
|
521
|
+
|
|
522
|
+
fees = removed - added
|
|
523
|
+
assert fees >= 0
|
|
524
|
+
|
|
525
|
+
# reserve fee cannot be greater than UINT64_MAX per consensus rule.
|
|
526
|
+
# run_generator() would fail
|
|
527
|
+
assert_fee_sum = uint64(0 if conds is None else conds.reserve_fee)
|
|
528
|
+
|
|
529
|
+
# 17. Check that the assert fee sum <= fees, and that each reserved fee is non-negative
|
|
530
|
+
if fees < assert_fee_sum:
|
|
531
|
+
return Err.RESERVE_FEE_CONDITION_FAILED
|
|
532
|
+
|
|
533
|
+
# 18. Check that the fee amount + farmer reward < maximum coin amount
|
|
534
|
+
if fees + calculate_base_farmer_reward(height) > constants.MAX_COIN_AMOUNT:
|
|
535
|
+
return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM
|
|
536
|
+
|
|
537
|
+
# 19. Check that the computed fees are equal to the fees in the block header
|
|
538
|
+
if block.transactions_info.fees != fees:
|
|
539
|
+
return Err.INVALID_BLOCK_FEE_AMOUNT
|
|
540
|
+
|
|
541
|
+
# 20. Verify that removed coin puzzle_hashes match with calculated puzzle_hashes
|
|
542
|
+
for unspent in removal_coin_records.values():
|
|
543
|
+
if unspent.coin.puzzle_hash != removals_puzzle_dic[unspent.name]:
|
|
544
|
+
return Err.WRONG_PUZZLE_HASH
|
|
545
|
+
|
|
546
|
+
# 21. Verify conditions
|
|
547
|
+
# verify absolute/relative height/time conditions
|
|
548
|
+
if conds is not None:
|
|
549
|
+
error = mempool_check_time_locks(
|
|
550
|
+
removal_coin_records,
|
|
551
|
+
conds,
|
|
552
|
+
prev_transaction_block_height,
|
|
553
|
+
prev_transaction_block_timestamp,
|
|
554
|
+
)
|
|
555
|
+
if error is not None:
|
|
556
|
+
return error
|
|
557
|
+
|
|
558
|
+
# 22. Verify aggregated signature is done in pre-validation
|
|
559
|
+
if not block.transactions_info.aggregated_signature:
|
|
560
|
+
return Err.BAD_AGGREGATE_SIGNATURE
|
|
561
|
+
|
|
562
|
+
return None
|