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,589 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import sqlite3
|
|
5
|
+
from collections.abc import Awaitable, Iterator
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from enum import Enum
|
|
9
|
+
from time import monotonic
|
|
10
|
+
from typing import Callable, Optional
|
|
11
|
+
|
|
12
|
+
from chia_rs import AugSchemeMPL, Coin, G2Element
|
|
13
|
+
|
|
14
|
+
from chia.consensus.constants import ConsensusConstants
|
|
15
|
+
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
16
|
+
from chia.full_node.fee_estimation import FeeMempoolInfo, MempoolInfo, MempoolItemInfo
|
|
17
|
+
from chia.full_node.fee_estimator_interface import FeeEstimatorInterface
|
|
18
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
19
|
+
from chia.types.clvm_cost import CLVMCost
|
|
20
|
+
from chia.types.coin_spend import CoinSpend
|
|
21
|
+
from chia.types.eligible_coin_spends import EligibleCoinSpends, UnspentLineageInfo
|
|
22
|
+
from chia.types.internal_mempool_item import InternalMempoolItem
|
|
23
|
+
from chia.types.mempool_item import MempoolItem
|
|
24
|
+
from chia.types.spend_bundle import SpendBundle
|
|
25
|
+
from chia.util.batches import to_batches
|
|
26
|
+
from chia.util.db_wrapper import SQLITE_MAX_VARIABLE_NUMBER
|
|
27
|
+
from chia.util.errors import Err
|
|
28
|
+
from chia.util.ints import uint32, uint64
|
|
29
|
+
|
|
30
|
+
log = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
# Maximum number of mempool items that can be skipped (not considered) during
|
|
33
|
+
# the creation of a block bundle. An item is skipped if it won't fit in the
|
|
34
|
+
# block we're trying to create.
|
|
35
|
+
MAX_SKIPPED_ITEMS = 10
|
|
36
|
+
|
|
37
|
+
# Threshold after which we stop including mempool items with eligible spends
|
|
38
|
+
# during the creation of a block bundle. We do that to avoid spending too much
|
|
39
|
+
# time on potentially expensive items.
|
|
40
|
+
PRIORITY_TX_THRESHOLD = 3
|
|
41
|
+
|
|
42
|
+
# Typical cost of a standard XCH spend. It's used as a heuristic to help
|
|
43
|
+
# determine how close to the block size limit we're willing to go.
|
|
44
|
+
MIN_COST_THRESHOLD = 6_000_000
|
|
45
|
+
|
|
46
|
+
# We impose a limit on the fee a single transaction can pay in order to have the
|
|
47
|
+
# sum of all fees in the mempool be less than 2^63. That's the limit of sqlite's
|
|
48
|
+
# integers, which we rely on for computing fee per cost as well as the fee sum
|
|
49
|
+
MEMPOOL_ITEM_FEE_LIMIT = 2**50
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass
|
|
53
|
+
class MempoolRemoveInfo:
|
|
54
|
+
items: list[InternalMempoolItem]
|
|
55
|
+
reason: MempoolRemoveReason
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass
|
|
59
|
+
class MempoolAddInfo:
|
|
60
|
+
removals: list[MempoolRemoveInfo]
|
|
61
|
+
error: Optional[Err]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class MempoolRemoveReason(Enum):
|
|
65
|
+
CONFLICT = 1
|
|
66
|
+
BLOCK_INCLUSION = 2
|
|
67
|
+
POOL_FULL = 3
|
|
68
|
+
EXPIRED = 4
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class Mempool:
|
|
72
|
+
_db_conn: sqlite3.Connection
|
|
73
|
+
# it's expensive to serialize and deserialize G2Element, so we keep those in
|
|
74
|
+
# this separate dictionary
|
|
75
|
+
_items: dict[bytes32, InternalMempoolItem]
|
|
76
|
+
|
|
77
|
+
# the most recent block height and timestamp that we know of
|
|
78
|
+
_block_height: uint32
|
|
79
|
+
_timestamp: uint64
|
|
80
|
+
|
|
81
|
+
_total_fee: int
|
|
82
|
+
_total_cost: int
|
|
83
|
+
|
|
84
|
+
def __init__(self, mempool_info: MempoolInfo, fee_estimator: FeeEstimatorInterface):
|
|
85
|
+
self._db_conn = sqlite3.connect(":memory:")
|
|
86
|
+
self._items = {}
|
|
87
|
+
self._block_height = uint32(0)
|
|
88
|
+
self._timestamp = uint64(0)
|
|
89
|
+
self._total_fee = 0
|
|
90
|
+
self._total_cost = 0
|
|
91
|
+
|
|
92
|
+
with self._db_conn:
|
|
93
|
+
# name means SpendBundle hash
|
|
94
|
+
# assert_height may be NIL
|
|
95
|
+
# the seq field indicates the order of items being added to the
|
|
96
|
+
# mempool. It's used as a tie-breaker for items with the same fee
|
|
97
|
+
# rate
|
|
98
|
+
# TODO: In the future, for the "fee_per_cost" field, opt for
|
|
99
|
+
# "GENERATED ALWAYS AS (CAST(fee AS REAL) / cost) VIRTUAL"
|
|
100
|
+
self._db_conn.execute(
|
|
101
|
+
"""CREATE TABLE tx(
|
|
102
|
+
name BLOB,
|
|
103
|
+
cost INT NOT NULL,
|
|
104
|
+
fee INT NOT NULL,
|
|
105
|
+
assert_height INT,
|
|
106
|
+
assert_before_height INT,
|
|
107
|
+
assert_before_seconds INT,
|
|
108
|
+
fee_per_cost REAL,
|
|
109
|
+
seq INTEGER PRIMARY KEY AUTOINCREMENT)
|
|
110
|
+
"""
|
|
111
|
+
)
|
|
112
|
+
self._db_conn.execute("CREATE INDEX name_idx ON tx(name)")
|
|
113
|
+
self._db_conn.execute("CREATE INDEX feerate ON tx(fee_per_cost)")
|
|
114
|
+
self._db_conn.execute(
|
|
115
|
+
"CREATE INDEX assert_before ON tx(assert_before_height, assert_before_seconds) "
|
|
116
|
+
"WHERE assert_before_height IS NOT NULL OR assert_before_seconds IS NOT NULL"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# This table maps coin IDs to spend bundles hashes
|
|
120
|
+
self._db_conn.execute(
|
|
121
|
+
"""CREATE TABLE spends(
|
|
122
|
+
coin_id BLOB NOT NULL,
|
|
123
|
+
tx BLOB NOT NULL,
|
|
124
|
+
UNIQUE(coin_id, tx))
|
|
125
|
+
"""
|
|
126
|
+
)
|
|
127
|
+
self._db_conn.execute("CREATE INDEX spend_by_coin ON spends(coin_id)")
|
|
128
|
+
self._db_conn.execute("CREATE INDEX spend_by_bundle ON spends(tx)")
|
|
129
|
+
|
|
130
|
+
self.mempool_info: MempoolInfo = mempool_info
|
|
131
|
+
self.fee_estimator: FeeEstimatorInterface = fee_estimator
|
|
132
|
+
|
|
133
|
+
def __del__(self) -> None:
|
|
134
|
+
self._db_conn.close()
|
|
135
|
+
|
|
136
|
+
def _row_to_item(self, row: sqlite3.Row) -> MempoolItem:
|
|
137
|
+
name = bytes32(row[0])
|
|
138
|
+
fee = int(row[2])
|
|
139
|
+
assert_height = row[3]
|
|
140
|
+
assert_before_height = row[4]
|
|
141
|
+
assert_before_seconds = row[5]
|
|
142
|
+
item = self._items[name]
|
|
143
|
+
|
|
144
|
+
return MempoolItem(
|
|
145
|
+
item.spend_bundle,
|
|
146
|
+
uint64(fee),
|
|
147
|
+
item.conds,
|
|
148
|
+
name,
|
|
149
|
+
uint32(item.height_added_to_mempool),
|
|
150
|
+
assert_height,
|
|
151
|
+
assert_before_height,
|
|
152
|
+
assert_before_seconds,
|
|
153
|
+
bundle_coin_spends=item.bundle_coin_spends,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
def total_mempool_fees(self) -> int:
|
|
157
|
+
return self._total_fee
|
|
158
|
+
|
|
159
|
+
def total_mempool_cost(self) -> CLVMCost:
|
|
160
|
+
return CLVMCost(uint64(self._total_cost))
|
|
161
|
+
|
|
162
|
+
def all_items(self) -> Iterator[MempoolItem]:
|
|
163
|
+
with self._db_conn:
|
|
164
|
+
cursor = self._db_conn.execute("SELECT * FROM tx")
|
|
165
|
+
for row in cursor:
|
|
166
|
+
yield self._row_to_item(row)
|
|
167
|
+
|
|
168
|
+
def all_item_ids(self) -> list[bytes32]:
|
|
169
|
+
with self._db_conn:
|
|
170
|
+
cursor = self._db_conn.execute("SELECT name FROM tx")
|
|
171
|
+
return [bytes32(row[0]) for row in cursor]
|
|
172
|
+
|
|
173
|
+
def items_with_coin_ids(self, coin_ids: set[bytes32]) -> list[bytes32]:
|
|
174
|
+
"""
|
|
175
|
+
Returns a list of transaction ids that spend or create any coins with the provided coin ids.
|
|
176
|
+
This iterates over the internal items instead of using a query.
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
transaction_ids: list[bytes32] = []
|
|
180
|
+
|
|
181
|
+
for transaction_id, item in self._items.items():
|
|
182
|
+
conds = item.conds
|
|
183
|
+
assert conds is not None
|
|
184
|
+
|
|
185
|
+
for spend in conds.spends:
|
|
186
|
+
if spend.coin_id in coin_ids:
|
|
187
|
+
transaction_ids.append(transaction_id)
|
|
188
|
+
break
|
|
189
|
+
|
|
190
|
+
for puzzle_hash, amount, _memo in spend.create_coin:
|
|
191
|
+
if Coin(spend.coin_id, puzzle_hash, uint64(amount)).name() in coin_ids:
|
|
192
|
+
transaction_ids.append(transaction_id)
|
|
193
|
+
break
|
|
194
|
+
else:
|
|
195
|
+
continue
|
|
196
|
+
|
|
197
|
+
break
|
|
198
|
+
|
|
199
|
+
return transaction_ids
|
|
200
|
+
|
|
201
|
+
def items_with_puzzle_hashes(self, puzzle_hashes: set[bytes32], include_hints: bool) -> list[bytes32]:
|
|
202
|
+
"""
|
|
203
|
+
Returns a list of transaction ids that spend or create any coins
|
|
204
|
+
with the provided puzzle hashes (or hints, if enabled).
|
|
205
|
+
This iterates over the internal items instead of using a query.
|
|
206
|
+
"""
|
|
207
|
+
|
|
208
|
+
transaction_ids: list[bytes32] = []
|
|
209
|
+
|
|
210
|
+
for transaction_id, item in self._items.items():
|
|
211
|
+
conds = item.conds
|
|
212
|
+
assert conds is not None
|
|
213
|
+
|
|
214
|
+
for spend in conds.spends:
|
|
215
|
+
if spend.puzzle_hash in puzzle_hashes:
|
|
216
|
+
transaction_ids.append(transaction_id)
|
|
217
|
+
break
|
|
218
|
+
|
|
219
|
+
for puzzle_hash, _amount, memo in spend.create_coin:
|
|
220
|
+
if puzzle_hash in puzzle_hashes or (include_hints and memo is not None and memo in puzzle_hashes):
|
|
221
|
+
transaction_ids.append(transaction_id)
|
|
222
|
+
break
|
|
223
|
+
else:
|
|
224
|
+
continue
|
|
225
|
+
|
|
226
|
+
break
|
|
227
|
+
|
|
228
|
+
return transaction_ids
|
|
229
|
+
|
|
230
|
+
# TODO: move "process_mempool_items()" into this class in order to do this a
|
|
231
|
+
# bit more efficiently
|
|
232
|
+
def items_by_feerate(self) -> Iterator[MempoolItem]:
|
|
233
|
+
cursor = self._db_conn.execute("SELECT * FROM tx ORDER BY fee_per_cost DESC, seq ASC")
|
|
234
|
+
for row in cursor:
|
|
235
|
+
yield self._row_to_item(row)
|
|
236
|
+
|
|
237
|
+
def size(self) -> int:
|
|
238
|
+
cursor = self._db_conn.execute("SELECT COUNT(name) FROM tx")
|
|
239
|
+
row = cursor.fetchone()
|
|
240
|
+
return int(row[0])
|
|
241
|
+
|
|
242
|
+
def get_item_by_id(self, item_id: bytes32) -> Optional[MempoolItem]:
|
|
243
|
+
with self._db_conn:
|
|
244
|
+
cursor = self._db_conn.execute("SELECT * FROM tx WHERE name=?", (item_id,))
|
|
245
|
+
row = cursor.fetchone()
|
|
246
|
+
return None if row is None else self._row_to_item(row)
|
|
247
|
+
|
|
248
|
+
# TODO: we need a bulk lookup function like this too
|
|
249
|
+
def get_items_by_coin_id(self, spent_coin_id: bytes32) -> Iterator[MempoolItem]:
|
|
250
|
+
cursor = self._db_conn.execute(
|
|
251
|
+
"""
|
|
252
|
+
SELECT *
|
|
253
|
+
FROM tx
|
|
254
|
+
WHERE name IN (
|
|
255
|
+
SELECT tx
|
|
256
|
+
FROM spends
|
|
257
|
+
WHERE coin_id = ?
|
|
258
|
+
)
|
|
259
|
+
""",
|
|
260
|
+
(spent_coin_id,),
|
|
261
|
+
)
|
|
262
|
+
for row in cursor:
|
|
263
|
+
yield self._row_to_item(row)
|
|
264
|
+
|
|
265
|
+
def get_items_by_coin_ids(self, spent_coin_ids: list[bytes32]) -> list[MempoolItem]:
|
|
266
|
+
items: list[MempoolItem] = []
|
|
267
|
+
for batch in to_batches(spent_coin_ids, SQLITE_MAX_VARIABLE_NUMBER):
|
|
268
|
+
args = ",".join(["?"] * len(batch.entries))
|
|
269
|
+
cursor = self._db_conn.execute(
|
|
270
|
+
f"SELECT * FROM tx WHERE name IN (SELECT tx FROM spends WHERE coin_id IN ({args}))",
|
|
271
|
+
tuple(batch.entries),
|
|
272
|
+
)
|
|
273
|
+
items.extend(self._row_to_item(row) for row in cursor)
|
|
274
|
+
return items
|
|
275
|
+
|
|
276
|
+
def get_min_fee_rate(self, cost: int) -> Optional[float]:
|
|
277
|
+
"""
|
|
278
|
+
Gets the minimum fpc rate that a transaction with specified cost will need in order to get included.
|
|
279
|
+
"""
|
|
280
|
+
|
|
281
|
+
if not self.at_full_capacity(cost):
|
|
282
|
+
return 0
|
|
283
|
+
|
|
284
|
+
# TODO: make MempoolItem.cost be CLVMCost
|
|
285
|
+
current_cost = self._total_cost
|
|
286
|
+
|
|
287
|
+
# Iterates through all spends in increasing fee per cost
|
|
288
|
+
with self._db_conn:
|
|
289
|
+
cursor = self._db_conn.execute("SELECT cost,fee_per_cost FROM tx ORDER BY fee_per_cost ASC, seq DESC")
|
|
290
|
+
|
|
291
|
+
item_cost: int
|
|
292
|
+
fee_per_cost: float
|
|
293
|
+
for item_cost, fee_per_cost in cursor:
|
|
294
|
+
current_cost -= item_cost
|
|
295
|
+
# Removing one at a time, until our transaction of size cost fits
|
|
296
|
+
if current_cost + cost <= self.mempool_info.max_size_in_cost:
|
|
297
|
+
return fee_per_cost
|
|
298
|
+
|
|
299
|
+
log.info(
|
|
300
|
+
f"Transaction with cost {cost} does not fit in mempool of max cost {self.mempool_info.max_size_in_cost}"
|
|
301
|
+
)
|
|
302
|
+
return None
|
|
303
|
+
|
|
304
|
+
def new_tx_block(self, block_height: uint32, timestamp: uint64) -> MempoolRemoveInfo:
|
|
305
|
+
"""
|
|
306
|
+
Remove all items that became invalid because of this new height and
|
|
307
|
+
timestamp. (we don't know about which coins were spent in this new block
|
|
308
|
+
here, so those are handled separately)
|
|
309
|
+
"""
|
|
310
|
+
with self._db_conn:
|
|
311
|
+
cursor = self._db_conn.execute(
|
|
312
|
+
"SELECT name FROM tx WHERE assert_before_seconds <= ? OR assert_before_height <= ?",
|
|
313
|
+
(timestamp, block_height),
|
|
314
|
+
)
|
|
315
|
+
to_remove = [bytes32(row[0]) for row in cursor]
|
|
316
|
+
|
|
317
|
+
self._block_height = block_height
|
|
318
|
+
self._timestamp = timestamp
|
|
319
|
+
|
|
320
|
+
return self.remove_from_pool(to_remove, MempoolRemoveReason.EXPIRED)
|
|
321
|
+
|
|
322
|
+
def remove_from_pool(self, items: list[bytes32], reason: MempoolRemoveReason) -> MempoolRemoveInfo:
|
|
323
|
+
"""
|
|
324
|
+
Removes an item from the mempool.
|
|
325
|
+
"""
|
|
326
|
+
if items == []:
|
|
327
|
+
return MempoolRemoveInfo([], reason)
|
|
328
|
+
|
|
329
|
+
removed_items: list[MempoolItemInfo] = []
|
|
330
|
+
if reason != MempoolRemoveReason.BLOCK_INCLUSION:
|
|
331
|
+
for batch in to_batches(items, SQLITE_MAX_VARIABLE_NUMBER):
|
|
332
|
+
args = ",".join(["?"] * len(batch.entries))
|
|
333
|
+
with self._db_conn:
|
|
334
|
+
cursor = self._db_conn.execute(
|
|
335
|
+
f"SELECT name, cost, fee FROM tx WHERE name in ({args})", batch.entries
|
|
336
|
+
)
|
|
337
|
+
for row in cursor:
|
|
338
|
+
name = bytes32(row[0])
|
|
339
|
+
internal_item = self._items[name]
|
|
340
|
+
item = MempoolItemInfo(int(row[1]), int(row[2]), internal_item.height_added_to_mempool)
|
|
341
|
+
removed_items.append(item)
|
|
342
|
+
|
|
343
|
+
removed_internal_items = [self._items.pop(name) for name in items]
|
|
344
|
+
|
|
345
|
+
for batch in to_batches(items, SQLITE_MAX_VARIABLE_NUMBER):
|
|
346
|
+
args = ",".join(["?"] * len(batch.entries))
|
|
347
|
+
with self._db_conn:
|
|
348
|
+
cursor = self._db_conn.execute(
|
|
349
|
+
f"SELECT SUM(cost), SUM(fee) FROM tx WHERE name in ({args})", batch.entries
|
|
350
|
+
)
|
|
351
|
+
cost_to_remove, fee_to_remove = cursor.fetchone()
|
|
352
|
+
|
|
353
|
+
self._db_conn.execute(f"DELETE FROM tx WHERE name in ({args})", batch.entries)
|
|
354
|
+
self._db_conn.execute(f"DELETE FROM spends WHERE tx in ({args})", batch.entries)
|
|
355
|
+
|
|
356
|
+
self._total_cost -= cost_to_remove
|
|
357
|
+
self._total_fee -= fee_to_remove
|
|
358
|
+
assert self._total_cost >= 0
|
|
359
|
+
assert self._total_fee >= 0
|
|
360
|
+
|
|
361
|
+
if reason != MempoolRemoveReason.BLOCK_INCLUSION:
|
|
362
|
+
info = FeeMempoolInfo(
|
|
363
|
+
self.mempool_info, self.total_mempool_cost(), self.total_mempool_fees(), datetime.now()
|
|
364
|
+
)
|
|
365
|
+
for iteminfo in removed_items:
|
|
366
|
+
self.fee_estimator.remove_mempool_item(info, iteminfo)
|
|
367
|
+
|
|
368
|
+
return MempoolRemoveInfo(removed_internal_items, reason)
|
|
369
|
+
|
|
370
|
+
def add_to_pool(self, item: MempoolItem) -> MempoolAddInfo:
|
|
371
|
+
"""
|
|
372
|
+
Adds an item to the mempool by kicking out transactions (if it doesn't fit), in order of increasing fee per cost
|
|
373
|
+
"""
|
|
374
|
+
|
|
375
|
+
assert item.fee < MEMPOOL_ITEM_FEE_LIMIT
|
|
376
|
+
assert item.conds is not None
|
|
377
|
+
assert item.cost <= self.mempool_info.max_block_clvm_cost
|
|
378
|
+
|
|
379
|
+
removals: list[MempoolRemoveInfo] = []
|
|
380
|
+
|
|
381
|
+
# we have certain limits on transactions that will expire soon
|
|
382
|
+
# (in the next 15 minutes)
|
|
383
|
+
block_cutoff = self._block_height + 48
|
|
384
|
+
time_cutoff = self._timestamp + 900
|
|
385
|
+
if (item.assert_before_height is not None and item.assert_before_height < block_cutoff) or (
|
|
386
|
+
item.assert_before_seconds is not None and item.assert_before_seconds < time_cutoff
|
|
387
|
+
):
|
|
388
|
+
# this lists only transactions that expire soon, in order of
|
|
389
|
+
# lowest fee rate along with the cumulative cost of such
|
|
390
|
+
# transactions counting from highest to lowest fee rate
|
|
391
|
+
cursor = self._db_conn.execute(
|
|
392
|
+
"""
|
|
393
|
+
SELECT name,
|
|
394
|
+
fee_per_cost,
|
|
395
|
+
SUM(cost) OVER (ORDER BY fee_per_cost DESC, seq ASC) AS cumulative_cost
|
|
396
|
+
FROM tx
|
|
397
|
+
WHERE assert_before_seconds IS NOT NULL AND assert_before_seconds < ?
|
|
398
|
+
OR assert_before_height IS NOT NULL AND assert_before_height < ?
|
|
399
|
+
ORDER BY cumulative_cost DESC
|
|
400
|
+
""",
|
|
401
|
+
(time_cutoff, block_cutoff),
|
|
402
|
+
)
|
|
403
|
+
to_remove: list[bytes32] = []
|
|
404
|
+
for row in cursor:
|
|
405
|
+
name, fee_per_cost, cumulative_cost = row
|
|
406
|
+
|
|
407
|
+
# there's space for us, stop pruning
|
|
408
|
+
if cumulative_cost + item.cost <= self.mempool_info.max_block_clvm_cost:
|
|
409
|
+
break
|
|
410
|
+
|
|
411
|
+
# we can't evict any more transactions, abort (and don't
|
|
412
|
+
# evict what we put aside in "to_remove" list)
|
|
413
|
+
if fee_per_cost > item.fee_per_cost:
|
|
414
|
+
return MempoolAddInfo([], Err.INVALID_FEE_LOW_FEE)
|
|
415
|
+
to_remove.append(name)
|
|
416
|
+
|
|
417
|
+
removals.append(self.remove_from_pool(to_remove, MempoolRemoveReason.EXPIRED))
|
|
418
|
+
|
|
419
|
+
# if we don't find any entries, it's OK to add this entry
|
|
420
|
+
|
|
421
|
+
if self._total_cost + item.cost > self.mempool_info.max_size_in_cost:
|
|
422
|
+
# pick the items with the lowest fee per cost to remove
|
|
423
|
+
cursor = self._db_conn.execute(
|
|
424
|
+
"""SELECT name FROM tx
|
|
425
|
+
WHERE name NOT IN (
|
|
426
|
+
SELECT name FROM (
|
|
427
|
+
SELECT name,
|
|
428
|
+
SUM(cost) OVER (ORDER BY fee_per_cost DESC, seq ASC) AS total_cost
|
|
429
|
+
FROM tx) AS tx_with_cost
|
|
430
|
+
WHERE total_cost <= ?)
|
|
431
|
+
""",
|
|
432
|
+
(self.mempool_info.max_size_in_cost - item.cost,),
|
|
433
|
+
)
|
|
434
|
+
to_remove = [bytes32(row[0]) for row in cursor]
|
|
435
|
+
removals.append(self.remove_from_pool(to_remove, MempoolRemoveReason.POOL_FULL))
|
|
436
|
+
|
|
437
|
+
with self._db_conn as conn:
|
|
438
|
+
# TODO: In the future, for the "fee_per_cost" field, opt for
|
|
439
|
+
# "GENERATED ALWAYS AS (CAST(fee AS REAL) / cost) VIRTUAL"
|
|
440
|
+
conn.execute(
|
|
441
|
+
"INSERT INTO "
|
|
442
|
+
"tx(name,cost,fee,assert_height,assert_before_height,assert_before_seconds,fee_per_cost) "
|
|
443
|
+
"VALUES(?, ?, ?, ?, ?, ?, ?)",
|
|
444
|
+
(
|
|
445
|
+
item.name,
|
|
446
|
+
item.cost,
|
|
447
|
+
item.fee,
|
|
448
|
+
item.assert_height,
|
|
449
|
+
item.assert_before_height,
|
|
450
|
+
item.assert_before_seconds,
|
|
451
|
+
item.fee / item.cost,
|
|
452
|
+
),
|
|
453
|
+
)
|
|
454
|
+
all_coin_spends = [(s.coin_id, item.name) for s in item.conds.spends]
|
|
455
|
+
conn.executemany("INSERT INTO spends VALUES(?, ?)", all_coin_spends)
|
|
456
|
+
|
|
457
|
+
self._items[item.name] = InternalMempoolItem(
|
|
458
|
+
item.spend_bundle, item.conds, item.height_added_to_mempool, item.bundle_coin_spends
|
|
459
|
+
)
|
|
460
|
+
self._total_cost += item.cost
|
|
461
|
+
self._total_fee += item.fee
|
|
462
|
+
|
|
463
|
+
info = FeeMempoolInfo(self.mempool_info, self.total_mempool_cost(), self.total_mempool_fees(), datetime.now())
|
|
464
|
+
self.fee_estimator.add_mempool_item(info, MempoolItemInfo(item.cost, item.fee, item.height_added_to_mempool))
|
|
465
|
+
return MempoolAddInfo(removals, None)
|
|
466
|
+
|
|
467
|
+
def at_full_capacity(self, cost: int) -> bool:
|
|
468
|
+
"""
|
|
469
|
+
Checks whether the mempool is at full capacity and cannot accept a transaction with size cost.
|
|
470
|
+
"""
|
|
471
|
+
|
|
472
|
+
return self._total_cost + cost > self.mempool_info.max_size_in_cost
|
|
473
|
+
|
|
474
|
+
async def create_bundle_from_mempool_items(
|
|
475
|
+
self,
|
|
476
|
+
item_inclusion_filter: Callable[[bytes32], bool],
|
|
477
|
+
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
|
|
478
|
+
constants: ConsensusConstants,
|
|
479
|
+
height: uint32,
|
|
480
|
+
) -> Optional[tuple[SpendBundle, list[Coin]]]:
|
|
481
|
+
cost_sum = 0 # Checks that total cost does not exceed block maximum
|
|
482
|
+
fee_sum = 0 # Checks that total fees don't exceed 64 bits
|
|
483
|
+
processed_spend_bundles = 0
|
|
484
|
+
additions: list[Coin] = []
|
|
485
|
+
# This contains:
|
|
486
|
+
# 1. A map of coin ID to a coin spend solution and its isolated cost
|
|
487
|
+
# We reconstruct it for every bundle we create from mempool items because we
|
|
488
|
+
# deduplicate on the first coin spend solution that comes with the highest
|
|
489
|
+
# fee rate item, and that can change across calls
|
|
490
|
+
# 2. A map of fast forward eligible singleton puzzle hash to the most
|
|
491
|
+
# recent unspent singleton data, to allow chaining fast forward
|
|
492
|
+
# singleton spends
|
|
493
|
+
eligible_coin_spends = EligibleCoinSpends()
|
|
494
|
+
coin_spends: list[CoinSpend] = []
|
|
495
|
+
sigs: list[G2Element] = []
|
|
496
|
+
log.info(f"Starting to make block, max cost: {self.mempool_info.max_block_clvm_cost}")
|
|
497
|
+
bundle_creation_start = monotonic()
|
|
498
|
+
cursor = self._db_conn.execute("SELECT name, fee FROM tx ORDER BY fee_per_cost DESC, seq ASC")
|
|
499
|
+
skipped_items = 0
|
|
500
|
+
for row in cursor:
|
|
501
|
+
name = bytes32(row[0])
|
|
502
|
+
fee = int(row[1])
|
|
503
|
+
item = self._items[name]
|
|
504
|
+
|
|
505
|
+
current_time = monotonic()
|
|
506
|
+
if current_time - bundle_creation_start > 1:
|
|
507
|
+
log.info(f"exiting early, already spent {current_time - bundle_creation_start:0.2f} s")
|
|
508
|
+
break
|
|
509
|
+
if not item_inclusion_filter(name):
|
|
510
|
+
continue
|
|
511
|
+
try:
|
|
512
|
+
assert item.conds is not None
|
|
513
|
+
cost = item.conds.cost
|
|
514
|
+
if skipped_items >= PRIORITY_TX_THRESHOLD:
|
|
515
|
+
# If we've encountered `PRIORITY_TX_THRESHOLD` number of
|
|
516
|
+
# transactions that don't fit in the remaining block size,
|
|
517
|
+
# we want to keep looking for smaller transactions that
|
|
518
|
+
# might fit, but we also want to avoid spending too much
|
|
519
|
+
# time on potentially expensive ones, hence this shortcut.
|
|
520
|
+
unique_coin_spends = []
|
|
521
|
+
unique_additions = []
|
|
522
|
+
for spend_data in item.bundle_coin_spends.values():
|
|
523
|
+
if spend_data.eligible_for_dedup or spend_data.eligible_for_fast_forward:
|
|
524
|
+
raise Exception(f"Skipping transaction with eligible coin(s): {name.hex()}")
|
|
525
|
+
unique_coin_spends.append(spend_data.coin_spend)
|
|
526
|
+
unique_additions.extend(spend_data.additions)
|
|
527
|
+
cost_saving = 0
|
|
528
|
+
else:
|
|
529
|
+
await eligible_coin_spends.process_fast_forward_spends(
|
|
530
|
+
mempool_item=item,
|
|
531
|
+
get_unspent_lineage_info_for_puzzle_hash=get_unspent_lineage_info_for_puzzle_hash,
|
|
532
|
+
height=height,
|
|
533
|
+
constants=constants,
|
|
534
|
+
)
|
|
535
|
+
unique_coin_spends, cost_saving, unique_additions = eligible_coin_spends.get_deduplication_info(
|
|
536
|
+
bundle_coin_spends=item.bundle_coin_spends, max_cost=cost
|
|
537
|
+
)
|
|
538
|
+
item_cost = cost - cost_saving
|
|
539
|
+
log.info(
|
|
540
|
+
"Cumulative cost: %d, fee per cost: %0.4f, item cost: %d", cost_sum, fee / item_cost, item_cost
|
|
541
|
+
)
|
|
542
|
+
new_fee_sum = fee_sum + fee
|
|
543
|
+
if new_fee_sum > DEFAULT_CONSTANTS.MAX_COIN_AMOUNT:
|
|
544
|
+
# Such a fee is very unlikely to happen but we're defensively
|
|
545
|
+
# accounting for it
|
|
546
|
+
break # pragma: no cover
|
|
547
|
+
new_cost_sum = cost_sum + item_cost
|
|
548
|
+
if new_cost_sum > self.mempool_info.max_block_clvm_cost:
|
|
549
|
+
# Let's skip this item
|
|
550
|
+
log.info(
|
|
551
|
+
"Skipping mempool item. Cumulative cost %d exceeds maximum block cost %d",
|
|
552
|
+
new_cost_sum,
|
|
553
|
+
self.mempool_info.max_block_clvm_cost,
|
|
554
|
+
)
|
|
555
|
+
skipped_items += 1
|
|
556
|
+
if skipped_items < MAX_SKIPPED_ITEMS:
|
|
557
|
+
continue
|
|
558
|
+
# Let's stop taking more items if we skipped `MAX_SKIPPED_ITEMS`
|
|
559
|
+
break
|
|
560
|
+
coin_spends.extend(unique_coin_spends)
|
|
561
|
+
additions.extend(unique_additions)
|
|
562
|
+
sigs.append(item.spend_bundle.aggregated_signature)
|
|
563
|
+
cost_sum = new_cost_sum
|
|
564
|
+
fee_sum = new_fee_sum
|
|
565
|
+
processed_spend_bundles += 1
|
|
566
|
+
# Let's stop taking more items if we don't have enough cost left
|
|
567
|
+
# for at least `MIN_COST_THRESHOLD` because that would mean we're
|
|
568
|
+
# getting very close to the limit anyway and *probably* won't
|
|
569
|
+
# find transactions small enough to fit at this point
|
|
570
|
+
if self.mempool_info.max_block_clvm_cost - cost_sum < MIN_COST_THRESHOLD:
|
|
571
|
+
break
|
|
572
|
+
except Exception as e:
|
|
573
|
+
log.debug(f"Exception while checking a mempool item for deduplication: {e}")
|
|
574
|
+
continue
|
|
575
|
+
if processed_spend_bundles == 0:
|
|
576
|
+
return None
|
|
577
|
+
log.info(
|
|
578
|
+
f"Cumulative cost of block (real cost should be less) {cost_sum}. Proportion "
|
|
579
|
+
f"full: {cost_sum / self.mempool_info.max_block_clvm_cost}"
|
|
580
|
+
)
|
|
581
|
+
aggregated_signature = AugSchemeMPL.aggregate(sigs)
|
|
582
|
+
agg = SpendBundle(coin_spends, aggregated_signature)
|
|
583
|
+
bundle_creation_end = monotonic()
|
|
584
|
+
duration = bundle_creation_end - bundle_creation_start
|
|
585
|
+
log.log(
|
|
586
|
+
logging.INFO if duration < 1 else logging.WARNING,
|
|
587
|
+
f"create_bundle_from_mempool_items took {duration:0.4f} seconds",
|
|
588
|
+
)
|
|
589
|
+
return agg, additions
|