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,496 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
import logging
|
|
5
|
+
import time
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
import aiosqlite
|
|
9
|
+
|
|
10
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
11
|
+
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
12
|
+
from chia.util.db_wrapper import DBWrapper2
|
|
13
|
+
from chia.util.errors import Err
|
|
14
|
+
from chia.util.ints import uint8, uint32
|
|
15
|
+
from chia.wallet.conditions import ConditionValidTimes
|
|
16
|
+
from chia.wallet.transaction_record import (
|
|
17
|
+
LightTransactionRecord,
|
|
18
|
+
TransactionRecord,
|
|
19
|
+
TransactionRecordOld,
|
|
20
|
+
minimum_send_attempts,
|
|
21
|
+
)
|
|
22
|
+
from chia.wallet.transaction_sorting import SortKey
|
|
23
|
+
from chia.wallet.util.query_filter import FilterMode, TransactionTypeFilter
|
|
24
|
+
from chia.wallet.util.transaction_type import TransactionType
|
|
25
|
+
|
|
26
|
+
log = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def filter_ok_mempool_status(sent_to: list[tuple[str, uint8, Optional[str]]]) -> list[tuple[str, uint8, Optional[str]]]:
|
|
30
|
+
"""Remove SUCCESS and PENDING status records from a TransactionRecord sent_to field"""
|
|
31
|
+
new_sent_to = []
|
|
32
|
+
for peer, status, err in sent_to:
|
|
33
|
+
if status == MempoolInclusionStatus.FAILED.value:
|
|
34
|
+
new_sent_to.append((peer, status, err))
|
|
35
|
+
return new_sent_to
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class WalletTransactionStore:
|
|
39
|
+
"""
|
|
40
|
+
WalletTransactionStore stores transaction history for the wallet.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
db_wrapper: DBWrapper2
|
|
44
|
+
tx_submitted: dict[bytes32, tuple[int, int]] # tx_id: [time submitted: count]
|
|
45
|
+
unconfirmed_txs: list[LightTransactionRecord] # tx_id: [time submitted: count]
|
|
46
|
+
last_wallet_tx_resend_time: int # Epoch time in seconds
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
async def create(cls, db_wrapper: DBWrapper2):
|
|
50
|
+
self = cls()
|
|
51
|
+
|
|
52
|
+
self.db_wrapper = db_wrapper
|
|
53
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
54
|
+
await conn.execute(
|
|
55
|
+
"CREATE TABLE IF NOT EXISTS transaction_record("
|
|
56
|
+
" transaction_record blob,"
|
|
57
|
+
" bundle_id text PRIMARY KEY," # NOTE: bundle_id is being stored as bytes, not hex
|
|
58
|
+
" confirmed_at_height bigint,"
|
|
59
|
+
" created_at_time bigint,"
|
|
60
|
+
" to_puzzle_hash text,"
|
|
61
|
+
" amount blob,"
|
|
62
|
+
" fee_amount blob,"
|
|
63
|
+
" confirmed int,"
|
|
64
|
+
" sent int,"
|
|
65
|
+
" wallet_id bigint,"
|
|
66
|
+
" trade_id text,"
|
|
67
|
+
" type int)"
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Useful for reorg lookups
|
|
71
|
+
await conn.execute(
|
|
72
|
+
"CREATE INDEX IF NOT EXISTS tx_confirmed_index on transaction_record(confirmed_at_height)"
|
|
73
|
+
)
|
|
74
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS tx_created_index on transaction_record(created_at_time)")
|
|
75
|
+
# Remove a redundant index on `created_at_time`
|
|
76
|
+
# See https://github.com/Chia-Network/chia-blockchain/issues/10276
|
|
77
|
+
await conn.execute("DROP INDEX IF EXISTS tx_created_time")
|
|
78
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS tx_to_puzzle_hash on transaction_record(to_puzzle_hash)")
|
|
79
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS tx_confirmed on transaction_record(confirmed)")
|
|
80
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS tx_sent on transaction_record(sent)")
|
|
81
|
+
await conn.execute(
|
|
82
|
+
"CREATE INDEX IF NOT EXISTS transaction_record_wallet_id on transaction_record(wallet_id)"
|
|
83
|
+
)
|
|
84
|
+
await conn.execute(
|
|
85
|
+
"CREATE INDEX IF NOT EXISTS transaction_record_trade_id_idx ON transaction_record(trade_id)"
|
|
86
|
+
)
|
|
87
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS tx_type on transaction_record(type)")
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
await conn.execute("CREATE TABLE tx_times(txid blob PRIMARY KEY, valid_times blob)")
|
|
91
|
+
async with await conn.execute("SELECT bundle_id from transaction_record") as cursor:
|
|
92
|
+
txids: list[bytes32] = [bytes32(row[0]) for row in await cursor.fetchall()]
|
|
93
|
+
await conn.executemany(
|
|
94
|
+
"INSERT INTO tx_times (txid, valid_times) VALUES(?, ?)",
|
|
95
|
+
[(id, bytes(ConditionValidTimes())) for id in txids],
|
|
96
|
+
)
|
|
97
|
+
except aiosqlite.OperationalError:
|
|
98
|
+
pass # ignore what is likely Duplicate table error
|
|
99
|
+
|
|
100
|
+
self.tx_submitted = {}
|
|
101
|
+
self.last_wallet_tx_resend_time = int(time.time())
|
|
102
|
+
await self.load_unconfirmed()
|
|
103
|
+
return self
|
|
104
|
+
|
|
105
|
+
async def add_transaction_record(self, record: TransactionRecord) -> None:
|
|
106
|
+
"""
|
|
107
|
+
Store TransactionRecord in DB and Cache.
|
|
108
|
+
"""
|
|
109
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
110
|
+
transaction_record_old = TransactionRecordOld(
|
|
111
|
+
confirmed_at_height=record.confirmed_at_height,
|
|
112
|
+
created_at_time=record.created_at_time,
|
|
113
|
+
to_puzzle_hash=record.to_puzzle_hash,
|
|
114
|
+
amount=record.amount,
|
|
115
|
+
fee_amount=record.fee_amount,
|
|
116
|
+
confirmed=record.confirmed,
|
|
117
|
+
sent=record.sent,
|
|
118
|
+
spend_bundle=record.spend_bundle,
|
|
119
|
+
additions=record.additions,
|
|
120
|
+
removals=record.removals,
|
|
121
|
+
wallet_id=record.wallet_id,
|
|
122
|
+
sent_to=record.sent_to,
|
|
123
|
+
trade_id=record.trade_id,
|
|
124
|
+
type=record.type,
|
|
125
|
+
name=record.name,
|
|
126
|
+
memos=record.memos,
|
|
127
|
+
)
|
|
128
|
+
await conn.execute_insert(
|
|
129
|
+
"INSERT OR REPLACE INTO transaction_record VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
130
|
+
(
|
|
131
|
+
bytes(transaction_record_old),
|
|
132
|
+
record.name,
|
|
133
|
+
record.confirmed_at_height,
|
|
134
|
+
record.created_at_time,
|
|
135
|
+
record.to_puzzle_hash.hex(),
|
|
136
|
+
record.amount.stream_to_bytes(),
|
|
137
|
+
record.fee_amount.stream_to_bytes(),
|
|
138
|
+
int(record.confirmed),
|
|
139
|
+
record.sent,
|
|
140
|
+
record.wallet_id,
|
|
141
|
+
record.trade_id,
|
|
142
|
+
record.type,
|
|
143
|
+
),
|
|
144
|
+
)
|
|
145
|
+
await conn.execute_insert(
|
|
146
|
+
"INSERT OR REPLACE INTO tx_times VALUES (?, ?)", (record.name, bytes(record.valid_times))
|
|
147
|
+
)
|
|
148
|
+
ltx = get_light_transaction_record(record)
|
|
149
|
+
if record.confirmed is False and ltx not in self.unconfirmed_txs:
|
|
150
|
+
self.unconfirmed_txs.append(ltx)
|
|
151
|
+
|
|
152
|
+
async def delete_transaction_record(self, tx_id: bytes32) -> None:
|
|
153
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
154
|
+
await (await conn.execute("DELETE FROM transaction_record WHERE bundle_id=?", (tx_id,))).close()
|
|
155
|
+
|
|
156
|
+
async def set_confirmed(self, tx_id: bytes32, height: uint32):
|
|
157
|
+
"""
|
|
158
|
+
Updates transaction to be confirmed.
|
|
159
|
+
"""
|
|
160
|
+
current: Optional[TransactionRecord] = await self.get_transaction_record(tx_id)
|
|
161
|
+
if current is None:
|
|
162
|
+
return None
|
|
163
|
+
if current.confirmed_at_height == height:
|
|
164
|
+
return
|
|
165
|
+
tx: TransactionRecord = dataclasses.replace(current, confirmed_at_height=height, confirmed=True)
|
|
166
|
+
await self.add_transaction_record(tx)
|
|
167
|
+
self.unconfirmed_txs.remove(get_light_transaction_record(current))
|
|
168
|
+
|
|
169
|
+
async def increment_sent(
|
|
170
|
+
self,
|
|
171
|
+
tx_id: bytes32,
|
|
172
|
+
name: str,
|
|
173
|
+
send_status: MempoolInclusionStatus,
|
|
174
|
+
err: Optional[Err],
|
|
175
|
+
) -> bool:
|
|
176
|
+
"""
|
|
177
|
+
Updates transaction sent count (Full Node has received spend_bundle and sent ack).
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
current: Optional[TransactionRecord] = await self.get_transaction_record(tx_id)
|
|
181
|
+
if current is None:
|
|
182
|
+
return False
|
|
183
|
+
|
|
184
|
+
sent_to = current.sent_to.copy()
|
|
185
|
+
|
|
186
|
+
current_peers = set()
|
|
187
|
+
err_str = err.name if err is not None else None
|
|
188
|
+
append_data = (name, uint8(send_status.value), err_str)
|
|
189
|
+
|
|
190
|
+
for peer_id, status, error in sent_to:
|
|
191
|
+
current_peers.add(peer_id)
|
|
192
|
+
|
|
193
|
+
if name in current_peers:
|
|
194
|
+
sent_count = uint32(current.sent)
|
|
195
|
+
else:
|
|
196
|
+
sent_count = uint32(current.sent + 1)
|
|
197
|
+
|
|
198
|
+
sent_to.append(append_data)
|
|
199
|
+
|
|
200
|
+
tx: TransactionRecord = dataclasses.replace(current, sent=sent_count, sent_to=sent_to)
|
|
201
|
+
if not tx.is_valid():
|
|
202
|
+
# if the tx is not valid due to repeated failures, we will confirm that we can't spend it
|
|
203
|
+
log.info(f"Marking tx={tx.name} as confirmed but failed, since it is not spendable due to errors")
|
|
204
|
+
tx = dataclasses.replace(tx, confirmed=True, confirmed_at_height=uint32(0))
|
|
205
|
+
await self.add_transaction_record(tx)
|
|
206
|
+
return True
|
|
207
|
+
|
|
208
|
+
async def tx_reorged(self, record: TransactionRecord):
|
|
209
|
+
"""
|
|
210
|
+
Updates transaction sent count to 0 and resets confirmation data
|
|
211
|
+
"""
|
|
212
|
+
tx: TransactionRecord = dataclasses.replace(
|
|
213
|
+
record, confirmed_at_height=uint32(0), confirmed=False, sent=uint32(0), sent_to=[]
|
|
214
|
+
)
|
|
215
|
+
await self.add_transaction_record(tx)
|
|
216
|
+
|
|
217
|
+
async def get_transaction_record(self, tx_id: bytes32) -> Optional[TransactionRecord]:
|
|
218
|
+
"""
|
|
219
|
+
Checks DB and cache for TransactionRecord with id: id and returns it.
|
|
220
|
+
"""
|
|
221
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
222
|
+
# NOTE: bundle_id is being stored as bytes, not hex
|
|
223
|
+
rows = list(
|
|
224
|
+
await conn.execute_fetchall(
|
|
225
|
+
"SELECT transaction_record from transaction_record WHERE bundle_id=?", (tx_id,)
|
|
226
|
+
)
|
|
227
|
+
)
|
|
228
|
+
if len(rows) > 0:
|
|
229
|
+
return (await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(rows[0][0])]))[0]
|
|
230
|
+
return None
|
|
231
|
+
|
|
232
|
+
# TODO: This should probably be split into separate function, one that
|
|
233
|
+
# queries the state and one that updates it. Also, include_accepted_txs=True
|
|
234
|
+
# might be a separate function too.
|
|
235
|
+
# also, the current time should be passed in as a parameter
|
|
236
|
+
async def get_not_sent(self, *, include_accepted_txs=False) -> list[TransactionRecord]:
|
|
237
|
+
"""
|
|
238
|
+
Returns the list of transactions that have not been received by full node yet.
|
|
239
|
+
"""
|
|
240
|
+
current_time = int(time.time())
|
|
241
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
242
|
+
rows = await conn.execute_fetchall(
|
|
243
|
+
"SELECT transaction_record from transaction_record WHERE confirmed=0",
|
|
244
|
+
)
|
|
245
|
+
records = []
|
|
246
|
+
|
|
247
|
+
for row in rows:
|
|
248
|
+
record = (await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(row[0])]))[0]
|
|
249
|
+
if include_accepted_txs:
|
|
250
|
+
# Reset the "sent" state for peers that have replied about this transaction. Retain errors.
|
|
251
|
+
record = dataclasses.replace(record, sent=uint32(1), sent_to=filter_ok_mempool_status(record.sent_to))
|
|
252
|
+
await self.add_transaction_record(record)
|
|
253
|
+
self.tx_submitted[record.name] = current_time, 1
|
|
254
|
+
records.append(record)
|
|
255
|
+
elif record.name in self.tx_submitted:
|
|
256
|
+
time_submitted, count = self.tx_submitted[record.name]
|
|
257
|
+
if time_submitted < current_time - (60 * 10):
|
|
258
|
+
records.append(record)
|
|
259
|
+
self.tx_submitted[record.name] = current_time, 1
|
|
260
|
+
else:
|
|
261
|
+
if count < minimum_send_attempts:
|
|
262
|
+
records.append(record)
|
|
263
|
+
self.tx_submitted[record.name] = time_submitted, (count + 1)
|
|
264
|
+
else:
|
|
265
|
+
records.append(record)
|
|
266
|
+
self.tx_submitted[record.name] = current_time, 1
|
|
267
|
+
|
|
268
|
+
return records
|
|
269
|
+
|
|
270
|
+
async def get_farming_rewards(self) -> list[TransactionRecord]:
|
|
271
|
+
"""
|
|
272
|
+
Returns the list of all farming rewards.
|
|
273
|
+
"""
|
|
274
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
275
|
+
fee_int = TransactionType.FEE_REWARD.value
|
|
276
|
+
pool_int = TransactionType.COINBASE_REWARD.value
|
|
277
|
+
rows = await conn.execute_fetchall(
|
|
278
|
+
"SELECT transaction_record from transaction_record WHERE confirmed=1 and (type=? or type=?)",
|
|
279
|
+
(fee_int, pool_int),
|
|
280
|
+
)
|
|
281
|
+
return await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(row[0]) for row in rows])
|
|
282
|
+
|
|
283
|
+
async def get_all_unconfirmed(self) -> list[LightTransactionRecord]:
|
|
284
|
+
"""
|
|
285
|
+
Returns the list of all transaction that have not yet been confirmed.
|
|
286
|
+
"""
|
|
287
|
+
return self.unconfirmed_txs
|
|
288
|
+
|
|
289
|
+
async def load_unconfirmed(self) -> None:
|
|
290
|
+
"""
|
|
291
|
+
loads the list of all transaction that have not yet been confirmed into the cache.
|
|
292
|
+
"""
|
|
293
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
294
|
+
rows = await conn.execute_fetchall("SELECT transaction_record from transaction_record WHERE confirmed=0")
|
|
295
|
+
records = [TransactionRecordOld.from_bytes(row[0]) for row in rows]
|
|
296
|
+
self.unconfirmed_txs = [get_light_transaction_record(rec) for rec in records]
|
|
297
|
+
|
|
298
|
+
async def get_unconfirmed_for_wallet(self, wallet_id: int) -> list[TransactionRecord]:
|
|
299
|
+
"""
|
|
300
|
+
Returns the list of transaction that have not yet been confirmed.
|
|
301
|
+
"""
|
|
302
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
303
|
+
rows = await conn.execute_fetchall(
|
|
304
|
+
"SELECT transaction_record from transaction_record WHERE confirmed=0 AND wallet_id=?", (wallet_id,)
|
|
305
|
+
)
|
|
306
|
+
return await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(row[0]) for row in rows])
|
|
307
|
+
|
|
308
|
+
async def get_transactions_between(
|
|
309
|
+
self,
|
|
310
|
+
wallet_id: int,
|
|
311
|
+
start,
|
|
312
|
+
end,
|
|
313
|
+
sort_key=None,
|
|
314
|
+
reverse=False,
|
|
315
|
+
confirmed: Optional[bool] = None,
|
|
316
|
+
to_puzzle_hash: Optional[bytes32] = None,
|
|
317
|
+
type_filter: Optional[TransactionTypeFilter] = None,
|
|
318
|
+
) -> list[TransactionRecord]:
|
|
319
|
+
"""Return a list of transaction between start and end index. List is in reverse chronological order.
|
|
320
|
+
start = 0 is most recent transaction
|
|
321
|
+
"""
|
|
322
|
+
limit = end - start
|
|
323
|
+
|
|
324
|
+
if to_puzzle_hash is None:
|
|
325
|
+
puzz_hash_where = ""
|
|
326
|
+
else:
|
|
327
|
+
puzz_hash_where = f' AND to_puzzle_hash="{to_puzzle_hash.hex()}"'
|
|
328
|
+
|
|
329
|
+
if sort_key is None:
|
|
330
|
+
sort_key = "CONFIRMED_AT_HEIGHT"
|
|
331
|
+
if sort_key not in SortKey.__members__:
|
|
332
|
+
raise ValueError(f"There is no known sort {sort_key}")
|
|
333
|
+
|
|
334
|
+
if reverse:
|
|
335
|
+
query_str = SortKey[sort_key].descending()
|
|
336
|
+
else:
|
|
337
|
+
query_str = SortKey[sort_key].ascending()
|
|
338
|
+
|
|
339
|
+
confirmed_str = ""
|
|
340
|
+
if confirmed is not None:
|
|
341
|
+
confirmed_str = f"AND confirmed={int(confirmed)}"
|
|
342
|
+
|
|
343
|
+
if type_filter is None:
|
|
344
|
+
type_filter_str = ""
|
|
345
|
+
else:
|
|
346
|
+
type_filter_str = (
|
|
347
|
+
f"AND type {'' if type_filter.mode == FilterMode.include else 'NOT'} "
|
|
348
|
+
f"IN ({','.join([str(x) for x in type_filter.values])})"
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
352
|
+
rows = await conn.execute_fetchall(
|
|
353
|
+
f"SELECT transaction_record FROM transaction_record WHERE wallet_id=?{puzz_hash_where}"
|
|
354
|
+
f" {type_filter_str} {confirmed_str} {query_str}, rowid"
|
|
355
|
+
f" LIMIT {start}, {limit}",
|
|
356
|
+
(wallet_id,),
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
return await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(row[0]) for row in rows])
|
|
360
|
+
|
|
361
|
+
async def get_transaction_count_for_wallet(
|
|
362
|
+
self,
|
|
363
|
+
wallet_id: int,
|
|
364
|
+
confirmed: Optional[bool] = None,
|
|
365
|
+
type_filter: Optional[TransactionTypeFilter] = None,
|
|
366
|
+
) -> int:
|
|
367
|
+
confirmed_str = ""
|
|
368
|
+
if confirmed is not None:
|
|
369
|
+
confirmed_str = f"AND confirmed={int(confirmed)}"
|
|
370
|
+
|
|
371
|
+
if type_filter is None:
|
|
372
|
+
type_filter_str = ""
|
|
373
|
+
else:
|
|
374
|
+
type_filter_str = (
|
|
375
|
+
f"AND type {'' if type_filter.mode == FilterMode.include else 'NOT'} "
|
|
376
|
+
f"IN ({','.join([str(x) for x in type_filter.values])})"
|
|
377
|
+
)
|
|
378
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
379
|
+
rows = list(
|
|
380
|
+
await conn.execute_fetchall(
|
|
381
|
+
f"SELECT COUNT(*) FROM transaction_record where wallet_id=? {type_filter_str} {confirmed_str}",
|
|
382
|
+
(wallet_id,),
|
|
383
|
+
)
|
|
384
|
+
)
|
|
385
|
+
return 0 if len(rows) == 0 else rows[0][0]
|
|
386
|
+
|
|
387
|
+
async def get_all_transactions_for_wallet(
|
|
388
|
+
self, wallet_id: int, type: Optional[int] = None
|
|
389
|
+
) -> list[TransactionRecord]:
|
|
390
|
+
"""
|
|
391
|
+
Returns all stored transactions.
|
|
392
|
+
"""
|
|
393
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
394
|
+
if type is None:
|
|
395
|
+
rows = await conn.execute_fetchall(
|
|
396
|
+
"SELECT transaction_record FROM transaction_record WHERE wallet_id=?", (wallet_id,)
|
|
397
|
+
)
|
|
398
|
+
else:
|
|
399
|
+
rows = await conn.execute_fetchall(
|
|
400
|
+
"SELECT transaction_record FROM transaction_record WHERE wallet_id=? AND type=?",
|
|
401
|
+
(
|
|
402
|
+
wallet_id,
|
|
403
|
+
type,
|
|
404
|
+
),
|
|
405
|
+
)
|
|
406
|
+
return await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(row[0]) for row in rows])
|
|
407
|
+
|
|
408
|
+
async def get_all_transactions(self) -> list[TransactionRecord]:
|
|
409
|
+
"""
|
|
410
|
+
Returns all stored transactions.
|
|
411
|
+
"""
|
|
412
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
413
|
+
rows = await conn.execute_fetchall("SELECT transaction_record from transaction_record")
|
|
414
|
+
return await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(row[0]) for row in rows])
|
|
415
|
+
|
|
416
|
+
async def get_transaction_above(self, height: int) -> list[TransactionRecord]:
|
|
417
|
+
# Can be -1 (get all tx)
|
|
418
|
+
|
|
419
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
420
|
+
rows = await conn.execute_fetchall(
|
|
421
|
+
"SELECT transaction_record from transaction_record WHERE confirmed_at_height>?", (height,)
|
|
422
|
+
)
|
|
423
|
+
return await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(row[0]) for row in rows])
|
|
424
|
+
|
|
425
|
+
async def get_transactions_by_trade_id(self, trade_id: bytes32) -> list[TransactionRecord]:
|
|
426
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
427
|
+
rows = await conn.execute_fetchall(
|
|
428
|
+
"SELECT transaction_record from transaction_record WHERE trade_id=?", (trade_id,)
|
|
429
|
+
)
|
|
430
|
+
return await self._get_new_tx_records_from_old([TransactionRecordOld.from_bytes(row[0]) for row in rows])
|
|
431
|
+
|
|
432
|
+
async def rollback_to_block(self, height: int):
|
|
433
|
+
# Delete from storage
|
|
434
|
+
self.tx_submitted = {}
|
|
435
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
436
|
+
await (await conn.execute("DELETE FROM transaction_record WHERE confirmed_at_height>?", (height,))).close()
|
|
437
|
+
|
|
438
|
+
async def delete_unconfirmed_transactions(self, wallet_id: int):
|
|
439
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
440
|
+
await (
|
|
441
|
+
await conn.execute(
|
|
442
|
+
"DELETE FROM transaction_record WHERE confirmed=0 AND wallet_id=? AND type not in (?,?)",
|
|
443
|
+
(
|
|
444
|
+
wallet_id,
|
|
445
|
+
TransactionType.INCOMING_CLAWBACK_SEND.value,
|
|
446
|
+
TransactionType.INCOMING_CLAWBACK_RECEIVE.value,
|
|
447
|
+
),
|
|
448
|
+
)
|
|
449
|
+
).close()
|
|
450
|
+
|
|
451
|
+
async def _get_new_tx_records_from_old(self, old_records: list[TransactionRecordOld]) -> list[TransactionRecord]:
|
|
452
|
+
tx_id_to_valid_times: dict[bytes, ConditionValidTimes] = {}
|
|
453
|
+
empty_valid_times = ConditionValidTimes()
|
|
454
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
455
|
+
chunked_records: list[list[TransactionRecordOld]] = [
|
|
456
|
+
old_records[i : min(len(old_records), i + self.db_wrapper.host_parameter_limit)]
|
|
457
|
+
for i in range(0, len(old_records), self.db_wrapper.host_parameter_limit)
|
|
458
|
+
]
|
|
459
|
+
for records_chunk in chunked_records:
|
|
460
|
+
cursor = await conn.execute(
|
|
461
|
+
f"SELECT txid, valid_times from tx_times WHERE txid IN ({','.join('?' * len(records_chunk))})",
|
|
462
|
+
tuple(tx.name for tx in records_chunk),
|
|
463
|
+
)
|
|
464
|
+
for row in await cursor.fetchall():
|
|
465
|
+
tx_id_to_valid_times[row[0]] = ConditionValidTimes.from_bytes(row[1])
|
|
466
|
+
await cursor.close()
|
|
467
|
+
return [
|
|
468
|
+
TransactionRecord(
|
|
469
|
+
confirmed_at_height=record.confirmed_at_height,
|
|
470
|
+
created_at_time=record.created_at_time,
|
|
471
|
+
to_puzzle_hash=record.to_puzzle_hash,
|
|
472
|
+
amount=record.amount,
|
|
473
|
+
fee_amount=record.fee_amount,
|
|
474
|
+
confirmed=record.confirmed,
|
|
475
|
+
sent=record.sent,
|
|
476
|
+
spend_bundle=record.spend_bundle,
|
|
477
|
+
additions=record.additions,
|
|
478
|
+
removals=record.removals,
|
|
479
|
+
wallet_id=record.wallet_id,
|
|
480
|
+
sent_to=record.sent_to,
|
|
481
|
+
trade_id=record.trade_id,
|
|
482
|
+
type=record.type,
|
|
483
|
+
name=record.name,
|
|
484
|
+
memos=record.memos,
|
|
485
|
+
valid_times=(
|
|
486
|
+
tx_id_to_valid_times[record.name] if record.name in tx_id_to_valid_times else empty_valid_times
|
|
487
|
+
),
|
|
488
|
+
)
|
|
489
|
+
for record in old_records
|
|
490
|
+
]
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def get_light_transaction_record(rec: TransactionRecordOld) -> LightTransactionRecord:
|
|
494
|
+
return LightTransactionRecord(
|
|
495
|
+
name=rec.name, additions=rec.additions, removals=rec.removals, type=rec.type, spend_bundle=rec.spend_bundle
|
|
496
|
+
)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from chia.util.db_wrapper import DBWrapper2, execute_fetchone
|
|
6
|
+
from chia.util.ints import uint32
|
|
7
|
+
from chia.wallet.util.wallet_types import WalletType
|
|
8
|
+
from chia.wallet.wallet_info import WalletInfo
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class WalletUserStore:
|
|
12
|
+
"""
|
|
13
|
+
WalletUserStore keeps track of all user created wallets and necessary smart-contract data
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
cache_size: uint32
|
|
17
|
+
db_wrapper: DBWrapper2
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
async def create(cls, db_wrapper: DBWrapper2):
|
|
21
|
+
self = cls()
|
|
22
|
+
|
|
23
|
+
self.db_wrapper = db_wrapper
|
|
24
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
25
|
+
await conn.execute(
|
|
26
|
+
"CREATE TABLE IF NOT EXISTS users_wallets("
|
|
27
|
+
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
|
|
28
|
+
" name text,"
|
|
29
|
+
" wallet_type int,"
|
|
30
|
+
" data text)"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS name on users_wallets(name)")
|
|
34
|
+
|
|
35
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS type on users_wallets(wallet_type)")
|
|
36
|
+
|
|
37
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS data on users_wallets(data)")
|
|
38
|
+
|
|
39
|
+
await self.init_wallet()
|
|
40
|
+
return self
|
|
41
|
+
|
|
42
|
+
async def init_wallet(self):
|
|
43
|
+
all_wallets = await self.get_all_wallet_info_entries()
|
|
44
|
+
if len(all_wallets) == 0:
|
|
45
|
+
await self.create_wallet("Chia Wallet", WalletType.STANDARD_WALLET, "")
|
|
46
|
+
|
|
47
|
+
async def create_wallet(
|
|
48
|
+
self,
|
|
49
|
+
name: str,
|
|
50
|
+
wallet_type: int,
|
|
51
|
+
data: str,
|
|
52
|
+
id: Optional[int] = None,
|
|
53
|
+
) -> WalletInfo:
|
|
54
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
55
|
+
cursor = await conn.execute(
|
|
56
|
+
"INSERT INTO users_wallets VALUES(?, ?, ?, ?)",
|
|
57
|
+
(id, name, wallet_type, data),
|
|
58
|
+
)
|
|
59
|
+
await cursor.close()
|
|
60
|
+
wallet = await self.get_last_wallet()
|
|
61
|
+
if wallet is None:
|
|
62
|
+
raise ValueError("Failed to get the just-created wallet")
|
|
63
|
+
|
|
64
|
+
return wallet
|
|
65
|
+
|
|
66
|
+
async def delete_wallet(self, id: int):
|
|
67
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
68
|
+
await (await conn.execute("DELETE FROM users_wallets where id=?", (id,))).close()
|
|
69
|
+
|
|
70
|
+
async def update_wallet(self, wallet_info: WalletInfo):
|
|
71
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
72
|
+
cursor = await conn.execute(
|
|
73
|
+
"INSERT or REPLACE INTO users_wallets VALUES(?, ?, ?, ?)",
|
|
74
|
+
(
|
|
75
|
+
wallet_info.id,
|
|
76
|
+
wallet_info.name,
|
|
77
|
+
wallet_info.type,
|
|
78
|
+
wallet_info.data,
|
|
79
|
+
),
|
|
80
|
+
)
|
|
81
|
+
await cursor.close()
|
|
82
|
+
|
|
83
|
+
async def get_last_wallet(self) -> Optional[WalletInfo]:
|
|
84
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
85
|
+
row = await execute_fetchone(conn, "SELECT MAX(id) FROM users_wallets")
|
|
86
|
+
|
|
87
|
+
return None if row is None else await self.get_wallet_by_id(row[0])
|
|
88
|
+
|
|
89
|
+
async def get_all_wallet_info_entries(self, wallet_type: Optional[WalletType] = None) -> list[WalletInfo]:
|
|
90
|
+
"""
|
|
91
|
+
Return a set containing all wallets, optionally with a specific WalletType
|
|
92
|
+
"""
|
|
93
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
94
|
+
if wallet_type is None:
|
|
95
|
+
rows = await conn.execute_fetchall("SELECT * from users_wallets")
|
|
96
|
+
else:
|
|
97
|
+
rows = await conn.execute_fetchall(
|
|
98
|
+
"SELECT * from users_wallets WHERE wallet_type=?", (wallet_type.value,)
|
|
99
|
+
)
|
|
100
|
+
return [WalletInfo(row[0], row[1], row[2], row[3]) for row in rows]
|
|
101
|
+
|
|
102
|
+
async def get_wallet_by_id(self, id: int) -> Optional[WalletInfo]:
|
|
103
|
+
"""
|
|
104
|
+
Return a wallet by id
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
108
|
+
row = await execute_fetchone(conn, "SELECT * from users_wallets WHERE id=?", (id,))
|
|
109
|
+
|
|
110
|
+
return None if row is None else WalletInfo(row[0], row[1], row[2], row[3])
|