chia-blockchain 2.4.4__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 +197 -0
- chia/_tests/blockchain/config.py +4 -0
- chia/_tests/blockchain/test_augmented_chain.py +147 -0
- chia/_tests/blockchain/test_blockchain.py +4100 -0
- chia/_tests/blockchain/test_blockchain_transactions.py +1050 -0
- chia/_tests/blockchain/test_build_chains.py +61 -0
- chia/_tests/blockchain/test_get_block_generator.py +72 -0
- chia/_tests/blockchain/test_lookup_fork_chain.py +195 -0
- chia/_tests/build-init-files.py +93 -0
- chia/_tests/build-job-matrix.py +204 -0
- chia/_tests/check_pytest_monitor_output.py +34 -0
- chia/_tests/check_sql_statements.py +73 -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 +147 -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 +57 -0
- chia/_tests/clvm/test_program.py +150 -0
- chia/_tests/clvm/test_puzzle_compression.py +144 -0
- chia/_tests/clvm/test_puzzle_drivers.py +45 -0
- chia/_tests/clvm/test_puzzles.py +247 -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 +472 -0
- chia/_tests/cmds/config.py +3 -0
- chia/_tests/cmds/conftest.py +23 -0
- chia/_tests/cmds/test_click_types.py +195 -0
- chia/_tests/cmds/test_cmd_framework.py +400 -0
- chia/_tests/cmds/test_cmds_util.py +97 -0
- chia/_tests/cmds/test_daemon.py +92 -0
- chia/_tests/cmds/test_farm_cmd.py +67 -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 +153 -0
- chia/_tests/cmds/testing_classes.py +59 -0
- chia/_tests/cmds/wallet/__init__.py +0 -0
- chia/_tests/cmds/wallet/test_coins.py +195 -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 +470 -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 +376 -0
- chia/_tests/cmds/wallet/test_wallet.py +1126 -0
- chia/_tests/cmds/wallet/test_wallet_check.py +111 -0
- chia/_tests/conftest.py +1304 -0
- chia/_tests/connection_utils.py +124 -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 +56 -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 +109 -0
- chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
- chia/_tests/core/custom_types/test_spend_bundle.py +71 -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 +100 -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 +105 -0
- chia/_tests/core/data_layer/test_data_cli.py +57 -0
- chia/_tests/core/data_layer/test_data_layer.py +83 -0
- chia/_tests/core/data_layer/test_data_layer_util.py +219 -0
- chia/_tests/core/data_layer/test_data_rpc.py +3865 -0
- chia/_tests/core/data_layer/test_data_store.py +2423 -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 +232 -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 +101 -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 +448 -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 +488 -0
- chia/_tests/core/full_node/stores/test_coin_store.py +888 -0
- chia/_tests/core/full_node/stores/test_full_node_store.py +1215 -0
- chia/_tests/core/full_node/stores/test_hint_store.py +230 -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 +558 -0
- chia/_tests/core/full_node/test_full_node.py +2445 -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 +182 -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 +154 -0
- chia/_tests/core/large_block.py +2388 -0
- chia/_tests/core/make_block_generator.py +72 -0
- chia/_tests/core/mempool/__init__.py +0 -0
- chia/_tests/core/mempool/config.py +4 -0
- chia/_tests/core/mempool/test_mempool.py +3180 -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 +192 -0
- chia/_tests/core/mempool/test_mempool_manager.py +2054 -0
- chia/_tests/core/mempool/test_mempool_performance.py +65 -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 +82 -0
- chia/_tests/core/server/serve.py +132 -0
- chia/_tests/core/server/test_capabilities.py +68 -0
- chia/_tests/core/server/test_dos.py +320 -0
- chia/_tests/core/server/test_event_loop.py +109 -0
- chia/_tests/core/server/test_loop.py +290 -0
- chia/_tests/core/server/test_node_discovery.py +74 -0
- chia/_tests/core/server/test_rate_limits.py +370 -0
- chia/_tests/core/server/test_server.py +225 -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 +166 -0
- chia/_tests/core/ssl/__init__.py +0 -0
- chia/_tests/core/ssl/config.py +3 -0
- chia/_tests/core/ssl/test_ssl.py +198 -0
- chia/_tests/core/test_coins.py +33 -0
- chia/_tests/core/test_cost_calculation.py +314 -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 +129 -0
- chia/_tests/core/test_db_validation.py +161 -0
- chia/_tests/core/test_farmer_harvester_rpc.py +504 -0
- chia/_tests/core/test_filter.py +37 -0
- chia/_tests/core/test_full_node_rpc.py +794 -0
- chia/_tests/core/test_merkle_set.py +343 -0
- chia/_tests/core/test_program.py +49 -0
- chia/_tests/core/test_rpc_util.py +87 -0
- chia/_tests/core/test_seeder.py +308 -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 +514 -0
- chia/_tests/core/util/test_keyring_wrapper.py +490 -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 +565 -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 +368 -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 +130 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +501 -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 +145 -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 +218 -0
- chia/_tests/generator/test_generator_types.py +44 -0
- chia/_tests/generator/test_rom.py +182 -0
- chia/_tests/plot_sync/__init__.py +0 -0
- chia/_tests/plot_sync/config.py +3 -0
- chia/_tests/plot_sync/test_delta.py +102 -0
- chia/_tests/plot_sync/test_plot_sync.py +617 -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 +450 -0
- chia/_tests/plot_sync/util.py +67 -0
- chia/_tests/plotting/__init__.py +0 -0
- chia/_tests/plotting/config.py +3 -0
- chia/_tests/plotting/test_plot_manager.py +738 -0
- chia/_tests/plotting/util.py +13 -0
- chia/_tests/pools/__init__.py +0 -0
- chia/_tests/pools/config.py +5 -0
- chia/_tests/pools/test_pool_cmdline.py +23 -0
- chia/_tests/pools/test_pool_config.py +44 -0
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +398 -0
- chia/_tests/pools/test_pool_rpc.py +1010 -0
- chia/_tests/pools/test_pool_wallet.py +201 -0
- chia/_tests/pools/test_wallet_pool_store.py +161 -0
- chia/_tests/process_junit.py +349 -0
- chia/_tests/rpc/__init__.py +0 -0
- chia/_tests/rpc/test_rpc_client.py +81 -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 +234 -0
- chia/_tests/simulation/test_start_simulator.py +106 -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 +129 -0
- chia/_tests/util/__init__.py +0 -0
- chia/_tests/util/benchmark_cost.py +170 -0
- chia/_tests/util/benchmarks.py +154 -0
- chia/_tests/util/bip39_test_vectors.json +148 -0
- chia/_tests/util/blockchain.py +133 -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 +36 -0
- chia/_tests/util/full_sync.py +245 -0
- chia/_tests/util/gen_ssl_certs.py +115 -0
- chia/_tests/util/generator_tools_testing.py +47 -0
- chia/_tests/util/key_tool.py +37 -0
- chia/_tests/util/misc.py +722 -0
- chia/_tests/util/network_protocol_data.py +1074 -0
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +2700 -0
- chia/_tests/util/rpc.py +23 -0
- chia/_tests/util/run_block.py +163 -0
- chia/_tests/util/setup_nodes.py +479 -0
- chia/_tests/util/split_managers.py +99 -0
- chia/_tests/util/temp_file.py +14 -0
- chia/_tests/util/test_action_scope.py +143 -0
- chia/_tests/util/test_async_pool.py +366 -0
- chia/_tests/util/test_build_job_matrix.py +43 -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 +231 -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 +271 -0
- chia/_tests/util/test_installed.py +20 -0
- chia/_tests/util/test_limited_semaphore.py +52 -0
- chia/_tests/util/test_logging_filter.py +43 -0
- chia/_tests/util/test_misc.py +444 -0
- chia/_tests/util/test_network.py +74 -0
- chia/_tests/util/test_network_protocol_files.py +579 -0
- chia/_tests/util/test_network_protocol_json.py +266 -0
- chia/_tests/util/test_network_protocol_test.py +257 -0
- chia/_tests/util/test_paginator.py +72 -0
- chia/_tests/util/test_pprint.py +17 -0
- chia/_tests/util/test_priority_mutex.py +487 -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 +154 -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 +1738 -0
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
- chia/_tests/wallet/cat_wallet/test_trades.py +2578 -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 +80 -0
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
- chia/_tests/wallet/clawback/test_clawback_metadata.py +51 -0
- chia/_tests/wallet/config.py +4 -0
- chia/_tests/wallet/conftest.py +217 -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 +1322 -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 +143 -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 +1481 -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 +1492 -0
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1014 -0
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +376 -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 +2558 -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 +287 -0
- chia/_tests/wallet/rpc/test_wallet_rpc.py +3106 -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 +719 -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 +1529 -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_selection.py +589 -0
- chia/_tests/wallet/test_conditions.py +388 -0
- chia/_tests/wallet/test_debug_spend_bundle.py +76 -0
- chia/_tests/wallet/test_new_wallet_protocol.py +1176 -0
- chia/_tests/wallet/test_nft_store.py +193 -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 +133 -0
- chia/_tests/wallet/test_sign_coin_spends.py +159 -0
- chia/_tests/wallet/test_signer_protocol.py +948 -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 +941 -0
- chia/_tests/wallet/test_util.py +181 -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 +113 -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 +783 -0
- chia/_tests/wallet/test_wallet_retry.py +95 -0
- chia/_tests/wallet/test_wallet_state_manager.py +252 -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 +155 -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 +801 -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/clvm/__init__.py +0 -0
- chia/clvm/spend_sim.py +488 -0
- chia/cmds/__init__.py +0 -0
- chia/cmds/beta.py +183 -0
- chia/cmds/beta_funcs.py +133 -0
- chia/cmds/check_wallet_db.py +418 -0
- chia/cmds/chia.py +143 -0
- chia/cmds/cmd_classes.py +315 -0
- chia/cmds/cmds_util.py +498 -0
- chia/cmds/coin_funcs.py +260 -0
- chia/cmds/coins.py +220 -0
- chia/cmds/completion.py +49 -0
- chia/cmds/configure.py +331 -0
- chia/cmds/dao.py +1008 -0
- chia/cmds/dao_funcs.py +576 -0
- chia/cmds/data.py +707 -0
- chia/cmds/data_funcs.py +380 -0
- chia/cmds/db.py +86 -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 +16 -0
- chia/cmds/farm.py +87 -0
- chia/cmds/farm_funcs.py +207 -0
- chia/cmds/init.py +70 -0
- chia/cmds/init_funcs.py +367 -0
- chia/cmds/installers.py +129 -0
- chia/cmds/keys.py +510 -0
- chia/cmds/keys_funcs.py +864 -0
- chia/cmds/netspace.py +47 -0
- chia/cmds/netspace_funcs.py +53 -0
- chia/cmds/options.py +32 -0
- chia/cmds/param_types.py +228 -0
- chia/cmds/passphrase.py +130 -0
- chia/cmds/passphrase_funcs.py +346 -0
- chia/cmds/peer.py +50 -0
- chia/cmds/peer_funcs.py +129 -0
- chia/cmds/plotnft.py +206 -0
- chia/cmds/plotnft_funcs.py +374 -0
- chia/cmds/plots.py +222 -0
- chia/cmds/plotters.py +17 -0
- chia/cmds/rpc.py +188 -0
- chia/cmds/show.py +71 -0
- chia/cmds/show_funcs.py +214 -0
- chia/cmds/signer.py +304 -0
- chia/cmds/sim.py +217 -0
- chia/cmds/sim_funcs.py +509 -0
- chia/cmds/start.py +24 -0
- chia/cmds/start_funcs.py +112 -0
- chia/cmds/stop.py +61 -0
- chia/cmds/units.py +11 -0
- chia/cmds/wallet.py +1745 -0
- chia/cmds/wallet_funcs.py +1800 -0
- chia/consensus/__init__.py +0 -0
- chia/consensus/block_body_validation.py +515 -0
- chia/consensus/block_creation.py +525 -0
- chia/consensus/block_header_validation.py +1064 -0
- chia/consensus/block_record.py +32 -0
- chia/consensus/block_rewards.py +53 -0
- chia/consensus/block_root_validation.py +46 -0
- chia/consensus/blockchain.py +1100 -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 +90 -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 +26 -0
- chia/consensus/make_sub_epoch_summary.py +210 -0
- chia/consensus/multiprocess_validation.py +365 -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 +233 -0
- chia/daemon/keychain_proxy.py +501 -0
- chia/daemon/keychain_server.py +365 -0
- chia/daemon/server.py +1616 -0
- chia/daemon/windows_signal.py +56 -0
- chia/data_layer/__init__.py +0 -0
- chia/data_layer/data_layer.py +1303 -0
- chia/data_layer/data_layer_api.py +25 -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 +1315 -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 +108 -0
- chia/data_layer/util/plugin.py +41 -0
- chia/farmer/__init__.py +0 -0
- chia/farmer/farmer.py +920 -0
- chia/farmer/farmer_api.py +814 -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 +570 -0
- chia/full_node/bundle_tools.py +19 -0
- chia/full_node/coin_store.py +646 -0
- chia/full_node/fee_estimate.py +54 -0
- chia/full_node/fee_estimate_store.py +24 -0
- chia/full_node/fee_estimation.py +93 -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 +26 -0
- chia/full_node/fee_tracker.py +564 -0
- chia/full_node/full_node.py +3052 -0
- chia/full_node/full_node_api.py +1974 -0
- chia/full_node/full_node_store.py +1033 -0
- chia/full_node/hint_management.py +56 -0
- chia/full_node/hint_store.py +94 -0
- chia/full_node/mempool.py +583 -0
- chia/full_node/mempool_check_conditions.py +177 -0
- chia/full_node/mempool_manager.py +858 -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 +248 -0
- chia/full_node/sync_store.py +145 -0
- chia/full_node/tx_processing_queue.py +78 -0
- chia/full_node/weight_proof.py +1719 -0
- chia/harvester/__init__.py +0 -0
- chia/harvester/harvester.py +271 -0
- chia/harvester/harvester_api.py +374 -0
- chia/introducer/__init__.py +0 -0
- chia/introducer/introducer.py +120 -0
- chia/introducer/introducer_api.py +64 -0
- chia/legacy/__init__.py +0 -0
- chia/legacy/keyring.py +154 -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 +385 -0
- chia/plot_sync/sender.py +337 -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 +131 -0
- chia/plotting/__init__.py +0 -0
- chia/plotting/cache.py +212 -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 +324 -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 +926 -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 +26 -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 +7 -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 +75 -0
- chia/rpc/data_layer_rpc_api.py +639 -0
- chia/rpc/data_layer_rpc_client.py +188 -0
- chia/rpc/data_layer_rpc_util.py +62 -0
- chia/rpc/farmer_rpc_api.py +360 -0
- chia/rpc/farmer_rpc_client.py +86 -0
- chia/rpc/full_node_rpc_api.py +954 -0
- chia/rpc/full_node_rpc_client.py +292 -0
- chia/rpc/harvester_rpc_api.py +136 -0
- chia/rpc/harvester_rpc_client.py +54 -0
- chia/rpc/rpc_client.py +144 -0
- chia/rpc/rpc_server.py +447 -0
- chia/rpc/timelord_rpc_api.py +27 -0
- chia/rpc/util.py +293 -0
- chia/rpc/wallet_request_types.py +688 -0
- chia/rpc/wallet_rpc_api.py +4779 -0
- chia/rpc/wallet_rpc_client.py +1844 -0
- chia/seeder/__init__.py +0 -0
- chia/seeder/crawl_store.py +427 -0
- chia/seeder/crawler.py +423 -0
- chia/seeder/crawler_api.py +129 -0
- chia/seeder/dns_server.py +544 -0
- chia/seeder/peer_record.py +146 -0
- chia/seeder/start_crawler.py +88 -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 +11 -0
- chia/server/capabilities.py +24 -0
- chia/server/chia_policy.py +345 -0
- chia/server/introducer_peers.py +76 -0
- chia/server/node_discovery.py +718 -0
- chia/server/outbound_message.py +33 -0
- chia/server/rate_limit_numbers.py +204 -0
- chia/server/rate_limits.py +113 -0
- chia/server/server.py +720 -0
- chia/server/signal_handlers.py +117 -0
- chia/server/ssl_context.py +32 -0
- chia/server/start_data_layer.py +137 -0
- chia/server/start_farmer.py +86 -0
- chia/server/start_full_node.py +106 -0
- chia/server/start_harvester.py +80 -0
- chia/server/start_introducer.py +69 -0
- chia/server/start_service.py +328 -0
- chia/server/start_timelord.py +82 -0
- chia/server/start_wallet.py +109 -0
- chia/server/upnp.py +117 -0
- chia/server/ws_connection.py +752 -0
- chia/simulator/__init__.py +0 -0
- chia/simulator/block_tools.py +2053 -0
- chia/simulator/full_node_simulator.py +802 -0
- chia/simulator/keyring.py +128 -0
- chia/simulator/setup_services.py +505 -0
- chia/simulator/simulator_constants.py +13 -0
- chia/simulator/simulator_full_node_rpc_api.py +101 -0
- chia/simulator/simulator_full_node_rpc_client.py +62 -0
- chia/simulator/simulator_protocol.py +29 -0
- chia/simulator/simulator_test_tools.py +163 -0
- chia/simulator/socket.py +27 -0
- chia/simulator/ssl_certs.py +114 -0
- chia/simulator/ssl_certs_1.py +699 -0
- chia/simulator/ssl_certs_10.py +699 -0
- chia/simulator/ssl_certs_2.py +699 -0
- chia/simulator/ssl_certs_3.py +699 -0
- chia/simulator/ssl_certs_4.py +699 -0
- chia/simulator/ssl_certs_5.py +699 -0
- chia/simulator/ssl_certs_6.py +699 -0
- chia/simulator/ssl_certs_7.py +699 -0
- chia/simulator/ssl_certs_8.py +699 -0
- chia/simulator/ssl_certs_9.py +699 -0
- chia/simulator/start_simulator.py +135 -0
- chia/simulator/wallet_tools.py +245 -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 +1202 -0
- chia/timelord/timelord_api.py +132 -0
- chia/timelord/timelord_launcher.py +188 -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 +270 -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 +17 -0
- chia/types/eligible_coin_spends.py +364 -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 +14 -0
- chia/types/header_block.py +5 -0
- chia/types/internal_mempool_item.py +19 -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 +31 -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/weight_proof.py +50 -0
- chia/util/__init__.py +0 -0
- chia/util/action_scope.py +168 -0
- chia/util/api_decorators.py +89 -0
- chia/util/async_pool.py +224 -0
- chia/util/augmented_chain.py +130 -0
- chia/util/batches.py +39 -0
- chia/util/bech32m.py +123 -0
- chia/util/beta_metrics.py +118 -0
- chia/util/block_cache.py +56 -0
- chia/util/byte_types.py +10 -0
- chia/util/check_fork_next_block.py +32 -0
- chia/util/chia_logging.py +124 -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 +366 -0
- chia/util/cpu.py +20 -0
- chia/util/db_synchronous.py +21 -0
- chia/util/db_version.py +30 -0
- chia/util/db_wrapper.py +427 -0
- chia/util/default_root.py +10 -0
- chia/util/dump_keyring.py +93 -0
- chia/util/english.txt +2048 -0
- chia/util/errors.py +351 -0
- chia/util/file_keyring.py +480 -0
- chia/util/files.py +95 -0
- chia/util/full_block_utils.py +321 -0
- chia/util/generator_tools.py +62 -0
- chia/util/hash.py +29 -0
- chia/util/initial-config.yaml +675 -0
- chia/util/inline_executor.py +24 -0
- chia/util/ints.py +19 -0
- chia/util/json_util.py +41 -0
- chia/util/keychain.py +673 -0
- chia/util/keyring_wrapper.py +266 -0
- chia/util/limited_semaphore.py +39 -0
- chia/util/lock.py +47 -0
- chia/util/log_exceptions.py +29 -0
- chia/util/logging.py +34 -0
- chia/util/lru_cache.py +29 -0
- chia/util/math.py +20 -0
- chia/util/network.py +240 -0
- chia/util/paginator.py +46 -0
- chia/util/path.py +29 -0
- chia/util/permissions.py +19 -0
- chia/util/pprint.py +40 -0
- chia/util/prev_transaction_block.py +23 -0
- chia/util/priority_mutex.py +92 -0
- chia/util/profiler.py +194 -0
- chia/util/recursive_replace.py +22 -0
- chia/util/safe_cancel_task.py +14 -0
- chia/util/service_groups.py +47 -0
- chia/util/setproctitle.py +20 -0
- chia/util/significant_bits.py +30 -0
- chia/util/ssl_check.py +213 -0
- chia/util/streamable.py +654 -0
- chia/util/task_timing.py +378 -0
- chia/util/timing.py +64 -0
- chia/util/vdf_prover.py +31 -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 +163 -0
- chia/wallet/cat_wallet/cat_wallet.py +869 -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 +1326 -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 +810 -0
- chia/wallet/dao_wallet/dao_wallet.py +2121 -0
- chia/wallet/db_wallet/__init__.py +0 -0
- chia/wallet/db_wallet/db_wallet_puzzles.py +107 -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 +1485 -0
- chia/wallet/did_wallet/did_wallet_puzzles.py +220 -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 +1686 -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 +34 -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 +162 -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 +27 -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 +22 -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 +35 -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 +161 -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 +22 -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 +28 -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 +295 -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 +344 -0
- chia/wallet/puzzles/singleton_truths.clib +21 -0
- chia/wallet/puzzles/tails.py +344 -0
- chia/wallet/puzzles/utility_macros.clib +48 -0
- chia/wallet/signer_protocol.py +126 -0
- chia/wallet/singleton.py +106 -0
- chia/wallet/singleton_record.py +30 -0
- chia/wallet/trade_manager.py +1088 -0
- chia/wallet/trade_record.py +67 -0
- chia/wallet/trading/__init__.py +0 -0
- chia/wallet/trading/offer.py +703 -0
- chia/wallet/trading/trade_status.py +13 -0
- chia/wallet/trading/trade_store.py +526 -0
- chia/wallet/transaction_record.py +143 -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 +168 -0
- chia/wallet/util/clvm_streamable.py +203 -0
- chia/wallet/util/compute_hints.py +66 -0
- chia/wallet/util/compute_memos.py +45 -0
- chia/wallet/util/curry_and_treehash.py +90 -0
- chia/wallet/util/debug_spend_bundle.py +234 -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/puzzle_compression.py +96 -0
- chia/wallet/util/puzzle_decorator.py +100 -0
- chia/wallet/util/puzzle_decorator_type.py +7 -0
- chia/wallet/util/query_filter.py +60 -0
- chia/wallet/util/transaction_type.py +23 -0
- chia/wallet/util/tx_config.py +158 -0
- chia/wallet/util/wallet_sync_utils.py +348 -0
- chia/wallet/util/wallet_types.py +65 -0
- chia/wallet/vc_wallet/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +663 -0
- chia/wallet/vc_wallet/cr_cat_wallet.py +875 -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 +95 -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 +36 -0
- chia/wallet/wallet_interested_store.py +188 -0
- chia/wallet/wallet_nft_store.py +279 -0
- chia/wallet/wallet_node.py +1769 -0
- chia/wallet/wallet_node_api.py +201 -0
- chia/wallet/wallet_pool_store.py +120 -0
- chia/wallet/wallet_protocol.py +90 -0
- chia/wallet/wallet_puzzle_store.py +365 -0
- chia/wallet/wallet_retry_store.py +70 -0
- chia/wallet/wallet_singleton_store.py +258 -0
- chia/wallet/wallet_spend_bundle.py +41 -0
- chia/wallet/wallet_state_manager.py +2820 -0
- chia/wallet/wallet_transaction_store.py +470 -0
- chia/wallet/wallet_user_store.py +110 -0
- chia/wallet/wallet_weight_proof_handler.py +126 -0
- chia_blockchain-2.4.4.dist-info/LICENSE +201 -0
- chia_blockchain-2.4.4.dist-info/METADATA +161 -0
- chia_blockchain-2.4.4.dist-info/RECORD +1028 -0
- chia_blockchain-2.4.4.dist-info/WHEEL +4 -0
- chia_blockchain-2.4.4.dist-info/entry_points.txt +17 -0
- mozilla-ca/cacert.pem +3666 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import logging
|
|
5
|
+
from typing import Dict, List, Optional, Set
|
|
6
|
+
|
|
7
|
+
from chia_rs import G1Element
|
|
8
|
+
|
|
9
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
10
|
+
from chia.util.db_wrapper import DBWrapper2, execute_fetchone
|
|
11
|
+
from chia.util.ints import uint32
|
|
12
|
+
from chia.util.lru_cache import LRUCache
|
|
13
|
+
from chia.wallet.derivation_record import DerivationRecord
|
|
14
|
+
from chia.wallet.util.wallet_types import WalletIdentifier, WalletType
|
|
15
|
+
|
|
16
|
+
log = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class WalletPuzzleStore:
|
|
20
|
+
"""
|
|
21
|
+
WalletPuzzleStore keeps track of all generated puzzle_hashes and their derivation path / wallet.
|
|
22
|
+
This is only used for HD wallets where each address is derived from a public key. Otherwise, use the
|
|
23
|
+
WalletInterestedStore to keep track of puzzle hashes which we are interested in.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
lock: asyncio.Lock
|
|
27
|
+
db_wrapper: DBWrapper2
|
|
28
|
+
wallet_identifier_cache: LRUCache
|
|
29
|
+
# maps wallet_id -> last_derivation_index
|
|
30
|
+
last_wallet_derivation_index: Dict[uint32, uint32]
|
|
31
|
+
last_derivation_index: Optional[uint32]
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
async def create(cls, db_wrapper: DBWrapper2):
|
|
35
|
+
self = cls()
|
|
36
|
+
self.db_wrapper = db_wrapper
|
|
37
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
38
|
+
await conn.execute(
|
|
39
|
+
"CREATE TABLE IF NOT EXISTS derivation_paths("
|
|
40
|
+
"derivation_index int,"
|
|
41
|
+
" pubkey text,"
|
|
42
|
+
" puzzle_hash text,"
|
|
43
|
+
" wallet_type int,"
|
|
44
|
+
" wallet_id int,"
|
|
45
|
+
" used tinyint,"
|
|
46
|
+
" hardened tinyint,"
|
|
47
|
+
" PRIMARY KEY(puzzle_hash, wallet_id))"
|
|
48
|
+
)
|
|
49
|
+
await conn.execute(
|
|
50
|
+
"CREATE INDEX IF NOT EXISTS derivation_index_index on derivation_paths(derivation_index)"
|
|
51
|
+
)
|
|
52
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS pubkey on derivation_paths(pubkey)")
|
|
53
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS ph on derivation_paths(puzzle_hash)")
|
|
54
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS wallet_type on derivation_paths(wallet_type)")
|
|
55
|
+
# Remove an old, misnamed, redundant index on `wallet_type`
|
|
56
|
+
# See https://github.com/Chia-Network/chia-blockchain/issues/10276
|
|
57
|
+
await conn.execute("DROP INDEX IF EXISTS used")
|
|
58
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS derivation_paths_wallet_id on derivation_paths(wallet_id)")
|
|
59
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS derivation_paths_used_index on derivation_paths(used)")
|
|
60
|
+
await conn.execute(
|
|
61
|
+
"CREATE INDEX IF NOT EXISTS derivation_paths_hardened_index on derivation_paths(hardened)"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
# the lock is locked by the users of this class
|
|
65
|
+
self.lock = asyncio.Lock()
|
|
66
|
+
self.wallet_identifier_cache = LRUCache(100)
|
|
67
|
+
self.last_derivation_index = None
|
|
68
|
+
self.last_wallet_derivation_index = {}
|
|
69
|
+
return self
|
|
70
|
+
|
|
71
|
+
async def add_derivation_paths(self, records: List[DerivationRecord]) -> None:
|
|
72
|
+
"""
|
|
73
|
+
Insert many derivation paths into the database.
|
|
74
|
+
"""
|
|
75
|
+
if len(records) == 0:
|
|
76
|
+
return
|
|
77
|
+
sql_records = []
|
|
78
|
+
for record in records:
|
|
79
|
+
log.debug("Adding derivation record: %s", record)
|
|
80
|
+
if record.hardened:
|
|
81
|
+
hardened = 1
|
|
82
|
+
else:
|
|
83
|
+
hardened = 0
|
|
84
|
+
sql_records.append(
|
|
85
|
+
(
|
|
86
|
+
record.index,
|
|
87
|
+
bytes(record.pubkey).hex(),
|
|
88
|
+
record.puzzle_hash.hex(),
|
|
89
|
+
record.wallet_type,
|
|
90
|
+
record.wallet_id,
|
|
91
|
+
0,
|
|
92
|
+
hardened,
|
|
93
|
+
),
|
|
94
|
+
)
|
|
95
|
+
self.last_derivation_index = (
|
|
96
|
+
record.index if self.last_derivation_index is None else max(self.last_derivation_index, record.index)
|
|
97
|
+
)
|
|
98
|
+
if record.wallet_id not in self.last_wallet_derivation_index:
|
|
99
|
+
self.last_wallet_derivation_index[record.wallet_id] = record.index
|
|
100
|
+
else:
|
|
101
|
+
self.last_wallet_derivation_index[record.wallet_id] = max(
|
|
102
|
+
self.last_wallet_derivation_index[record.wallet_id], record.index
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
106
|
+
await (
|
|
107
|
+
await conn.executemany(
|
|
108
|
+
"INSERT OR REPLACE INTO derivation_paths VALUES(?, ?, ?, ?, ?, ?, ?)",
|
|
109
|
+
sql_records,
|
|
110
|
+
)
|
|
111
|
+
).close()
|
|
112
|
+
|
|
113
|
+
async def get_derivation_record(
|
|
114
|
+
self, index: uint32, wallet_id: uint32, hardened: bool
|
|
115
|
+
) -> Optional[DerivationRecord]:
|
|
116
|
+
"""
|
|
117
|
+
Returns the derivation record by index and wallet id.
|
|
118
|
+
"""
|
|
119
|
+
if hardened:
|
|
120
|
+
hard = 1
|
|
121
|
+
else:
|
|
122
|
+
hard = 0
|
|
123
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
124
|
+
row = await execute_fetchone(
|
|
125
|
+
conn,
|
|
126
|
+
"SELECT derivation_index, pubkey, puzzle_hash, wallet_type, wallet_id, used FROM derivation_paths "
|
|
127
|
+
"WHERE derivation_index=? AND wallet_id=? AND hardened=?",
|
|
128
|
+
(index, wallet_id, hard),
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
if row is not None and row[0] is not None:
|
|
132
|
+
return self.row_to_record(row)
|
|
133
|
+
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
async def get_derivation_record_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[DerivationRecord]:
|
|
137
|
+
"""
|
|
138
|
+
Returns the derivation record by index and wallet id.
|
|
139
|
+
"""
|
|
140
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
141
|
+
row = await execute_fetchone(
|
|
142
|
+
conn,
|
|
143
|
+
"SELECT derivation_index, pubkey, puzzle_hash, wallet_type, wallet_id, hardened FROM derivation_paths "
|
|
144
|
+
"WHERE puzzle_hash=?",
|
|
145
|
+
(puzzle_hash.hex(),),
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
if row is not None and row[0] is not None:
|
|
149
|
+
return self.row_to_record(row)
|
|
150
|
+
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
async def set_used_up_to(self, index: uint32) -> None:
|
|
154
|
+
"""
|
|
155
|
+
Sets a derivation path to used so we don't use it again.
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
159
|
+
await conn.execute_insert(
|
|
160
|
+
"UPDATE derivation_paths SET used=1 WHERE derivation_index<=?",
|
|
161
|
+
(index,),
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
async def puzzle_hash_exists(self, puzzle_hash: bytes32) -> bool:
|
|
165
|
+
"""
|
|
166
|
+
Checks if passed puzzle_hash is present in the db.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
170
|
+
row = await execute_fetchone(
|
|
171
|
+
conn, "SELECT puzzle_hash FROM derivation_paths WHERE puzzle_hash=?", (puzzle_hash.hex(),)
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
return row is not None
|
|
175
|
+
|
|
176
|
+
def row_to_record(self, row) -> DerivationRecord:
|
|
177
|
+
return DerivationRecord(
|
|
178
|
+
uint32(row[0]),
|
|
179
|
+
bytes32.fromhex(row[2]),
|
|
180
|
+
G1Element.from_bytes(bytes.fromhex(row[1])),
|
|
181
|
+
WalletType(row[3]),
|
|
182
|
+
uint32(row[4]),
|
|
183
|
+
bool(row[5]),
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
async def index_for_pubkey(self, pubkey: G1Element) -> Optional[uint32]:
|
|
187
|
+
"""
|
|
188
|
+
Returns derivation paths for the given pubkey.
|
|
189
|
+
Returns None if not present.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
193
|
+
row = await execute_fetchone(
|
|
194
|
+
conn, "SELECT derivation_index FROM derivation_paths WHERE pubkey=?", (bytes(pubkey).hex(),)
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
if row is not None:
|
|
198
|
+
return uint32(row[0])
|
|
199
|
+
|
|
200
|
+
return None
|
|
201
|
+
|
|
202
|
+
async def record_for_pubkey(self, pubkey: G1Element) -> Optional[DerivationRecord]:
|
|
203
|
+
"""
|
|
204
|
+
Returns derivation record for the given pubkey.
|
|
205
|
+
Returns None if not present.
|
|
206
|
+
"""
|
|
207
|
+
|
|
208
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
209
|
+
row = await execute_fetchone(
|
|
210
|
+
conn,
|
|
211
|
+
"SELECT derivation_index, pubkey, puzzle_hash, wallet_type, wallet_id, hardened "
|
|
212
|
+
"FROM derivation_paths "
|
|
213
|
+
"WHERE pubkey=?",
|
|
214
|
+
(bytes(pubkey).hex(),),
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
return None if row is None else self.row_to_record(row)
|
|
218
|
+
|
|
219
|
+
async def index_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[uint32]:
|
|
220
|
+
"""
|
|
221
|
+
Returns the derivation path for the puzzle_hash.
|
|
222
|
+
Returns None if not present.
|
|
223
|
+
"""
|
|
224
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
225
|
+
row = await execute_fetchone(
|
|
226
|
+
conn, "SELECT derivation_index FROM derivation_paths WHERE puzzle_hash=?", (puzzle_hash.hex(),)
|
|
227
|
+
)
|
|
228
|
+
return None if row is None else uint32(row[0])
|
|
229
|
+
|
|
230
|
+
async def record_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[DerivationRecord]:
|
|
231
|
+
"""
|
|
232
|
+
Returns the derivation path for the puzzle_hash.
|
|
233
|
+
Returns None if not present.
|
|
234
|
+
"""
|
|
235
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
236
|
+
row = await execute_fetchone(
|
|
237
|
+
conn,
|
|
238
|
+
"SELECT derivation_index, pubkey, puzzle_hash, wallet_type, wallet_id, hardened "
|
|
239
|
+
"FROM derivation_paths "
|
|
240
|
+
"WHERE puzzle_hash=?",
|
|
241
|
+
(puzzle_hash.hex(),),
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
if row is not None and row[0] is not None:
|
|
245
|
+
return self.row_to_record(row)
|
|
246
|
+
|
|
247
|
+
return None
|
|
248
|
+
|
|
249
|
+
async def get_wallet_identifier_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[WalletIdentifier]:
|
|
250
|
+
"""
|
|
251
|
+
Returns the derivation path for the puzzle_hash.
|
|
252
|
+
Returns None if not present.
|
|
253
|
+
"""
|
|
254
|
+
cached = self.wallet_identifier_cache.get(puzzle_hash)
|
|
255
|
+
if cached is not None:
|
|
256
|
+
return cached
|
|
257
|
+
|
|
258
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
259
|
+
row = await execute_fetchone(
|
|
260
|
+
conn, "SELECT wallet_type, wallet_id FROM derivation_paths WHERE puzzle_hash=?", (puzzle_hash.hex(),)
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
if row is not None:
|
|
264
|
+
wallet_identifier = WalletIdentifier(uint32(row[1]), WalletType(row[0]))
|
|
265
|
+
self.wallet_identifier_cache.put(puzzle_hash, wallet_identifier)
|
|
266
|
+
return wallet_identifier
|
|
267
|
+
|
|
268
|
+
return None
|
|
269
|
+
|
|
270
|
+
async def get_all_puzzle_hashes(self, wallet_id: Optional[int] = None) -> Set[bytes32]:
|
|
271
|
+
"""
|
|
272
|
+
Return a set containing all puzzle_hashes we generated.
|
|
273
|
+
"""
|
|
274
|
+
|
|
275
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
276
|
+
if wallet_id is None:
|
|
277
|
+
rows = await conn.execute_fetchall("SELECT puzzle_hash FROM derivation_paths")
|
|
278
|
+
else:
|
|
279
|
+
rows = await conn.execute_fetchall(
|
|
280
|
+
"SELECT puzzle_hash FROM derivation_paths WHERE wallet_id=?", (wallet_id,)
|
|
281
|
+
)
|
|
282
|
+
return {bytes32.fromhex(row[0]) for row in rows}
|
|
283
|
+
|
|
284
|
+
async def get_last_derivation_path(self) -> Optional[uint32]:
|
|
285
|
+
"""
|
|
286
|
+
Returns the last derivation path by derivation_index.
|
|
287
|
+
"""
|
|
288
|
+
if self.last_derivation_index is not None:
|
|
289
|
+
return self.last_derivation_index
|
|
290
|
+
|
|
291
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
292
|
+
row = await execute_fetchone(conn, "SELECT MAX(derivation_index) FROM derivation_paths")
|
|
293
|
+
last_derivation_index = None if row is None or row[0] is None else uint32(row[0])
|
|
294
|
+
self.last_derivation_index = last_derivation_index
|
|
295
|
+
return self.last_derivation_index
|
|
296
|
+
|
|
297
|
+
async def get_last_derivation_path_for_wallet(self, wallet_id: int) -> Optional[uint32]:
|
|
298
|
+
"""
|
|
299
|
+
Returns the last derivation path by derivation_index.
|
|
300
|
+
"""
|
|
301
|
+
cached_derivation_index: Optional[uint32] = self.last_wallet_derivation_index.get(uint32(wallet_id))
|
|
302
|
+
if cached_derivation_index is not None:
|
|
303
|
+
return cached_derivation_index
|
|
304
|
+
|
|
305
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
306
|
+
row = await execute_fetchone(
|
|
307
|
+
conn, "SELECT MAX(derivation_index) FROM derivation_paths WHERE wallet_id=?", (wallet_id,)
|
|
308
|
+
)
|
|
309
|
+
derivation_index = None if row is None or row[0] is None else uint32(row[0])
|
|
310
|
+
if derivation_index is not None:
|
|
311
|
+
self.last_wallet_derivation_index[uint32(wallet_id)] = derivation_index
|
|
312
|
+
return derivation_index
|
|
313
|
+
|
|
314
|
+
async def get_current_derivation_record_for_wallet(self, wallet_id: uint32) -> Optional[DerivationRecord]:
|
|
315
|
+
"""
|
|
316
|
+
Returns the current derivation record by derivation_index.
|
|
317
|
+
"""
|
|
318
|
+
|
|
319
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
320
|
+
row = await execute_fetchone(
|
|
321
|
+
conn,
|
|
322
|
+
"SELECT MAX(derivation_index) FROM derivation_paths WHERE wallet_id=? AND used=1 AND hardened=0",
|
|
323
|
+
(wallet_id,),
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
if row is not None and row[0] is not None:
|
|
327
|
+
index = uint32(row[0])
|
|
328
|
+
return await self.get_derivation_record(index, wallet_id, False)
|
|
329
|
+
|
|
330
|
+
return None
|
|
331
|
+
|
|
332
|
+
async def get_unused_derivation_path(self) -> Optional[uint32]:
|
|
333
|
+
"""
|
|
334
|
+
Returns the first unused derivation path by derivation_index.
|
|
335
|
+
"""
|
|
336
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
337
|
+
row = await execute_fetchone(
|
|
338
|
+
conn, "SELECT MIN(derivation_index) FROM derivation_paths WHERE used=0 AND hardened=0;"
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
if row is not None and row[0] is not None:
|
|
342
|
+
return uint32(row[0])
|
|
343
|
+
|
|
344
|
+
return None
|
|
345
|
+
|
|
346
|
+
async def delete_wallet(self, wallet_id: uint32) -> None:
|
|
347
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
348
|
+
# First fetch all puzzle hashes since we need them to drop them from the cache
|
|
349
|
+
rows = await conn.execute_fetchall(
|
|
350
|
+
"SELECT puzzle_hash FROM derivation_paths WHERE wallet_id=?", (wallet_id,)
|
|
351
|
+
)
|
|
352
|
+
cursor = await conn.execute("DELETE FROM derivation_paths WHERE wallet_id=?;", (wallet_id,))
|
|
353
|
+
await cursor.close()
|
|
354
|
+
# Clear caches
|
|
355
|
+
puzzle_hashes = {bytes32.fromhex(row[0]) for row in rows}
|
|
356
|
+
for puzzle_hash in puzzle_hashes:
|
|
357
|
+
try:
|
|
358
|
+
self.wallet_identifier_cache.remove(puzzle_hash)
|
|
359
|
+
except KeyError:
|
|
360
|
+
pass
|
|
361
|
+
try:
|
|
362
|
+
self.last_wallet_derivation_index.pop(wallet_id)
|
|
363
|
+
except KeyError:
|
|
364
|
+
pass
|
|
365
|
+
self.last_derivation_index = None
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional, Tuple
|
|
4
|
+
|
|
5
|
+
from chia_rs import CoinState
|
|
6
|
+
|
|
7
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
8
|
+
from chia.util.db_wrapper import DBWrapper2
|
|
9
|
+
from chia.util.ints import uint32
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class WalletRetryStore:
|
|
13
|
+
"""
|
|
14
|
+
Persistent coin states that we have received but failed to add
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
db_wrapper: DBWrapper2
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
async def create(cls, db_wrapper: DBWrapper2) -> WalletRetryStore:
|
|
21
|
+
self = cls()
|
|
22
|
+
self.db_wrapper = db_wrapper
|
|
23
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
24
|
+
await conn.execute(
|
|
25
|
+
"CREATE TABLE IF NOT EXISTS retry_store("
|
|
26
|
+
" coin_state blob PRIMARY KEY,"
|
|
27
|
+
" peer blob,"
|
|
28
|
+
" fork_height int)"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
return self
|
|
32
|
+
|
|
33
|
+
async def get_all_states_to_retry(self) -> List[Tuple[CoinState, bytes32, uint32]]:
|
|
34
|
+
"""
|
|
35
|
+
Return all states that were failed to sync
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
39
|
+
rows = await conn.execute_fetchall("SELECT * from retry_store")
|
|
40
|
+
|
|
41
|
+
return [(CoinState.from_bytes(row[0]), bytes32(row[1]), uint32(row[2])) for row in rows]
|
|
42
|
+
|
|
43
|
+
async def add_state(self, state: CoinState, peer_id: bytes32, fork_height: Optional[uint32]) -> None:
|
|
44
|
+
"""
|
|
45
|
+
Adds object to key val store. Obj MUST support __bytes__ and bytes() methods.
|
|
46
|
+
"""
|
|
47
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
48
|
+
cursor = await conn.execute(
|
|
49
|
+
"INSERT OR IGNORE INTO retry_store VALUES(?, ?, ?)",
|
|
50
|
+
(bytes(state), peer_id, 0 if fork_height is None else fork_height),
|
|
51
|
+
)
|
|
52
|
+
await cursor.close()
|
|
53
|
+
|
|
54
|
+
async def remove_state(self, state: CoinState) -> None:
|
|
55
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
56
|
+
cursor = await conn.execute("DELETE FROM retry_store where coin_state=?", (bytes(state),))
|
|
57
|
+
await cursor.close()
|
|
58
|
+
|
|
59
|
+
async def rollback_to_block(self, height: int) -> None:
|
|
60
|
+
"""
|
|
61
|
+
Delete all ignored states above a certain height
|
|
62
|
+
:param height: Reorg height
|
|
63
|
+
:return None:
|
|
64
|
+
"""
|
|
65
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
66
|
+
cursor = await conn.execute(
|
|
67
|
+
"DELETE from retry_store WHERE fork_height>?",
|
|
68
|
+
(height,),
|
|
69
|
+
)
|
|
70
|
+
await cursor.close()
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import logging
|
|
5
|
+
from sqlite3 import Row
|
|
6
|
+
from typing import List, Optional, Type, TypeVar, Union
|
|
7
|
+
|
|
8
|
+
from clvm.casts import int_from_bytes
|
|
9
|
+
|
|
10
|
+
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
11
|
+
from chia.types.blockchain_format.coin import Coin
|
|
12
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
13
|
+
from chia.types.coin_spend import CoinSpend
|
|
14
|
+
from chia.types.condition_opcodes import ConditionOpcode
|
|
15
|
+
from chia.util.condition_tools import conditions_dict_for_solution
|
|
16
|
+
from chia.util.db_wrapper import DBWrapper2, execute_fetchone
|
|
17
|
+
from chia.util.ints import uint32, uint64
|
|
18
|
+
from chia.wallet import singleton
|
|
19
|
+
from chia.wallet.lineage_proof import LineageProof
|
|
20
|
+
from chia.wallet.singleton import get_inner_puzzle_from_singleton, get_singleton_id_from_puzzle
|
|
21
|
+
from chia.wallet.singleton_record import SingletonRecord
|
|
22
|
+
|
|
23
|
+
log = logging.getLogger(__name__)
|
|
24
|
+
_T_WalletSingletonStore = TypeVar("_T_WalletSingletonStore", bound="WalletSingletonStore")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class WalletSingletonStore:
|
|
28
|
+
db_wrapper: DBWrapper2
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
async def create(cls: Type[_T_WalletSingletonStore], wrapper: DBWrapper2) -> _T_WalletSingletonStore:
|
|
32
|
+
self = cls()
|
|
33
|
+
self.db_wrapper = wrapper
|
|
34
|
+
|
|
35
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
36
|
+
await conn.execute(
|
|
37
|
+
"CREATE TABLE IF NOT EXISTS singletons("
|
|
38
|
+
"coin_id blob PRIMARY KEY,"
|
|
39
|
+
" coin text,"
|
|
40
|
+
" singleton_id blob,"
|
|
41
|
+
" wallet_id int,"
|
|
42
|
+
" parent_coin_spend blob,"
|
|
43
|
+
" inner_puzzle_hash blob,"
|
|
44
|
+
" pending tinyint,"
|
|
45
|
+
" removed_height int,"
|
|
46
|
+
" lineage_proof blob,"
|
|
47
|
+
" custom_data blob)"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS removed_height_index on singletons(removed_height)")
|
|
51
|
+
|
|
52
|
+
return self
|
|
53
|
+
|
|
54
|
+
async def save_singleton(self, record: SingletonRecord) -> None:
|
|
55
|
+
singleton_id = singleton.get_singleton_id_from_puzzle(record.parent_coinspend.puzzle_reveal)
|
|
56
|
+
if singleton_id is None: # pragma: no cover
|
|
57
|
+
raise RuntimeError(
|
|
58
|
+
"Failed to derive Singleton ID from puzzle reveal in parent spend %s", record.parent_coinspend
|
|
59
|
+
)
|
|
60
|
+
pending_int = 0
|
|
61
|
+
if record.pending:
|
|
62
|
+
pending_int = 1
|
|
63
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
64
|
+
columns = (
|
|
65
|
+
"coin_id, coin, singleton_id, wallet_id, parent_coin_spend, inner_puzzle_hash, "
|
|
66
|
+
"pending, removed_height, lineage_proof, custom_data"
|
|
67
|
+
)
|
|
68
|
+
await conn.execute(
|
|
69
|
+
f"INSERT or REPLACE INTO singletons ({columns}) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
70
|
+
(
|
|
71
|
+
record.coin.name().hex(),
|
|
72
|
+
json.dumps(record.coin.to_json_dict()),
|
|
73
|
+
singleton_id.hex(),
|
|
74
|
+
record.wallet_id,
|
|
75
|
+
bytes(record.parent_coinspend),
|
|
76
|
+
record.inner_puzzle_hash,
|
|
77
|
+
pending_int,
|
|
78
|
+
record.removed_height,
|
|
79
|
+
bytes(record.lineage_proof),
|
|
80
|
+
record.custom_data,
|
|
81
|
+
),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
async def add_spend(
|
|
85
|
+
self,
|
|
86
|
+
wallet_id: uint32,
|
|
87
|
+
coin_state: CoinSpend,
|
|
88
|
+
block_height: uint32 = uint32(0),
|
|
89
|
+
pending: bool = True,
|
|
90
|
+
) -> None:
|
|
91
|
+
"""Given a coin spend of a singleton, attempt to calculate the child coin and details
|
|
92
|
+
for the new singleton record. Add the new record to the store and remove the old record
|
|
93
|
+
if it exists
|
|
94
|
+
"""
|
|
95
|
+
# get singleton_id from puzzle_reveal
|
|
96
|
+
singleton_id = get_singleton_id_from_puzzle(coin_state.puzzle_reveal)
|
|
97
|
+
if not singleton_id:
|
|
98
|
+
raise RuntimeError("Coin to add is not a valid singleton")
|
|
99
|
+
|
|
100
|
+
# get details for singleton record
|
|
101
|
+
conditions = conditions_dict_for_solution(
|
|
102
|
+
coin_state.puzzle_reveal, coin_state.solution, DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
cc_cond = [cond for cond in conditions[ConditionOpcode.CREATE_COIN] if int_from_bytes(cond.vars[1]) % 2 == 1][0]
|
|
106
|
+
|
|
107
|
+
coin = Coin(coin_state.coin.name(), cc_cond.vars[0], uint64(int_from_bytes(cc_cond.vars[1])))
|
|
108
|
+
inner_puz = get_inner_puzzle_from_singleton(coin_state.puzzle_reveal)
|
|
109
|
+
if inner_puz is None: # pragma: no cover
|
|
110
|
+
raise RuntimeError("Could not get inner puzzle from puzzle reveal in coin spend %s", coin_state)
|
|
111
|
+
|
|
112
|
+
lineage_bytes = [x.as_atom() for x in coin_state.solution.to_program().first().as_iter()]
|
|
113
|
+
if len(lineage_bytes) == 2:
|
|
114
|
+
lineage_proof = LineageProof(bytes32(lineage_bytes[0]), None, uint64(int_from_bytes(lineage_bytes[1])))
|
|
115
|
+
else:
|
|
116
|
+
lineage_proof = LineageProof(
|
|
117
|
+
bytes32(lineage_bytes[0]), bytes32(lineage_bytes[1]), uint64(int_from_bytes(lineage_bytes[2]))
|
|
118
|
+
)
|
|
119
|
+
# Create and save the new singleton record
|
|
120
|
+
new_record = SingletonRecord(
|
|
121
|
+
coin, singleton_id, wallet_id, coin_state, inner_puz.get_tree_hash(), pending, 0, lineage_proof, None
|
|
122
|
+
)
|
|
123
|
+
await self.save_singleton(new_record)
|
|
124
|
+
# check if coin is in DB and mark deleted if found
|
|
125
|
+
current_records = await self.get_records_by_coin_id(coin_state.coin.name())
|
|
126
|
+
if len(current_records) > 0:
|
|
127
|
+
await self.delete_singleton_by_coin_id(coin_state.coin.name(), block_height)
|
|
128
|
+
return
|
|
129
|
+
|
|
130
|
+
def _to_singleton_record(self, row: Row) -> SingletonRecord:
|
|
131
|
+
return SingletonRecord(
|
|
132
|
+
coin=Coin.from_json_dict(json.loads(row[1])),
|
|
133
|
+
singleton_id=bytes32.from_hexstr(row[2]),
|
|
134
|
+
wallet_id=uint32(row[3]),
|
|
135
|
+
parent_coinspend=CoinSpend.from_bytes(row[4]),
|
|
136
|
+
inner_puzzle_hash=bytes32.from_bytes(row[5]), # inner puz hash
|
|
137
|
+
pending=True if row[6] == 1 else False,
|
|
138
|
+
removed_height=uint32(row[7]),
|
|
139
|
+
lineage_proof=LineageProof.from_bytes(row[8]),
|
|
140
|
+
custom_data=row[9],
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
async def delete_singleton_by_singleton_id(self, singleton_id: bytes32, height: uint32) -> bool:
|
|
144
|
+
"""Tries to mark a given singleton as deleted at specific height
|
|
145
|
+
|
|
146
|
+
This is due to how re-org works
|
|
147
|
+
Returns `True` if singleton was found and marked deleted or `False` if not."""
|
|
148
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
149
|
+
cursor = await conn.execute(
|
|
150
|
+
"UPDATE singletons SET removed_height=? WHERE singleton_id=?", (int(height), singleton_id.hex())
|
|
151
|
+
)
|
|
152
|
+
if cursor.rowcount > 0:
|
|
153
|
+
log.info("Deleted singleton with singleton id: %s", singleton_id.hex())
|
|
154
|
+
return True
|
|
155
|
+
log.warning("Couldn't find singleton with singleton id to delete: %s", singleton_id.hex())
|
|
156
|
+
return False
|
|
157
|
+
|
|
158
|
+
async def delete_singleton_by_coin_id(self, coin_id: bytes32, height: uint32) -> bool:
|
|
159
|
+
"""Tries to mark a given singleton as deleted at specific height
|
|
160
|
+
|
|
161
|
+
This is due to how re-org works
|
|
162
|
+
Returns `True` if singleton was found and marked deleted or `False` if not."""
|
|
163
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
164
|
+
cursor = await conn.execute(
|
|
165
|
+
"UPDATE singletons SET removed_height=? WHERE coin_id=?", (int(height), coin_id.hex())
|
|
166
|
+
)
|
|
167
|
+
if cursor.rowcount > 0:
|
|
168
|
+
log.info("Deleted singleton with coin id: %s", coin_id.hex())
|
|
169
|
+
return True
|
|
170
|
+
log.warning("Couldn't find singleton with coin id to delete: %s", coin_id.hex())
|
|
171
|
+
return False
|
|
172
|
+
|
|
173
|
+
async def delete_wallet(self, wallet_id: uint32) -> None:
|
|
174
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
175
|
+
cursor = await conn.execute("DELETE FROM singletons WHERE wallet_id=?", (wallet_id,))
|
|
176
|
+
await cursor.close()
|
|
177
|
+
|
|
178
|
+
async def update_pending_transaction(self, coin_id: bytes32, pending: bool) -> bool:
|
|
179
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
180
|
+
c = await conn.execute(
|
|
181
|
+
"UPDATE singletons SET pending=? WHERE coin_id = ?",
|
|
182
|
+
(pending, coin_id.hex()),
|
|
183
|
+
)
|
|
184
|
+
return c.rowcount > 0
|
|
185
|
+
|
|
186
|
+
async def get_records_by_wallet_id(self, wallet_id: int) -> List[SingletonRecord]:
|
|
187
|
+
"""
|
|
188
|
+
Retrieves all entries for a wallet ID.
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
192
|
+
rows = await conn.execute_fetchall(
|
|
193
|
+
"SELECT * FROM singletons WHERE wallet_id = ? ORDER BY removed_height",
|
|
194
|
+
(wallet_id,),
|
|
195
|
+
)
|
|
196
|
+
return [self._to_singleton_record(row) for row in rows]
|
|
197
|
+
|
|
198
|
+
async def get_records_by_coin_id(self, coin_id: bytes32) -> List[SingletonRecord]:
|
|
199
|
+
"""
|
|
200
|
+
Retrieves all entries for a coin ID.
|
|
201
|
+
"""
|
|
202
|
+
|
|
203
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
204
|
+
rows = await conn.execute_fetchall(
|
|
205
|
+
"SELECT * FROM singletons WHERE coin_id = ?",
|
|
206
|
+
(coin_id.hex(),),
|
|
207
|
+
)
|
|
208
|
+
return [self._to_singleton_record(row) for row in rows]
|
|
209
|
+
|
|
210
|
+
async def get_records_by_singleton_id(self, singleton_id: bytes32) -> List[SingletonRecord]:
|
|
211
|
+
"""
|
|
212
|
+
Retrieves all entries for a singleton ID.
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
216
|
+
rows = await conn.execute_fetchall(
|
|
217
|
+
"SELECT * FROM singletons WHERE singleton_id = ? ORDER BY removed_height",
|
|
218
|
+
(singleton_id.hex(),),
|
|
219
|
+
)
|
|
220
|
+
return [self._to_singleton_record(row) for row in rows]
|
|
221
|
+
|
|
222
|
+
async def rollback(self, height: int, wallet_id_arg: int) -> None:
|
|
223
|
+
"""
|
|
224
|
+
Rollback removes all entries which have entry_height > height passed in. Note that this is not committed to the
|
|
225
|
+
DB until db_wrapper.commit() is called. However, it is written to the cache, so it can be fetched with
|
|
226
|
+
get_all_state_transitions.
|
|
227
|
+
"""
|
|
228
|
+
|
|
229
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
230
|
+
cursor = await conn.execute(
|
|
231
|
+
"DELETE FROM singletons WHERE removed_height>? AND wallet_id=?", (height, wallet_id_arg)
|
|
232
|
+
)
|
|
233
|
+
await cursor.close()
|
|
234
|
+
|
|
235
|
+
async def count(self, wallet_id: Optional[uint32] = None) -> int:
|
|
236
|
+
sql = "SELECT COUNT(singleton_id) FROM singletons WHERE removed_height=0"
|
|
237
|
+
params: List[uint32] = []
|
|
238
|
+
if wallet_id is not None:
|
|
239
|
+
sql += " AND wallet_id=?"
|
|
240
|
+
params.append(wallet_id)
|
|
241
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
242
|
+
count_row = await execute_fetchone(conn, sql, params)
|
|
243
|
+
if count_row:
|
|
244
|
+
return int(count_row[0])
|
|
245
|
+
return -1 # pragma: no cover
|
|
246
|
+
|
|
247
|
+
async def is_empty(self, wallet_id: Optional[uint32] = None) -> bool:
|
|
248
|
+
sql = "SELECT 1 FROM singletons WHERE removed_height=0"
|
|
249
|
+
params: List[Union[uint32, bytes32]] = []
|
|
250
|
+
if wallet_id is not None:
|
|
251
|
+
sql += " AND wallet_id=?"
|
|
252
|
+
params.append(wallet_id)
|
|
253
|
+
sql += " LIMIT 1"
|
|
254
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
255
|
+
count_row = await execute_fetchone(conn, sql, params)
|
|
256
|
+
if count_row:
|
|
257
|
+
return False
|
|
258
|
+
return True
|