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,351 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sqlite3
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from enum import IntEnum
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
from chia.types.blockchain_format.coin import Coin
|
|
9
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
10
|
+
from chia.util.db_wrapper import DBWrapper2, execute_fetchone
|
|
11
|
+
from chia.util.hash import std_hash
|
|
12
|
+
from chia.util.ints import uint8, uint32, uint64
|
|
13
|
+
from chia.util.lru_cache import LRUCache
|
|
14
|
+
from chia.util.streamable import Streamable, UInt32Range, UInt64Range, VersionedBlob, streamable
|
|
15
|
+
from chia.wallet.util.query_filter import AmountFilter, FilterMode, HashFilter
|
|
16
|
+
from chia.wallet.util.wallet_types import CoinType, WalletType
|
|
17
|
+
from chia.wallet.wallet_coin_record import WalletCoinRecord
|
|
18
|
+
|
|
19
|
+
unspent_range = UInt32Range(stop=uint32(0))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class CoinRecordOrder(IntEnum):
|
|
23
|
+
confirmed_height = 1
|
|
24
|
+
spent_height = 2
|
|
25
|
+
amount = 3
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@streamable
|
|
29
|
+
@dataclass(frozen=True)
|
|
30
|
+
class GetCoinRecords(Streamable):
|
|
31
|
+
offset: uint32 = uint32(0)
|
|
32
|
+
limit: uint32 = uint32.MAXIMUM
|
|
33
|
+
wallet_id: Optional[uint32] = None
|
|
34
|
+
wallet_type: Optional[uint8] = None # WalletType
|
|
35
|
+
coin_type: Optional[uint8] = None # CoinType
|
|
36
|
+
coin_id_filter: Optional[HashFilter] = None
|
|
37
|
+
puzzle_hash_filter: Optional[HashFilter] = None
|
|
38
|
+
parent_coin_id_filter: Optional[HashFilter] = None
|
|
39
|
+
amount_filter: Optional[AmountFilter] = None
|
|
40
|
+
amount_range: Optional[UInt64Range] = None
|
|
41
|
+
confirmed_range: Optional[UInt32Range] = None
|
|
42
|
+
spent_range: Optional[UInt32Range] = None
|
|
43
|
+
order: uint8 = uint8(CoinRecordOrder.confirmed_height)
|
|
44
|
+
reverse: bool = False
|
|
45
|
+
include_total_count: bool = False # Include the total number of entries for the query without applying offset/limit
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass(frozen=True)
|
|
49
|
+
class GetCoinRecordsResult:
|
|
50
|
+
records: list[WalletCoinRecord]
|
|
51
|
+
coin_id_to_record: dict[bytes32, WalletCoinRecord]
|
|
52
|
+
total_count: Optional[uint32]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class WalletCoinStore:
|
|
56
|
+
"""
|
|
57
|
+
This object handles CoinRecords in DB used by wallet.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
db_wrapper: DBWrapper2
|
|
61
|
+
total_count_cache: LRUCache[bytes32, uint32]
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
async def create(cls, wrapper: DBWrapper2):
|
|
65
|
+
self = cls()
|
|
66
|
+
|
|
67
|
+
self.db_wrapper = wrapper
|
|
68
|
+
self.total_count_cache = LRUCache(100)
|
|
69
|
+
|
|
70
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
71
|
+
await conn.execute(
|
|
72
|
+
"CREATE TABLE IF NOT EXISTS coin_record("
|
|
73
|
+
"coin_name text PRIMARY KEY,"
|
|
74
|
+
" confirmed_height bigint,"
|
|
75
|
+
" spent_height bigint,"
|
|
76
|
+
" spent int,"
|
|
77
|
+
" coinbase int,"
|
|
78
|
+
" puzzle_hash text,"
|
|
79
|
+
" coin_parent text,"
|
|
80
|
+
" amount blob,"
|
|
81
|
+
" wallet_type int,"
|
|
82
|
+
" wallet_id int)"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Useful for reorg lookups
|
|
86
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_confirmed_height on coin_record(confirmed_height)")
|
|
87
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_spent_height on coin_record(spent_height)")
|
|
88
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_spent on coin_record(spent)")
|
|
89
|
+
|
|
90
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_puzzlehash on coin_record(puzzle_hash)")
|
|
91
|
+
|
|
92
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_record_wallet_type on coin_record(wallet_type)")
|
|
93
|
+
|
|
94
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS wallet_id on coin_record(wallet_id)")
|
|
95
|
+
|
|
96
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_amount on coin_record(amount)")
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
await conn.execute("ALTER TABLE coin_record ADD COLUMN coin_type int DEFAULT 0")
|
|
100
|
+
await conn.execute("ALTER TABLE coin_record ADD COLUMN metadata blob")
|
|
101
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS coin_record_coin_type on coin_record(coin_type)")
|
|
102
|
+
except sqlite3.OperationalError:
|
|
103
|
+
pass
|
|
104
|
+
return self
|
|
105
|
+
|
|
106
|
+
async def count_small_unspent(self, cutoff: int, coin_type: CoinType = CoinType.NORMAL) -> int:
|
|
107
|
+
amount_bytes = uint64(cutoff).stream_to_bytes()
|
|
108
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
109
|
+
row = await execute_fetchone(
|
|
110
|
+
conn,
|
|
111
|
+
"SELECT COUNT(*) FROM coin_record WHERE coin_type=? AND amount < ? AND spent=0",
|
|
112
|
+
(coin_type, amount_bytes),
|
|
113
|
+
)
|
|
114
|
+
return int(0 if row is None else row[0])
|
|
115
|
+
|
|
116
|
+
# Store CoinRecord in DB and ram cache
|
|
117
|
+
async def add_coin_record(self, record: WalletCoinRecord, name: Optional[bytes32] = None) -> None:
|
|
118
|
+
if name is None:
|
|
119
|
+
name = record.name()
|
|
120
|
+
assert record.spent == (record.spent_block_height != 0)
|
|
121
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
122
|
+
await conn.execute_insert(
|
|
123
|
+
"INSERT OR REPLACE INTO coin_record ("
|
|
124
|
+
"coin_name, confirmed_height, spent_height, spent, coinbase, puzzle_hash, coin_parent, amount, "
|
|
125
|
+
"wallet_type, wallet_id, coin_type, metadata) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
126
|
+
(
|
|
127
|
+
name.hex(),
|
|
128
|
+
record.confirmed_block_height,
|
|
129
|
+
record.spent_block_height,
|
|
130
|
+
int(record.spent),
|
|
131
|
+
int(record.coinbase),
|
|
132
|
+
str(record.coin.puzzle_hash.hex()),
|
|
133
|
+
str(record.coin.parent_coin_info.hex()),
|
|
134
|
+
uint64(record.coin.amount).stream_to_bytes(),
|
|
135
|
+
record.wallet_type,
|
|
136
|
+
record.wallet_id,
|
|
137
|
+
record.coin_type,
|
|
138
|
+
None if record.metadata is None else bytes(record.metadata),
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
self.total_count_cache.cache.clear()
|
|
142
|
+
|
|
143
|
+
# Sometimes we realize that a coin is actually not interesting to us so we need to delete it
|
|
144
|
+
async def delete_coin_record(self, coin_name: bytes32) -> None:
|
|
145
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
146
|
+
await (await conn.execute("DELETE FROM coin_record WHERE coin_name=?", (coin_name.hex(),))).close()
|
|
147
|
+
self.total_count_cache.cache.clear()
|
|
148
|
+
|
|
149
|
+
# Update coin_record to be spent in DB
|
|
150
|
+
async def set_spent(self, coin_name: bytes32, height: uint32) -> None:
|
|
151
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
152
|
+
await conn.execute_insert(
|
|
153
|
+
"UPDATE coin_record SET spent_height=?,spent=? WHERE coin_name=?",
|
|
154
|
+
(
|
|
155
|
+
height,
|
|
156
|
+
1,
|
|
157
|
+
coin_name.hex(),
|
|
158
|
+
),
|
|
159
|
+
)
|
|
160
|
+
self.total_count_cache.cache.clear()
|
|
161
|
+
|
|
162
|
+
def coin_record_from_row(self, row: sqlite3.Row) -> WalletCoinRecord:
|
|
163
|
+
coin = Coin(bytes32.fromhex(row[6]), bytes32.fromhex(row[5]), uint64.from_bytes(row[7]))
|
|
164
|
+
return WalletCoinRecord(
|
|
165
|
+
coin,
|
|
166
|
+
uint32(row[1]),
|
|
167
|
+
uint32(row[2]),
|
|
168
|
+
bool(row[3]),
|
|
169
|
+
bool(row[4]),
|
|
170
|
+
WalletType(row[8]),
|
|
171
|
+
row[9],
|
|
172
|
+
CoinType(row[10]),
|
|
173
|
+
None if row[11] is None else VersionedBlob.from_bytes(row[11]),
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
async def get_coin_record(self, coin_name: bytes32) -> Optional[WalletCoinRecord]:
|
|
177
|
+
"""Returns CoinRecord with specified coin id."""
|
|
178
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
179
|
+
rows = list(await conn.execute_fetchall("SELECT * from coin_record WHERE coin_name=?", (coin_name.hex(),)))
|
|
180
|
+
|
|
181
|
+
if len(rows) == 0:
|
|
182
|
+
return None
|
|
183
|
+
return self.coin_record_from_row(rows[0])
|
|
184
|
+
|
|
185
|
+
async def get_coin_records(
|
|
186
|
+
self,
|
|
187
|
+
*,
|
|
188
|
+
offset: uint32 = uint32(0),
|
|
189
|
+
limit: uint32 = uint32.MAXIMUM,
|
|
190
|
+
wallet_id: Optional[uint32] = None,
|
|
191
|
+
wallet_type: Optional[WalletType] = None,
|
|
192
|
+
coin_type: Optional[CoinType] = None,
|
|
193
|
+
coin_id_filter: Optional[HashFilter] = None,
|
|
194
|
+
puzzle_hash_filter: Optional[HashFilter] = None,
|
|
195
|
+
parent_coin_id_filter: Optional[HashFilter] = None,
|
|
196
|
+
amount_filter: Optional[AmountFilter] = None,
|
|
197
|
+
amount_range: Optional[UInt64Range] = None,
|
|
198
|
+
confirmed_range: Optional[UInt32Range] = None,
|
|
199
|
+
spent_range: Optional[UInt32Range] = None,
|
|
200
|
+
order: CoinRecordOrder = CoinRecordOrder.confirmed_height,
|
|
201
|
+
reverse: bool = False,
|
|
202
|
+
include_total_count: bool = False,
|
|
203
|
+
) -> GetCoinRecordsResult:
|
|
204
|
+
conditions = []
|
|
205
|
+
if wallet_id is not None:
|
|
206
|
+
conditions.append(f"wallet_id={wallet_id}")
|
|
207
|
+
if wallet_type is not None:
|
|
208
|
+
conditions.append(f"wallet_type={wallet_type.value}")
|
|
209
|
+
if coin_type is not None:
|
|
210
|
+
conditions.append(f"coin_type={coin_type.value}")
|
|
211
|
+
for field, hash_filter in {
|
|
212
|
+
"coin_name": coin_id_filter,
|
|
213
|
+
"coin_parent": parent_coin_id_filter,
|
|
214
|
+
"puzzle_hash": puzzle_hash_filter,
|
|
215
|
+
}.items():
|
|
216
|
+
if hash_filter is None:
|
|
217
|
+
continue
|
|
218
|
+
entries = ",".join(f"{value.hex()!r}" for value in hash_filter.values)
|
|
219
|
+
conditions.append(
|
|
220
|
+
f"{field} {'not' if FilterMode(hash_filter.mode) == FilterMode.exclude else ''} in ({entries})"
|
|
221
|
+
)
|
|
222
|
+
if confirmed_range is not None and confirmed_range != UInt32Range():
|
|
223
|
+
conditions.append(f"confirmed_height BETWEEN {confirmed_range.start} AND {confirmed_range.stop}")
|
|
224
|
+
if spent_range is not None and spent_range != UInt32Range():
|
|
225
|
+
conditions.append(f"spent_height BETWEEN {spent_range.start} AND {spent_range.stop}")
|
|
226
|
+
if amount_filter is not None:
|
|
227
|
+
entries = ",".join(f"X'{value.stream_to_bytes().hex()}'" for value in amount_filter.values)
|
|
228
|
+
conditions.append(
|
|
229
|
+
f"amount {'not' if FilterMode(amount_filter.mode) == FilterMode.exclude else ''} in ({entries})"
|
|
230
|
+
)
|
|
231
|
+
if amount_range is not None and amount_range != UInt64Range():
|
|
232
|
+
conditions.append(
|
|
233
|
+
f"amount BETWEEN X'{amount_range.start.stream_to_bytes().hex()}' "
|
|
234
|
+
f"AND X'{amount_range.stop.stream_to_bytes().hex()}'"
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
where_sql = "WHERE " + " AND ".join(conditions) if len(conditions) > 0 else ""
|
|
238
|
+
order_sql = f"ORDER BY {order.name} {'DESC' if reverse else 'ASC'}, rowid"
|
|
239
|
+
limit_sql = f"LIMIT {offset}, {limit}" if offset > 0 or limit < uint32.MAXIMUM else ""
|
|
240
|
+
query_sql = f"{where_sql} {order_sql} {limit_sql}"
|
|
241
|
+
|
|
242
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
243
|
+
rows = await conn.execute_fetchall(f"SELECT * FROM coin_record {query_sql}")
|
|
244
|
+
|
|
245
|
+
total_count = None
|
|
246
|
+
if include_total_count:
|
|
247
|
+
cache_hash = std_hash(bytes(where_sql, encoding="utf8")) # Only use the conditions here
|
|
248
|
+
total_count = self.total_count_cache.get(cache_hash)
|
|
249
|
+
if total_count is None:
|
|
250
|
+
row = await execute_fetchone(conn, f"SELECT COUNT(coin_name) FROM coin_record {where_sql}")
|
|
251
|
+
assert row is not None and len(row) == 1, "COUNT should always return one value"
|
|
252
|
+
total_count = uint32(row[0])
|
|
253
|
+
self.total_count_cache.put(cache_hash, total_count)
|
|
254
|
+
|
|
255
|
+
records: list[WalletCoinRecord] = []
|
|
256
|
+
coin_id_to_record: dict[bytes32, WalletCoinRecord] = {}
|
|
257
|
+
for row in rows:
|
|
258
|
+
records.append(self.coin_record_from_row(row))
|
|
259
|
+
coin_id_to_record[bytes32.fromhex(row[0])] = records[-1]
|
|
260
|
+
|
|
261
|
+
return GetCoinRecordsResult(
|
|
262
|
+
records,
|
|
263
|
+
coin_id_to_record,
|
|
264
|
+
total_count,
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
async def get_coin_records_between(
|
|
268
|
+
self, wallet_id: int, start: int, end: int, reverse: bool = False, coin_type: CoinType = CoinType.NORMAL
|
|
269
|
+
) -> list[WalletCoinRecord]:
|
|
270
|
+
"""Return a list of coins between start and end index. List is in reverse chronological order.
|
|
271
|
+
start = 0 is most recent transaction
|
|
272
|
+
"""
|
|
273
|
+
limit = end - start
|
|
274
|
+
query_str = "ORDER BY confirmed_height " + ("DESC" if reverse else "ASC")
|
|
275
|
+
|
|
276
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
277
|
+
rows = await conn.execute_fetchall(
|
|
278
|
+
f"SELECT * FROM coin_record WHERE coin_type=? AND"
|
|
279
|
+
f" wallet_id=? {query_str}, rowid LIMIT {start}, {limit}",
|
|
280
|
+
(coin_type, wallet_id),
|
|
281
|
+
)
|
|
282
|
+
return [self.coin_record_from_row(row) for row in rows]
|
|
283
|
+
|
|
284
|
+
async def get_first_coin_height(self) -> Optional[uint32]:
|
|
285
|
+
"""Returns height of first confirmed coin"""
|
|
286
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
287
|
+
rows = list(await conn.execute_fetchall("SELECT MIN(confirmed_height) FROM coin_record"))
|
|
288
|
+
|
|
289
|
+
if len(rows) != 0 and rows[0][0] is not None:
|
|
290
|
+
return uint32(rows[0][0])
|
|
291
|
+
|
|
292
|
+
return None
|
|
293
|
+
|
|
294
|
+
async def get_unspent_coins_for_wallet(
|
|
295
|
+
self, wallet_id: int, coin_type: CoinType = CoinType.NORMAL
|
|
296
|
+
) -> set[WalletCoinRecord]:
|
|
297
|
+
"""Returns set of CoinRecords that have not been spent yet for a wallet."""
|
|
298
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
299
|
+
rows = await conn.execute_fetchall(
|
|
300
|
+
"SELECT * FROM coin_record WHERE coin_type=? AND wallet_id=? AND spent_height=0",
|
|
301
|
+
(coin_type, wallet_id),
|
|
302
|
+
)
|
|
303
|
+
return {self.coin_record_from_row(row) for row in rows}
|
|
304
|
+
|
|
305
|
+
async def get_all_unspent_coins(self, coin_type: CoinType = CoinType.NORMAL) -> set[WalletCoinRecord]:
|
|
306
|
+
"""Returns set of CoinRecords that have not been spent yet for a wallet."""
|
|
307
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
308
|
+
rows = await conn.execute_fetchall(
|
|
309
|
+
"SELECT * FROM coin_record WHERE coin_type=? AND spent_height=0", (coin_type,)
|
|
310
|
+
)
|
|
311
|
+
return {self.coin_record_from_row(row) for row in rows}
|
|
312
|
+
|
|
313
|
+
# Checks DB and DiffStores for CoinRecords with puzzle_hash and returns them
|
|
314
|
+
async def get_coin_records_by_puzzle_hash(self, puzzle_hash: bytes32) -> list[WalletCoinRecord]:
|
|
315
|
+
"""Returns a list of all coin records with the given puzzle hash"""
|
|
316
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
317
|
+
rows = await conn.execute_fetchall("SELECT * from coin_record WHERE puzzle_hash=?", (puzzle_hash.hex(),))
|
|
318
|
+
|
|
319
|
+
return [self.coin_record_from_row(row) for row in rows]
|
|
320
|
+
|
|
321
|
+
# Checks DB and DiffStores for CoinRecords with parent_coin_info and returns them
|
|
322
|
+
async def get_coin_records_by_parent_id(self, parent_coin_info: bytes32) -> list[WalletCoinRecord]:
|
|
323
|
+
"""Returns a list of all coin records with the given parent id"""
|
|
324
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
325
|
+
rows = await conn.execute_fetchall(
|
|
326
|
+
"SELECT * from coin_record WHERE coin_parent=?", (parent_coin_info.hex(),)
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
return [self.coin_record_from_row(row) for row in rows]
|
|
330
|
+
|
|
331
|
+
async def rollback_to_block(self, height: int) -> None:
|
|
332
|
+
"""
|
|
333
|
+
Rolls back the blockchain to block_index. All coins confirmed after this point are removed.
|
|
334
|
+
All coins spent after this point are set to unspent. Can be -1 (rollback all)
|
|
335
|
+
"""
|
|
336
|
+
|
|
337
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
338
|
+
await (await conn.execute("DELETE FROM coin_record WHERE confirmed_height>?", (height,))).close()
|
|
339
|
+
await (
|
|
340
|
+
await conn.execute(
|
|
341
|
+
"UPDATE coin_record SET spent_height = 0, spent = 0 WHERE spent_height>?",
|
|
342
|
+
(height,),
|
|
343
|
+
)
|
|
344
|
+
).close()
|
|
345
|
+
self.total_count_cache.cache.clear()
|
|
346
|
+
|
|
347
|
+
async def delete_wallet(self, wallet_id: uint32) -> None:
|
|
348
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
349
|
+
cursor = await conn.execute("DELETE FROM coin_record WHERE wallet_id=?", (wallet_id,))
|
|
350
|
+
await cursor.close()
|
|
351
|
+
self.total_count_cache.cache.clear()
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from chia.util.ints import uint8, uint32
|
|
6
|
+
from chia.util.streamable import Streamable, streamable
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@streamable
|
|
10
|
+
@dataclass(frozen=True)
|
|
11
|
+
class WalletInfo(Streamable):
|
|
12
|
+
"""
|
|
13
|
+
This object represents the wallet data as it is stored in DB.
|
|
14
|
+
ID: Main wallet (Standard) is stored at index 1, every wallet created after done has auto incremented id.
|
|
15
|
+
Name: can be a user provided or default generated name. (can be modified)
|
|
16
|
+
Type: is specified during wallet creation and should never be changed.
|
|
17
|
+
Data: this filed is intended to be used for storing any wallet specific information required for it.
|
|
18
|
+
(RL wallet stores origin_id, admin/user pubkey, rate limit, etc.)
|
|
19
|
+
This data should be json encoded string.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
id: uint32
|
|
23
|
+
name: str
|
|
24
|
+
type: uint8 # WalletType(type)
|
|
25
|
+
data: str
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@streamable
|
|
29
|
+
@dataclass(frozen=True)
|
|
30
|
+
class WalletInfoBackup(Streamable):
|
|
31
|
+
"""
|
|
32
|
+
Used for transforming list of WalletInfo objects into bytes.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
wallet_list: list[WalletInfo]
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from chia.protocols.wallet_protocol import CoinState
|
|
6
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
|
+
from chia.util.db_wrapper import DBWrapper2
|
|
8
|
+
from chia.util.ints import uint32
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class WalletInterestedStore:
|
|
12
|
+
"""
|
|
13
|
+
Stores coin ids that we are interested in receiving
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
db_wrapper: DBWrapper2
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
async def create(cls, wrapper: DBWrapper2):
|
|
20
|
+
self = cls()
|
|
21
|
+
self.db_wrapper = wrapper
|
|
22
|
+
|
|
23
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
24
|
+
await conn.execute("CREATE TABLE IF NOT EXISTS interested_coins(coin_name text PRIMARY KEY)")
|
|
25
|
+
|
|
26
|
+
await conn.execute(
|
|
27
|
+
"CREATE TABLE IF NOT EXISTS interested_puzzle_hashes(puzzle_hash text PRIMARY KEY, wallet_id integer)"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# Table for unknown CATs
|
|
31
|
+
fields = "asset_id text PRIMARY KEY, name text, first_seen_height integer, sender_puzzle_hash text"
|
|
32
|
+
await conn.execute(f"CREATE TABLE IF NOT EXISTS unacknowledged_asset_tokens({fields})")
|
|
33
|
+
|
|
34
|
+
# Table for coin states of unknown CATs
|
|
35
|
+
fields = "coin_state blob PRIMARY KEY, asset_id blob, fork_height int"
|
|
36
|
+
await conn.execute(f"CREATE TABLE IF NOT EXISTS unacknowledged_asset_token_states({fields})")
|
|
37
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS asset_id on unacknowledged_asset_token_states(asset_id)")
|
|
38
|
+
|
|
39
|
+
return self
|
|
40
|
+
|
|
41
|
+
async def get_interested_coin_ids(self) -> list[bytes32]:
|
|
42
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
43
|
+
cursor = await conn.execute("SELECT coin_name FROM interested_coins")
|
|
44
|
+
rows_hex = await cursor.fetchall()
|
|
45
|
+
return [bytes32(bytes.fromhex(row[0])) for row in rows_hex]
|
|
46
|
+
|
|
47
|
+
async def add_interested_coin_id(self, coin_id: bytes32) -> None:
|
|
48
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
49
|
+
cursor = await conn.execute("INSERT OR REPLACE INTO interested_coins VALUES (?)", (coin_id.hex(),))
|
|
50
|
+
await cursor.close()
|
|
51
|
+
|
|
52
|
+
async def remove_interested_coin_id(self, coin_id: bytes32) -> None:
|
|
53
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
54
|
+
cursor = await conn.execute("DELETE FROM interested_coins WHERE coin_name=?", (coin_id.hex(),))
|
|
55
|
+
await cursor.close()
|
|
56
|
+
|
|
57
|
+
async def get_interested_puzzle_hashes(self) -> list[tuple[bytes32, int]]:
|
|
58
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
59
|
+
cursor = await conn.execute("SELECT puzzle_hash, wallet_id FROM interested_puzzle_hashes")
|
|
60
|
+
rows_hex = await cursor.fetchall()
|
|
61
|
+
return [(bytes32(bytes.fromhex(row[0])), row[1]) for row in rows_hex]
|
|
62
|
+
|
|
63
|
+
async def get_interested_puzzle_hash_wallet_id(self, puzzle_hash: bytes32) -> Optional[int]:
|
|
64
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
65
|
+
cursor = await conn.execute(
|
|
66
|
+
"SELECT wallet_id FROM interested_puzzle_hashes WHERE puzzle_hash=?", (puzzle_hash.hex(),)
|
|
67
|
+
)
|
|
68
|
+
row = await cursor.fetchone()
|
|
69
|
+
if row is None:
|
|
70
|
+
return None
|
|
71
|
+
return row[0]
|
|
72
|
+
|
|
73
|
+
async def add_interested_puzzle_hash(self, puzzle_hash: bytes32, wallet_id: int) -> None:
|
|
74
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
75
|
+
cursor = await conn.execute(
|
|
76
|
+
"INSERT OR REPLACE INTO interested_puzzle_hashes VALUES (?, ?)", (puzzle_hash.hex(), wallet_id)
|
|
77
|
+
)
|
|
78
|
+
await cursor.close()
|
|
79
|
+
|
|
80
|
+
async def remove_interested_puzzle_hash(self, puzzle_hash: bytes32) -> None:
|
|
81
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
82
|
+
cursor = await conn.execute(
|
|
83
|
+
"DELETE FROM interested_puzzle_hashes WHERE puzzle_hash=?", (puzzle_hash.hex(),)
|
|
84
|
+
)
|
|
85
|
+
await cursor.close()
|
|
86
|
+
|
|
87
|
+
async def add_unacknowledged_token(
|
|
88
|
+
self,
|
|
89
|
+
asset_id: bytes32,
|
|
90
|
+
name: str,
|
|
91
|
+
first_seen_height: Optional[uint32],
|
|
92
|
+
sender_puzzle_hash: bytes32,
|
|
93
|
+
) -> None:
|
|
94
|
+
"""
|
|
95
|
+
Add an unacknowledged CAT to the database. It will only be inserted once at the first time.
|
|
96
|
+
:param asset_id: CAT asset ID
|
|
97
|
+
:param name: Name of the CAT, for now it will be unknown until we integrate the CAT name service
|
|
98
|
+
:param first_seen_height: The block height of the wallet received this CAT in the first time
|
|
99
|
+
:param sender_puzzle_hash: The puzzle hash of the sender
|
|
100
|
+
:return: None
|
|
101
|
+
"""
|
|
102
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
103
|
+
cursor = await conn.execute(
|
|
104
|
+
"INSERT OR IGNORE INTO unacknowledged_asset_tokens VALUES (?, ?, ?, ?)",
|
|
105
|
+
(
|
|
106
|
+
asset_id.hex(),
|
|
107
|
+
name,
|
|
108
|
+
first_seen_height if first_seen_height is not None else 0,
|
|
109
|
+
sender_puzzle_hash.hex(),
|
|
110
|
+
),
|
|
111
|
+
)
|
|
112
|
+
await cursor.close()
|
|
113
|
+
|
|
114
|
+
async def get_unacknowledged_tokens(self) -> list:
|
|
115
|
+
"""
|
|
116
|
+
Get a list of all unacknowledged CATs
|
|
117
|
+
:return: A json style list of unacknowledged CATs
|
|
118
|
+
"""
|
|
119
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
120
|
+
cursor = await conn.execute(
|
|
121
|
+
"SELECT asset_id, name, first_seen_height, sender_puzzle_hash FROM unacknowledged_asset_tokens"
|
|
122
|
+
)
|
|
123
|
+
cats = await cursor.fetchall()
|
|
124
|
+
return [
|
|
125
|
+
{"asset_id": cat[0], "name": cat[1], "first_seen_height": cat[2], "sender_puzzle_hash": cat[3]}
|
|
126
|
+
for cat in cats
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
async def add_unacknowledged_coin_state(
|
|
130
|
+
self,
|
|
131
|
+
asset_id: bytes32,
|
|
132
|
+
coin_state: CoinState,
|
|
133
|
+
fork_height: Optional[uint32],
|
|
134
|
+
) -> None:
|
|
135
|
+
"""
|
|
136
|
+
Add an unacknowledged coin state of a CAT to the database. It will be inserted into the retry store when the
|
|
137
|
+
user decides to acknowledge the asset ID.
|
|
138
|
+
:param asset_id: CAT asset ID
|
|
139
|
+
:param coin_state: The state being ignored
|
|
140
|
+
:param fork_height: The fork height when the state was sent
|
|
141
|
+
:return: None
|
|
142
|
+
"""
|
|
143
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
144
|
+
cursor = await conn.execute(
|
|
145
|
+
"INSERT OR IGNORE INTO unacknowledged_asset_token_states VALUES(?, ?, ?)",
|
|
146
|
+
(bytes(coin_state), asset_id, 0 if fork_height is None else fork_height),
|
|
147
|
+
)
|
|
148
|
+
await cursor.close()
|
|
149
|
+
|
|
150
|
+
async def get_unacknowledged_states_for_asset_id(self, asset_id: bytes32) -> list[tuple[CoinState, uint32]]:
|
|
151
|
+
"""
|
|
152
|
+
Return all states for a particular asset ID that were ignored
|
|
153
|
+
:param asset_id: CAT asset ID
|
|
154
|
+
:return: list of coin state, fork height tuples ready to be inserted into the retry store
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
158
|
+
rows = await conn.execute_fetchall(
|
|
159
|
+
"SELECT * from unacknowledged_asset_token_states WHERE asset_id=?", (asset_id,)
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
return [(CoinState.from_bytes(row[0]), uint32(row[2])) for row in rows]
|
|
163
|
+
|
|
164
|
+
async def delete_unacknowledged_states_for_asset_id(self, asset_id: bytes32) -> None:
|
|
165
|
+
"""
|
|
166
|
+
Delete all states for a particular asset ID that were ignored
|
|
167
|
+
:param asset_id: CAT asset ID
|
|
168
|
+
:return: None
|
|
169
|
+
"""
|
|
170
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
171
|
+
cursor = await conn.execute(
|
|
172
|
+
"DELETE from unacknowledged_asset_token_states WHERE asset_id=?",
|
|
173
|
+
(asset_id,),
|
|
174
|
+
)
|
|
175
|
+
await cursor.close()
|
|
176
|
+
|
|
177
|
+
async def rollback_to_block(self, height: int) -> None:
|
|
178
|
+
"""
|
|
179
|
+
Delete all ignored states above a certain height
|
|
180
|
+
:param height: Reorg height
|
|
181
|
+
:return None:
|
|
182
|
+
"""
|
|
183
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
184
|
+
cursor = await conn.execute(
|
|
185
|
+
"DELETE from unacknowledged_asset_token_states WHERE fork_height>?",
|
|
186
|
+
(height,),
|
|
187
|
+
)
|
|
188
|
+
await cursor.close()
|