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,647 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
import logging
|
|
5
|
+
import sqlite3
|
|
6
|
+
import time
|
|
7
|
+
from collections.abc import Collection
|
|
8
|
+
from typing import Any, Optional
|
|
9
|
+
|
|
10
|
+
import typing_extensions
|
|
11
|
+
from aiosqlite import Cursor
|
|
12
|
+
from clvm.casts import int_from_bytes
|
|
13
|
+
|
|
14
|
+
from chia.protocols.wallet_protocol import CoinState
|
|
15
|
+
from chia.types.blockchain_format.coin import Coin
|
|
16
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
17
|
+
from chia.types.coin_record import CoinRecord
|
|
18
|
+
from chia.types.eligible_coin_spends import UnspentLineageInfo
|
|
19
|
+
from chia.util.batches import to_batches
|
|
20
|
+
from chia.util.db_wrapper import SQLITE_MAX_VARIABLE_NUMBER, DBWrapper2
|
|
21
|
+
from chia.util.ints import uint32, uint64
|
|
22
|
+
from chia.util.lru_cache import LRUCache
|
|
23
|
+
|
|
24
|
+
log = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@typing_extensions.final
|
|
28
|
+
@dataclasses.dataclass
|
|
29
|
+
class CoinStore:
|
|
30
|
+
"""
|
|
31
|
+
This object handles CoinRecords in DB.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
db_wrapper: DBWrapper2
|
|
35
|
+
coins_added_at_height_cache: LRUCache[uint32, list[CoinRecord]]
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
async def create(cls, db_wrapper: DBWrapper2) -> CoinStore:
|
|
39
|
+
if db_wrapper.db_version != 2:
|
|
40
|
+
raise RuntimeError(f"CoinStore does not support database schema v{db_wrapper.db_version}")
|
|
41
|
+
self = CoinStore(db_wrapper, LRUCache(100))
|
|
42
|
+
|
|
43
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
44
|
+
log.info("DB: Creating coin store tables and indexes.")
|
|
45
|
+
# the coin_name is unique in this table because the CoinStore always
|
|
46
|
+
# only represent a single peak
|
|
47
|
+
await conn.execute(
|
|
48
|
+
"CREATE TABLE IF NOT EXISTS coin_record("
|
|
49
|
+
"coin_name blob PRIMARY KEY,"
|
|
50
|
+
" confirmed_index bigint,"
|
|
51
|
+
" spent_index bigint," # if this is zero, it means the coin has not been spent
|
|
52
|
+
" coinbase int,"
|
|
53
|
+
" puzzle_hash blob,"
|
|
54
|
+
" coin_parent blob,"
|
|
55
|
+
" amount blob," # we use a blob of 8 bytes to store uint64
|
|
56
|
+
" timestamp bigint)"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Useful for reorg lookups
|
|
60
|
+
log.info("DB: Creating index coin_confirmed_index")
|
|
61
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_confirmed_index on coin_record(confirmed_index)")
|
|
62
|
+
|
|
63
|
+
log.info("DB: Creating index coin_spent_index")
|
|
64
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_spent_index on coin_record(spent_index)")
|
|
65
|
+
|
|
66
|
+
log.info("DB: Creating index coin_puzzle_hash")
|
|
67
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_puzzle_hash on coin_record(puzzle_hash)")
|
|
68
|
+
|
|
69
|
+
log.info("DB: Creating index coin_parent_index")
|
|
70
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_parent_index on coin_record(coin_parent)")
|
|
71
|
+
|
|
72
|
+
return self
|
|
73
|
+
|
|
74
|
+
async def num_unspent(self) -> int:
|
|
75
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
76
|
+
async with conn.execute("SELECT COUNT(*) FROM coin_record WHERE spent_index=0") as cursor:
|
|
77
|
+
row = await cursor.fetchone()
|
|
78
|
+
if row is not None:
|
|
79
|
+
count: int = row[0]
|
|
80
|
+
return count
|
|
81
|
+
return 0
|
|
82
|
+
|
|
83
|
+
async def new_block(
|
|
84
|
+
self,
|
|
85
|
+
height: uint32,
|
|
86
|
+
timestamp: uint64,
|
|
87
|
+
included_reward_coins: Collection[Coin],
|
|
88
|
+
tx_additions: Collection[Coin],
|
|
89
|
+
tx_removals: list[bytes32],
|
|
90
|
+
) -> list[CoinRecord]:
|
|
91
|
+
"""
|
|
92
|
+
Only called for blocks which are blocks (and thus have rewards and transactions)
|
|
93
|
+
Returns a list of the CoinRecords that were added by this block
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
start = time.monotonic()
|
|
97
|
+
|
|
98
|
+
additions = []
|
|
99
|
+
|
|
100
|
+
for coin in tx_additions:
|
|
101
|
+
record: CoinRecord = CoinRecord(
|
|
102
|
+
coin,
|
|
103
|
+
height,
|
|
104
|
+
uint32(0),
|
|
105
|
+
False,
|
|
106
|
+
timestamp,
|
|
107
|
+
)
|
|
108
|
+
additions.append(record)
|
|
109
|
+
|
|
110
|
+
if height == 0:
|
|
111
|
+
assert len(included_reward_coins) == 0
|
|
112
|
+
else:
|
|
113
|
+
assert len(included_reward_coins) >= 2
|
|
114
|
+
|
|
115
|
+
for coin in included_reward_coins:
|
|
116
|
+
reward_coin_r: CoinRecord = CoinRecord(
|
|
117
|
+
coin,
|
|
118
|
+
height,
|
|
119
|
+
uint32(0),
|
|
120
|
+
True,
|
|
121
|
+
timestamp,
|
|
122
|
+
)
|
|
123
|
+
additions.append(reward_coin_r)
|
|
124
|
+
|
|
125
|
+
await self._add_coin_records(additions)
|
|
126
|
+
await self._set_spent(tx_removals, height)
|
|
127
|
+
|
|
128
|
+
end = time.monotonic()
|
|
129
|
+
log.log(
|
|
130
|
+
logging.WARNING if end - start > 10 else logging.DEBUG,
|
|
131
|
+
f"Height {height}: It took {end - start:0.2f}s to apply {len(tx_additions)} additions and "
|
|
132
|
+
+ f"{len(tx_removals)} removals to the coin store. Make sure "
|
|
133
|
+
+ "blockchain database is on a fast drive",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
return additions
|
|
137
|
+
|
|
138
|
+
# Checks DB and DiffStores for CoinRecord with coin_name and returns it
|
|
139
|
+
async def get_coin_record(self, coin_name: bytes32) -> Optional[CoinRecord]:
|
|
140
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
141
|
+
async with conn.execute(
|
|
142
|
+
"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
143
|
+
"coin_parent, amount, timestamp FROM coin_record WHERE coin_name=?",
|
|
144
|
+
(coin_name,),
|
|
145
|
+
) as cursor:
|
|
146
|
+
row = await cursor.fetchone()
|
|
147
|
+
if row is not None:
|
|
148
|
+
coin = self.row_to_coin(row)
|
|
149
|
+
return CoinRecord(coin, row[0], row[1], row[2], row[6])
|
|
150
|
+
return None
|
|
151
|
+
|
|
152
|
+
async def get_coin_records(self, names: Collection[bytes32]) -> list[CoinRecord]:
|
|
153
|
+
if len(names) == 0:
|
|
154
|
+
return []
|
|
155
|
+
|
|
156
|
+
coins: list[CoinRecord] = []
|
|
157
|
+
|
|
158
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
159
|
+
cursors: list[Cursor] = []
|
|
160
|
+
for batch in to_batches(names, SQLITE_MAX_VARIABLE_NUMBER):
|
|
161
|
+
names_db: tuple[Any, ...] = tuple(batch.entries)
|
|
162
|
+
cursors.append(
|
|
163
|
+
await conn.execute(
|
|
164
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
165
|
+
f"coin_parent, amount, timestamp FROM coin_record "
|
|
166
|
+
f'WHERE coin_name in ({",".join(["?"] * len(names_db))}) ',
|
|
167
|
+
names_db,
|
|
168
|
+
)
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
for cursor in cursors:
|
|
172
|
+
for row in await cursor.fetchall():
|
|
173
|
+
coin = self.row_to_coin(row)
|
|
174
|
+
record = CoinRecord(coin, row[0], row[1], row[2], row[6])
|
|
175
|
+
coins.append(record)
|
|
176
|
+
|
|
177
|
+
return coins
|
|
178
|
+
|
|
179
|
+
async def get_coins_added_at_height(self, height: uint32) -> list[CoinRecord]:
|
|
180
|
+
coins_added: Optional[list[CoinRecord]] = self.coins_added_at_height_cache.get(height)
|
|
181
|
+
if coins_added is not None:
|
|
182
|
+
return coins_added
|
|
183
|
+
|
|
184
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
185
|
+
async with conn.execute(
|
|
186
|
+
"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
187
|
+
"coin_parent, amount, timestamp FROM coin_record WHERE confirmed_index=?",
|
|
188
|
+
(height,),
|
|
189
|
+
) as cursor:
|
|
190
|
+
rows = await cursor.fetchall()
|
|
191
|
+
coins = []
|
|
192
|
+
for row in rows:
|
|
193
|
+
coin = self.row_to_coin(row)
|
|
194
|
+
coins.append(CoinRecord(coin, row[0], row[1], row[2], row[6]))
|
|
195
|
+
self.coins_added_at_height_cache.put(height, coins)
|
|
196
|
+
return coins
|
|
197
|
+
|
|
198
|
+
async def get_coins_removed_at_height(self, height: uint32) -> list[CoinRecord]:
|
|
199
|
+
# Special case to avoid querying all unspent coins (spent_index=0)
|
|
200
|
+
if height == 0:
|
|
201
|
+
return []
|
|
202
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
203
|
+
async with conn.execute(
|
|
204
|
+
"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
205
|
+
"coin_parent, amount, timestamp FROM coin_record WHERE spent_index=?",
|
|
206
|
+
(height,),
|
|
207
|
+
) as cursor:
|
|
208
|
+
coins = []
|
|
209
|
+
for row in await cursor.fetchall():
|
|
210
|
+
if row[1] != 0:
|
|
211
|
+
coin = self.row_to_coin(row)
|
|
212
|
+
coin_record = CoinRecord(coin, row[0], row[1], row[2], row[6])
|
|
213
|
+
coins.append(coin_record)
|
|
214
|
+
return coins
|
|
215
|
+
|
|
216
|
+
async def get_all_coins(self, include_spent_coins: bool) -> list[CoinRecord]:
|
|
217
|
+
# WARNING: this should only be used for testing or in a simulation,
|
|
218
|
+
# running it on a synced testnet or mainnet node will most likely result in an OOM error.
|
|
219
|
+
coins = set()
|
|
220
|
+
|
|
221
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
222
|
+
async with conn.execute(
|
|
223
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
224
|
+
f"coin_parent, amount, timestamp FROM coin_record "
|
|
225
|
+
f"{'' if include_spent_coins else 'INDEXED BY coin_spent_index WHERE spent_index=0'}"
|
|
226
|
+
f" ORDER BY confirmed_index"
|
|
227
|
+
) as cursor:
|
|
228
|
+
for row in await cursor.fetchall():
|
|
229
|
+
coin = self.row_to_coin(row)
|
|
230
|
+
coins.add(CoinRecord(coin, row[0], row[1], row[2], row[6]))
|
|
231
|
+
return list(coins)
|
|
232
|
+
|
|
233
|
+
# Checks DB and DiffStores for CoinRecords with puzzle_hash and returns them
|
|
234
|
+
async def get_coin_records_by_puzzle_hash(
|
|
235
|
+
self,
|
|
236
|
+
include_spent_coins: bool,
|
|
237
|
+
puzzle_hash: bytes32,
|
|
238
|
+
start_height: uint32 = uint32(0),
|
|
239
|
+
end_height: uint32 = uint32((2**32) - 1),
|
|
240
|
+
) -> list[CoinRecord]:
|
|
241
|
+
coins = set()
|
|
242
|
+
|
|
243
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
244
|
+
async with conn.execute(
|
|
245
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
246
|
+
f"coin_parent, amount, timestamp FROM coin_record INDEXED BY coin_puzzle_hash WHERE puzzle_hash=? "
|
|
247
|
+
f"AND confirmed_index>=? AND confirmed_index<? "
|
|
248
|
+
f"{'' if include_spent_coins else 'AND spent_index=0'}",
|
|
249
|
+
(puzzle_hash, start_height, end_height),
|
|
250
|
+
) as cursor:
|
|
251
|
+
for row in await cursor.fetchall():
|
|
252
|
+
coin = self.row_to_coin(row)
|
|
253
|
+
coins.add(CoinRecord(coin, row[0], row[1], row[2], row[6]))
|
|
254
|
+
return list(coins)
|
|
255
|
+
|
|
256
|
+
async def get_coin_records_by_puzzle_hashes(
|
|
257
|
+
self,
|
|
258
|
+
include_spent_coins: bool,
|
|
259
|
+
puzzle_hashes: list[bytes32],
|
|
260
|
+
start_height: uint32 = uint32(0),
|
|
261
|
+
end_height: uint32 = uint32((2**32) - 1),
|
|
262
|
+
) -> list[CoinRecord]:
|
|
263
|
+
if len(puzzle_hashes) == 0:
|
|
264
|
+
return []
|
|
265
|
+
|
|
266
|
+
coins = set()
|
|
267
|
+
puzzle_hashes_db: tuple[Any, ...]
|
|
268
|
+
puzzle_hashes_db = tuple(puzzle_hashes)
|
|
269
|
+
|
|
270
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
271
|
+
async with conn.execute(
|
|
272
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
273
|
+
f"coin_parent, amount, timestamp FROM coin_record INDEXED BY coin_puzzle_hash "
|
|
274
|
+
f'WHERE puzzle_hash in ({"?," * (len(puzzle_hashes) - 1)}?) '
|
|
275
|
+
f"AND confirmed_index>=? AND confirmed_index<? "
|
|
276
|
+
f"{'' if include_spent_coins else 'AND spent_index=0'}",
|
|
277
|
+
(*puzzle_hashes_db, start_height, end_height),
|
|
278
|
+
) as cursor:
|
|
279
|
+
for row in await cursor.fetchall():
|
|
280
|
+
coin = self.row_to_coin(row)
|
|
281
|
+
coins.add(CoinRecord(coin, row[0], row[1], row[2], row[6]))
|
|
282
|
+
return list(coins)
|
|
283
|
+
|
|
284
|
+
async def get_coin_records_by_names(
|
|
285
|
+
self,
|
|
286
|
+
include_spent_coins: bool,
|
|
287
|
+
names: list[bytes32],
|
|
288
|
+
start_height: uint32 = uint32(0),
|
|
289
|
+
end_height: uint32 = uint32((2**32) - 1),
|
|
290
|
+
) -> list[CoinRecord]:
|
|
291
|
+
if len(names) == 0:
|
|
292
|
+
return []
|
|
293
|
+
|
|
294
|
+
coins = set()
|
|
295
|
+
|
|
296
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
297
|
+
async with conn.execute(
|
|
298
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
299
|
+
f"coin_parent, amount, timestamp FROM coin_record INDEXED BY sqlite_autoindex_coin_record_1 "
|
|
300
|
+
f'WHERE coin_name in ({"?," * (len(names) - 1)}?) '
|
|
301
|
+
f"AND confirmed_index>=? AND confirmed_index<? "
|
|
302
|
+
f"{'' if include_spent_coins else 'AND spent_index=0'}",
|
|
303
|
+
[*names, start_height, end_height],
|
|
304
|
+
) as cursor:
|
|
305
|
+
for row in await cursor.fetchall():
|
|
306
|
+
coin = self.row_to_coin(row)
|
|
307
|
+
coins.add(CoinRecord(coin, row[0], row[1], row[2], row[6]))
|
|
308
|
+
|
|
309
|
+
return list(coins)
|
|
310
|
+
|
|
311
|
+
def row_to_coin(self, row: sqlite3.Row) -> Coin:
|
|
312
|
+
return Coin(bytes32(row[4]), bytes32(row[3]), uint64.from_bytes(row[5]))
|
|
313
|
+
|
|
314
|
+
def row_to_coin_state(self, row: sqlite3.Row) -> CoinState:
|
|
315
|
+
coin = self.row_to_coin(row)
|
|
316
|
+
spent_h = None
|
|
317
|
+
if row[1] != 0:
|
|
318
|
+
spent_h = row[1]
|
|
319
|
+
return CoinState(coin, spent_h, row[0])
|
|
320
|
+
|
|
321
|
+
async def get_coin_states_by_puzzle_hashes(
|
|
322
|
+
self,
|
|
323
|
+
include_spent_coins: bool,
|
|
324
|
+
puzzle_hashes: set[bytes32],
|
|
325
|
+
min_height: uint32 = uint32(0),
|
|
326
|
+
*,
|
|
327
|
+
max_items: int = 50000,
|
|
328
|
+
) -> set[CoinState]:
|
|
329
|
+
if len(puzzle_hashes) == 0:
|
|
330
|
+
return set()
|
|
331
|
+
|
|
332
|
+
coins: set[CoinState] = set()
|
|
333
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
334
|
+
for batch in to_batches(puzzle_hashes, SQLITE_MAX_VARIABLE_NUMBER):
|
|
335
|
+
puzzle_hashes_db: tuple[Any, ...] = tuple(batch.entries)
|
|
336
|
+
async with conn.execute(
|
|
337
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
338
|
+
f"coin_parent, amount, timestamp FROM coin_record INDEXED BY coin_puzzle_hash "
|
|
339
|
+
f'WHERE puzzle_hash in ({"?," * (len(batch.entries) - 1)}?) '
|
|
340
|
+
f"AND (confirmed_index>=? OR spent_index>=?)"
|
|
341
|
+
f"{'' if include_spent_coins else 'AND spent_index=0'}"
|
|
342
|
+
" LIMIT ?",
|
|
343
|
+
(*puzzle_hashes_db, min_height, min_height, max_items - len(coins)),
|
|
344
|
+
) as cursor:
|
|
345
|
+
row: sqlite3.Row
|
|
346
|
+
for row in await cursor.fetchall():
|
|
347
|
+
coins.add(self.row_to_coin_state(row))
|
|
348
|
+
|
|
349
|
+
if len(coins) >= max_items:
|
|
350
|
+
break
|
|
351
|
+
|
|
352
|
+
return coins
|
|
353
|
+
|
|
354
|
+
async def get_coin_records_by_parent_ids(
|
|
355
|
+
self,
|
|
356
|
+
include_spent_coins: bool,
|
|
357
|
+
parent_ids: list[bytes32],
|
|
358
|
+
start_height: uint32 = uint32(0),
|
|
359
|
+
end_height: uint32 = uint32((2**32) - 1),
|
|
360
|
+
) -> list[CoinRecord]:
|
|
361
|
+
if len(parent_ids) == 0:
|
|
362
|
+
return []
|
|
363
|
+
|
|
364
|
+
coins = set()
|
|
365
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
366
|
+
for batch in to_batches(parent_ids, SQLITE_MAX_VARIABLE_NUMBER):
|
|
367
|
+
parent_ids_db: tuple[Any, ...] = tuple(batch.entries)
|
|
368
|
+
async with conn.execute(
|
|
369
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, coin_parent, amount, timestamp "
|
|
370
|
+
f'FROM coin_record WHERE coin_parent in ({"?," * (len(batch.entries) - 1)}?) '
|
|
371
|
+
f"AND confirmed_index>=? AND confirmed_index<? "
|
|
372
|
+
f"{'' if include_spent_coins else 'AND spent_index=0'}",
|
|
373
|
+
(*parent_ids_db, start_height, end_height),
|
|
374
|
+
) as cursor:
|
|
375
|
+
async for row in cursor:
|
|
376
|
+
coin = self.row_to_coin(row)
|
|
377
|
+
coins.add(CoinRecord(coin, row[0], row[1], row[2], row[6]))
|
|
378
|
+
|
|
379
|
+
return list(coins)
|
|
380
|
+
|
|
381
|
+
async def get_coin_states_by_ids(
|
|
382
|
+
self,
|
|
383
|
+
include_spent_coins: bool,
|
|
384
|
+
coin_ids: Collection[bytes32],
|
|
385
|
+
min_height: uint32 = uint32(0),
|
|
386
|
+
*,
|
|
387
|
+
max_height: uint32 = uint32.MAXIMUM,
|
|
388
|
+
max_items: int = 50000,
|
|
389
|
+
) -> list[CoinState]:
|
|
390
|
+
if len(coin_ids) == 0:
|
|
391
|
+
return []
|
|
392
|
+
|
|
393
|
+
coins: list[CoinState] = []
|
|
394
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
395
|
+
for batch in to_batches(coin_ids, SQLITE_MAX_VARIABLE_NUMBER):
|
|
396
|
+
coin_ids_db: tuple[Any, ...] = tuple(batch.entries)
|
|
397
|
+
|
|
398
|
+
max_height_sql = ""
|
|
399
|
+
if max_height != uint32.MAXIMUM:
|
|
400
|
+
max_height_sql = f"AND confirmed_index<={max_height} AND spent_index<={max_height}"
|
|
401
|
+
|
|
402
|
+
async with conn.execute(
|
|
403
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, coin_parent, amount, timestamp "
|
|
404
|
+
f'FROM coin_record WHERE coin_name in ({"?," * (len(batch.entries) - 1)}?) '
|
|
405
|
+
f"AND (confirmed_index>=? OR spent_index>=?) {max_height_sql}"
|
|
406
|
+
f"{'' if include_spent_coins else 'AND spent_index=0'}"
|
|
407
|
+
" LIMIT ?",
|
|
408
|
+
(*coin_ids_db, min_height, min_height, max_items - len(coins)),
|
|
409
|
+
) as cursor:
|
|
410
|
+
for row in await cursor.fetchall():
|
|
411
|
+
coins.append(self.row_to_coin_state(row))
|
|
412
|
+
if len(coins) >= max_items:
|
|
413
|
+
break
|
|
414
|
+
|
|
415
|
+
return coins
|
|
416
|
+
|
|
417
|
+
MAX_PUZZLE_HASH_BATCH_SIZE = SQLITE_MAX_VARIABLE_NUMBER - 10
|
|
418
|
+
|
|
419
|
+
async def batch_coin_states_by_puzzle_hashes(
|
|
420
|
+
self,
|
|
421
|
+
puzzle_hashes: list[bytes32],
|
|
422
|
+
*,
|
|
423
|
+
min_height: uint32 = uint32(0),
|
|
424
|
+
include_spent: bool = True,
|
|
425
|
+
include_unspent: bool = True,
|
|
426
|
+
include_hinted: bool = True,
|
|
427
|
+
min_amount: uint64 = uint64(0),
|
|
428
|
+
max_items: int = 50000,
|
|
429
|
+
) -> tuple[list[CoinState], Optional[uint32]]:
|
|
430
|
+
"""
|
|
431
|
+
Returns the coin states, as well as the next block height (or `None` if finished).
|
|
432
|
+
You cannot exceed `CoinStore.MAX_PUZZLE_HASH_BATCH_SIZE` puzzle hashes in the query.
|
|
433
|
+
"""
|
|
434
|
+
|
|
435
|
+
# This should be able to be changed later without breaking the protocol.
|
|
436
|
+
# We have a small deduction for other variables to be added to the query.
|
|
437
|
+
assert len(puzzle_hashes) <= CoinStore.MAX_PUZZLE_HASH_BATCH_SIZE
|
|
438
|
+
|
|
439
|
+
if len(puzzle_hashes) == 0:
|
|
440
|
+
return [], None
|
|
441
|
+
|
|
442
|
+
# Coin states are keyed by coin id to filter out and prevent duplicates.
|
|
443
|
+
coin_states_dict: dict[bytes32, CoinState] = dict()
|
|
444
|
+
coin_states: list[CoinState]
|
|
445
|
+
|
|
446
|
+
async with self.db_wrapper.reader() as conn:
|
|
447
|
+
puzzle_hashes_db = tuple(puzzle_hashes)
|
|
448
|
+
puzzle_hash_count = len(puzzle_hashes_db)
|
|
449
|
+
|
|
450
|
+
require_spent = "spent_index>0"
|
|
451
|
+
require_unspent = "spent_index=0"
|
|
452
|
+
amount_filter = "AND amount>=? " if min_amount > 0 else ""
|
|
453
|
+
|
|
454
|
+
if include_spent and include_unspent:
|
|
455
|
+
height_filter = ""
|
|
456
|
+
elif include_spent:
|
|
457
|
+
height_filter = f"AND {require_spent}"
|
|
458
|
+
elif include_unspent:
|
|
459
|
+
height_filter = f"AND {require_unspent}"
|
|
460
|
+
else:
|
|
461
|
+
# There are no coins which are both spent and unspent, so we're finished.
|
|
462
|
+
return [], None
|
|
463
|
+
|
|
464
|
+
cursor = await conn.execute(
|
|
465
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
466
|
+
f"coin_parent, amount, timestamp FROM coin_record INDEXED BY coin_puzzle_hash "
|
|
467
|
+
f'WHERE puzzle_hash in ({"?," * (puzzle_hash_count - 1)}?) '
|
|
468
|
+
f"AND (confirmed_index>=? OR spent_index>=?) "
|
|
469
|
+
f"{height_filter} {amount_filter}"
|
|
470
|
+
f"ORDER BY MAX(confirmed_index, spent_index) ASC "
|
|
471
|
+
f"LIMIT ?",
|
|
472
|
+
(
|
|
473
|
+
puzzle_hashes_db
|
|
474
|
+
+ (min_height, min_height)
|
|
475
|
+
+ ((min_amount.to_bytes(8, "big"),) if min_amount > 0 else ())
|
|
476
|
+
+ (max_items + 1,)
|
|
477
|
+
),
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
for row in await cursor.fetchall():
|
|
481
|
+
coin_state = self.row_to_coin_state(row)
|
|
482
|
+
coin_states_dict[coin_state.coin.name()] = coin_state
|
|
483
|
+
|
|
484
|
+
if include_hinted:
|
|
485
|
+
cursor = await conn.execute(
|
|
486
|
+
f"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
487
|
+
f"coin_parent, amount, timestamp FROM coin_record INDEXED BY sqlite_autoindex_coin_record_1 "
|
|
488
|
+
f"WHERE coin_name IN (SELECT coin_id FROM hints "
|
|
489
|
+
f'WHERE hint IN ({"?," * (puzzle_hash_count - 1)}?)) '
|
|
490
|
+
f"AND (confirmed_index>=? OR spent_index>=?) "
|
|
491
|
+
f"{height_filter} {amount_filter}"
|
|
492
|
+
f"ORDER BY MAX(confirmed_index, spent_index) ASC "
|
|
493
|
+
f"LIMIT ?",
|
|
494
|
+
(
|
|
495
|
+
puzzle_hashes_db
|
|
496
|
+
+ (min_height, min_height)
|
|
497
|
+
+ ((min_amount.to_bytes(8, "big"),) if min_amount > 0 else ())
|
|
498
|
+
+ (max_items + 1,)
|
|
499
|
+
),
|
|
500
|
+
)
|
|
501
|
+
|
|
502
|
+
for row in await cursor.fetchall():
|
|
503
|
+
coin_state = self.row_to_coin_state(row)
|
|
504
|
+
coin_states_dict[coin_state.coin.name()] = coin_state
|
|
505
|
+
|
|
506
|
+
coin_states = list(coin_states_dict.values())
|
|
507
|
+
|
|
508
|
+
if include_hinted:
|
|
509
|
+
coin_states.sort(key=lambda cr: max(cr.created_height or uint32(0), cr.spent_height or uint32(0)))
|
|
510
|
+
while len(coin_states) > max_items + 1:
|
|
511
|
+
coin_states.pop()
|
|
512
|
+
|
|
513
|
+
# If there aren't too many coin states, we've finished syncing these hashes.
|
|
514
|
+
# There is no next height to start from, so return `None`.
|
|
515
|
+
if len(coin_states) <= max_items:
|
|
516
|
+
return coin_states, None
|
|
517
|
+
|
|
518
|
+
# The last item is the start of the next batch of coin states.
|
|
519
|
+
next_coin_state = coin_states.pop()
|
|
520
|
+
next_height = uint32(max(next_coin_state.created_height or 0, next_coin_state.spent_height or 0))
|
|
521
|
+
|
|
522
|
+
# In order to prevent blocks from being split up between batches, remove
|
|
523
|
+
# all coin states whose max height is the same as the last coin state's height.
|
|
524
|
+
while len(coin_states) > 0:
|
|
525
|
+
last_coin_state = coin_states[-1]
|
|
526
|
+
height = uint32(max(last_coin_state.created_height or 0, last_coin_state.spent_height or 0))
|
|
527
|
+
if height != next_height:
|
|
528
|
+
break
|
|
529
|
+
|
|
530
|
+
coin_states.pop()
|
|
531
|
+
|
|
532
|
+
return coin_states, next_height
|
|
533
|
+
|
|
534
|
+
async def rollback_to_block(self, block_index: int) -> list[CoinRecord]:
|
|
535
|
+
"""
|
|
536
|
+
Note that block_index can be negative, in which case everything is rolled back
|
|
537
|
+
Returns the list of coin records that have been modified
|
|
538
|
+
"""
|
|
539
|
+
|
|
540
|
+
coin_changes: dict[bytes32, CoinRecord] = {}
|
|
541
|
+
# Add coins that are confirmed in the reverted blocks to the list of updated coins.
|
|
542
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
543
|
+
async with conn.execute(
|
|
544
|
+
"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
545
|
+
"coin_parent, amount, timestamp FROM coin_record WHERE confirmed_index>?",
|
|
546
|
+
(block_index,),
|
|
547
|
+
) as cursor:
|
|
548
|
+
for row in await cursor.fetchall():
|
|
549
|
+
coin = self.row_to_coin(row)
|
|
550
|
+
record = CoinRecord(coin, uint32(0), row[1], row[2], uint64(0))
|
|
551
|
+
coin_changes[record.name] = record
|
|
552
|
+
|
|
553
|
+
# Delete reverted blocks from storage
|
|
554
|
+
await conn.execute("DELETE FROM coin_record WHERE confirmed_index>?", (block_index,))
|
|
555
|
+
|
|
556
|
+
# Add coins that are confirmed in the reverted blocks to the list of changed coins.
|
|
557
|
+
async with conn.execute(
|
|
558
|
+
"SELECT confirmed_index, spent_index, coinbase, puzzle_hash, "
|
|
559
|
+
"coin_parent, amount, timestamp FROM coin_record WHERE spent_index>?",
|
|
560
|
+
(block_index,),
|
|
561
|
+
) as cursor:
|
|
562
|
+
for row in await cursor.fetchall():
|
|
563
|
+
coin = self.row_to_coin(row)
|
|
564
|
+
record = CoinRecord(coin, row[0], uint32(0), row[2], row[6])
|
|
565
|
+
if record.name not in coin_changes:
|
|
566
|
+
coin_changes[record.name] = record
|
|
567
|
+
|
|
568
|
+
await conn.execute("UPDATE coin_record SET spent_index=0 WHERE spent_index>?", (block_index,))
|
|
569
|
+
self.coins_added_at_height_cache = LRUCache(self.coins_added_at_height_cache.capacity)
|
|
570
|
+
return list(coin_changes.values())
|
|
571
|
+
|
|
572
|
+
# Store CoinRecord in DB
|
|
573
|
+
async def _add_coin_records(self, records: list[CoinRecord]) -> None:
|
|
574
|
+
values2 = []
|
|
575
|
+
for record in records:
|
|
576
|
+
values2.append(
|
|
577
|
+
(
|
|
578
|
+
record.coin.name(),
|
|
579
|
+
record.confirmed_block_index,
|
|
580
|
+
record.spent_block_index,
|
|
581
|
+
int(record.coinbase),
|
|
582
|
+
record.coin.puzzle_hash,
|
|
583
|
+
record.coin.parent_coin_info,
|
|
584
|
+
uint64(record.coin.amount).stream_to_bytes(),
|
|
585
|
+
record.timestamp,
|
|
586
|
+
)
|
|
587
|
+
)
|
|
588
|
+
if len(values2) > 0:
|
|
589
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
590
|
+
await conn.executemany(
|
|
591
|
+
"INSERT INTO coin_record VALUES(?, ?, ?, ?, ?, ?, ?, ?)",
|
|
592
|
+
values2,
|
|
593
|
+
)
|
|
594
|
+
|
|
595
|
+
# Update coin_record to be spent in DB
|
|
596
|
+
async def _set_spent(self, coin_names: list[bytes32], index: uint32) -> None:
|
|
597
|
+
assert len(coin_names) == 0 or index > 0
|
|
598
|
+
|
|
599
|
+
if len(coin_names) == 0:
|
|
600
|
+
return None
|
|
601
|
+
|
|
602
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
603
|
+
rows_updated: int = 0
|
|
604
|
+
for batch in to_batches(coin_names, SQLITE_MAX_VARIABLE_NUMBER):
|
|
605
|
+
name_params = ",".join(["?"] * len(batch.entries))
|
|
606
|
+
ret: Cursor = await conn.execute(
|
|
607
|
+
f"UPDATE coin_record INDEXED BY sqlite_autoindex_coin_record_1 "
|
|
608
|
+
f"SET spent_index={index} "
|
|
609
|
+
f"WHERE spent_index=0 "
|
|
610
|
+
f"AND coin_name IN ({name_params})",
|
|
611
|
+
batch.entries,
|
|
612
|
+
)
|
|
613
|
+
rows_updated += ret.rowcount
|
|
614
|
+
if rows_updated != len(coin_names):
|
|
615
|
+
raise ValueError(
|
|
616
|
+
f"Invalid operation to set spent, total updates {rows_updated} expected {len(coin_names)}"
|
|
617
|
+
)
|
|
618
|
+
|
|
619
|
+
# Lookup the most recent unspent lineage that matches a puzzle hash
|
|
620
|
+
async def get_unspent_lineage_info_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[UnspentLineageInfo]:
|
|
621
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
622
|
+
async with conn.execute(
|
|
623
|
+
"SELECT unspent.coin_name, "
|
|
624
|
+
"unspent.amount, "
|
|
625
|
+
"unspent.coin_parent, "
|
|
626
|
+
"parent.amount, "
|
|
627
|
+
"parent.coin_parent "
|
|
628
|
+
"FROM coin_record AS unspent INDEXED BY coin_puzzle_hash "
|
|
629
|
+
"LEFT JOIN coin_record AS parent ON unspent.coin_parent = parent.coin_name "
|
|
630
|
+
"WHERE unspent.spent_index = 0 "
|
|
631
|
+
"AND parent.spent_index > 0 "
|
|
632
|
+
"AND unspent.puzzle_hash = ? "
|
|
633
|
+
"AND parent.puzzle_hash = unspent.puzzle_hash",
|
|
634
|
+
(puzzle_hash,),
|
|
635
|
+
) as cursor:
|
|
636
|
+
rows = list(await cursor.fetchall())
|
|
637
|
+
if len(rows) != 1:
|
|
638
|
+
log.debug("Expected 1 unspent with puzzle hash %s, but found %s", puzzle_hash.hex(), len(rows))
|
|
639
|
+
return None
|
|
640
|
+
coin_id, coin_amount, parent_id, parent_amount, parent_parent_id = rows[0]
|
|
641
|
+
return UnspentLineageInfo(
|
|
642
|
+
coin_id=bytes32(coin_id),
|
|
643
|
+
coin_amount=uint64(int_from_bytes(coin_amount)),
|
|
644
|
+
parent_id=bytes32(parent_id),
|
|
645
|
+
parent_amount=uint64(int_from_bytes(parent_amount)),
|
|
646
|
+
parent_parent_id=bytes32(parent_parent_id),
|
|
647
|
+
)
|