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,118 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Optional
|
|
5
|
+
|
|
6
|
+
from clvm.casts import int_from_bytes
|
|
7
|
+
from clvm.SExp import SExp
|
|
8
|
+
from clvm_tools.binutils import assemble, type_for_atom
|
|
9
|
+
from ir.Type import Type
|
|
10
|
+
|
|
11
|
+
from chia.types.blockchain_format.program import Program
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
The following two classes act as wrapper classes around dictionaries of strings.
|
|
15
|
+
Values in the dictionary are assumed to be strings in CLVM format (0x for bytes, etc.)
|
|
16
|
+
When you access a value in the dictionary, it will be deserialized to a str, int, bytes, or Program appropriately.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class PuzzleInfo:
|
|
22
|
+
"""
|
|
23
|
+
There are two 'magic' keys in a PuzzleInfo object:
|
|
24
|
+
- 'type' must be an included key (for easy lookup of drivers)
|
|
25
|
+
- 'also' gets its own method as it's the supported way to do recursion of PuzzleInfos
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
info: dict[str, Any]
|
|
29
|
+
|
|
30
|
+
def __post_init__(self) -> None:
|
|
31
|
+
if "type" not in self.info:
|
|
32
|
+
raise ValueError("A type is required to initialize a puzzle driver")
|
|
33
|
+
|
|
34
|
+
def __getitem__(self, item: str) -> Any:
|
|
35
|
+
value = self.info[item]
|
|
36
|
+
return decode_info_value(PuzzleInfo, value)
|
|
37
|
+
|
|
38
|
+
def __eq__(self, other: object) -> bool:
|
|
39
|
+
for key, value in self.info.items():
|
|
40
|
+
try:
|
|
41
|
+
if self[key] != other[key]: # type: ignore
|
|
42
|
+
return False
|
|
43
|
+
except Exception:
|
|
44
|
+
return False
|
|
45
|
+
return True
|
|
46
|
+
|
|
47
|
+
def __contains__(self, item: str) -> bool:
|
|
48
|
+
if item in self.info:
|
|
49
|
+
return True
|
|
50
|
+
else:
|
|
51
|
+
return False
|
|
52
|
+
|
|
53
|
+
def type(self) -> str:
|
|
54
|
+
return str(self.info["type"])
|
|
55
|
+
|
|
56
|
+
def also(self) -> Optional[PuzzleInfo]:
|
|
57
|
+
if "also" in self.info:
|
|
58
|
+
return PuzzleInfo(self.info["also"])
|
|
59
|
+
else:
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
def check_type(self, types: list[str]) -> bool:
|
|
63
|
+
if types == []:
|
|
64
|
+
if self.also() is None:
|
|
65
|
+
return True
|
|
66
|
+
else:
|
|
67
|
+
return False
|
|
68
|
+
else:
|
|
69
|
+
if self.type() == types[0]:
|
|
70
|
+
types.pop(0)
|
|
71
|
+
if self.also():
|
|
72
|
+
return self.also().check_type(types) # type: ignore
|
|
73
|
+
else:
|
|
74
|
+
return self.check_type(types)
|
|
75
|
+
else:
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@dataclass(frozen=True)
|
|
80
|
+
class Solver:
|
|
81
|
+
info: dict[str, Any]
|
|
82
|
+
|
|
83
|
+
def __getitem__(self, item: str) -> Any:
|
|
84
|
+
value = self.info[item]
|
|
85
|
+
return decode_info_value(Solver, value)
|
|
86
|
+
|
|
87
|
+
def __eq__(self, other: object) -> bool:
|
|
88
|
+
for key, value in self.info.items():
|
|
89
|
+
try:
|
|
90
|
+
if self[key] != other[key]: # type: ignore
|
|
91
|
+
return False
|
|
92
|
+
except Exception:
|
|
93
|
+
return False
|
|
94
|
+
return True
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def decode_info_value(cls: Any, value: Any) -> Any:
|
|
98
|
+
if isinstance(value, dict):
|
|
99
|
+
return cls(value)
|
|
100
|
+
elif isinstance(value, list):
|
|
101
|
+
return [decode_info_value(cls, v) for v in value]
|
|
102
|
+
elif isinstance(value, Program) and value.atom is None:
|
|
103
|
+
return value
|
|
104
|
+
else:
|
|
105
|
+
if value == "()": # special case
|
|
106
|
+
return Program.to([])
|
|
107
|
+
expression: SExp = assemble(value)
|
|
108
|
+
if expression.atom is None:
|
|
109
|
+
return Program(expression)
|
|
110
|
+
else:
|
|
111
|
+
atom: bytes = expression.atom
|
|
112
|
+
typ = type_for_atom(atom)
|
|
113
|
+
if typ == Type.QUOTES and value[0:2] != "0x":
|
|
114
|
+
return bytes(atom).decode("utf8")
|
|
115
|
+
elif typ == Type.INT:
|
|
116
|
+
return int_from_bytes(atom)
|
|
117
|
+
else:
|
|
118
|
+
return atom
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ff04ff02ffff02ff05ff0b8080
|
|
File without changes
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import Any, Optional, Union
|
|
5
|
+
|
|
6
|
+
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
7
|
+
from chia.types.blockchain_format.coin import Coin
|
|
8
|
+
from chia.types.blockchain_format.program import Program
|
|
9
|
+
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
10
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
11
|
+
from chia.types.coin_spend import CoinSpend, make_spend
|
|
12
|
+
from chia.types.condition_opcodes import ConditionOpcode
|
|
13
|
+
from chia.util.condition_tools import conditions_for_solution
|
|
14
|
+
from chia.util.ints import uint64
|
|
15
|
+
from chia.util.streamable import VersionedBlob
|
|
16
|
+
from chia.wallet.puzzles.clawback.metadata import ClawbackMetadata
|
|
17
|
+
from chia.wallet.puzzles.load_clvm import load_clvm_maybe_recompile
|
|
18
|
+
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import MOD
|
|
19
|
+
from chia.wallet.uncurried_puzzle import UncurriedPuzzle
|
|
20
|
+
from chia.wallet.util.curry_and_treehash import calculate_hash_of_quoted_mod_hash, curry_and_treehash
|
|
21
|
+
from chia.wallet.util.merkle_tree import MerkleTree
|
|
22
|
+
from chia.wallet.util.wallet_types import RemarkDataType
|
|
23
|
+
|
|
24
|
+
P2_1_OF_N = load_clvm_maybe_recompile("p2_1_of_n.clsp")
|
|
25
|
+
P2_CURRIED_PUZZLE_MOD = load_clvm_maybe_recompile("p2_puzzle_hash.clsp")
|
|
26
|
+
P2_CURRIED_PUZZLE_MOD_HASH_QUOTED = calculate_hash_of_quoted_mod_hash(P2_CURRIED_PUZZLE_MOD.get_tree_hash())
|
|
27
|
+
AUGMENTED_CONDITION = load_clvm_maybe_recompile("augmented_condition.clsp")
|
|
28
|
+
AUGMENTED_CONDITION_HASH = AUGMENTED_CONDITION.get_tree_hash()
|
|
29
|
+
log = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def create_augmented_cond_puzzle(condition: list[Union[int, uint64]], puzzle: Program) -> Program:
|
|
33
|
+
return AUGMENTED_CONDITION.curry(condition, puzzle)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def create_augmented_cond_puzzle_hash(condition: list[Any], puzzle_hash: bytes32) -> bytes32:
|
|
37
|
+
hash_of_quoted_mod_hash = calculate_hash_of_quoted_mod_hash(AUGMENTED_CONDITION_HASH)
|
|
38
|
+
hashed_args = [Program.to(condition).get_tree_hash(), puzzle_hash]
|
|
39
|
+
return curry_and_treehash(hash_of_quoted_mod_hash, *hashed_args)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def create_augmented_cond_solution(inner_solution: Program) -> Program:
|
|
43
|
+
solution: Program = Program.to([inner_solution])
|
|
44
|
+
return solution
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def create_p2_puzzle_hash_puzzle(puzzle_hash: bytes32) -> Program:
|
|
48
|
+
return P2_CURRIED_PUZZLE_MOD.curry(puzzle_hash)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def create_p2_puzzle_hash_solution(inner_puzzle: Program, inner_solution: Program) -> Program:
|
|
52
|
+
solution: Program = Program.to([inner_puzzle, inner_solution])
|
|
53
|
+
return solution
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def create_clawback_merkle_tree(timelock: uint64, sender_ph: bytes32, recipient_ph: bytes32) -> MerkleTree:
|
|
57
|
+
"""
|
|
58
|
+
Returns a merkle tree object
|
|
59
|
+
For clawbacks there are only 2 puzzles in the merkle tree, claim puzzle and clawback puzzle
|
|
60
|
+
"""
|
|
61
|
+
if timelock < 1:
|
|
62
|
+
raise ValueError("Timelock must be at least 1 second")
|
|
63
|
+
timelock_condition = [ConditionOpcode.ASSERT_SECONDS_RELATIVE, timelock]
|
|
64
|
+
augmented_cond_puz_hash = create_augmented_cond_puzzle_hash(timelock_condition, recipient_ph)
|
|
65
|
+
merkle_tree = MerkleTree(
|
|
66
|
+
[
|
|
67
|
+
augmented_cond_puz_hash,
|
|
68
|
+
curry_and_treehash(P2_CURRIED_PUZZLE_MOD_HASH_QUOTED, Program.to(sender_ph).get_tree_hash()),
|
|
69
|
+
]
|
|
70
|
+
)
|
|
71
|
+
return merkle_tree
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def create_merkle_proof(merkle_tree: MerkleTree, puzzle_hash: bytes32) -> Program:
|
|
75
|
+
"""
|
|
76
|
+
To spend a p2_1_of_n clawback we recreate the full merkle tree
|
|
77
|
+
The required proof is then selected from the merkle tree based on the puzzle_hash of the puzzle we
|
|
78
|
+
want to execute
|
|
79
|
+
Returns a proof: (int, list[bytes32]) which can be provided to the p2_1_of_n solution
|
|
80
|
+
"""
|
|
81
|
+
proof = merkle_tree.generate_proof(puzzle_hash)
|
|
82
|
+
program: Program = Program.to((proof[0], proof[1][0]))
|
|
83
|
+
return program
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def create_merkle_puzzle(timelock: uint64, sender_ph: bytes32, recipient_ph: bytes32) -> Program:
|
|
87
|
+
merkle_tree = create_clawback_merkle_tree(timelock, sender_ph, recipient_ph)
|
|
88
|
+
puzzle: Program = P2_1_OF_N.curry(merkle_tree.calculate_root())
|
|
89
|
+
return puzzle
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def create_merkle_solution(
|
|
93
|
+
timelock: uint64,
|
|
94
|
+
sender_ph: bytes32,
|
|
95
|
+
recipient_ph: bytes32,
|
|
96
|
+
inner_puzzle: Program,
|
|
97
|
+
inner_solution: Program,
|
|
98
|
+
) -> Program:
|
|
99
|
+
"""
|
|
100
|
+
Recreates the full merkle tree of a p2_1_of_n clawback coin. It uses the timelock and each party's
|
|
101
|
+
puzhash to create the tree.
|
|
102
|
+
The provided inner puzzle must hash to match either the sender or recipient puzhash
|
|
103
|
+
If it's the sender, then create the clawback solution. If it's the recipient then create the claim
|
|
104
|
+
solution.
|
|
105
|
+
Returns a program which is the solution to a p2_1_of_n clawback.
|
|
106
|
+
"""
|
|
107
|
+
merkle_tree = create_clawback_merkle_tree(timelock, sender_ph, recipient_ph)
|
|
108
|
+
inner_puzzle_hash = inner_puzzle.get_tree_hash()
|
|
109
|
+
if inner_puzzle_hash == sender_ph:
|
|
110
|
+
cb_inner_puz = create_p2_puzzle_hash_puzzle(sender_ph)
|
|
111
|
+
merkle_proof = create_merkle_proof(merkle_tree, cb_inner_puz.get_tree_hash())
|
|
112
|
+
cb_inner_solution = create_p2_puzzle_hash_solution(inner_puzzle, inner_solution)
|
|
113
|
+
elif inner_puzzle_hash == recipient_ph:
|
|
114
|
+
condition = [80, timelock]
|
|
115
|
+
cb_inner_puz = create_augmented_cond_puzzle(condition, inner_puzzle)
|
|
116
|
+
merkle_proof = create_merkle_proof(merkle_tree, cb_inner_puz.get_tree_hash())
|
|
117
|
+
cb_inner_solution = create_augmented_cond_solution(inner_solution)
|
|
118
|
+
else:
|
|
119
|
+
raise ValueError("Invalid Clawback inner puzzle.")
|
|
120
|
+
solution: Program = Program.to([merkle_proof, cb_inner_puz, cb_inner_solution])
|
|
121
|
+
return solution
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def match_clawback_puzzle(
|
|
125
|
+
uncurried: UncurriedPuzzle,
|
|
126
|
+
inner_puzzle: Union[Program, SerializedProgram],
|
|
127
|
+
inner_solution: Union[Program, SerializedProgram],
|
|
128
|
+
) -> Optional[ClawbackMetadata]:
|
|
129
|
+
# Check if the inner puzzle is a P2 puzzle
|
|
130
|
+
if MOD != uncurried.mod:
|
|
131
|
+
return None
|
|
132
|
+
if not isinstance(inner_puzzle, SerializedProgram):
|
|
133
|
+
inner_puzzle = SerializedProgram.from_program(inner_puzzle)
|
|
134
|
+
if not isinstance(inner_solution, SerializedProgram):
|
|
135
|
+
inner_solution = SerializedProgram.from_program(inner_solution)
|
|
136
|
+
# Fetch Remark condition
|
|
137
|
+
conditions = conditions_for_solution(
|
|
138
|
+
inner_puzzle,
|
|
139
|
+
inner_solution,
|
|
140
|
+
DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM // 8,
|
|
141
|
+
)
|
|
142
|
+
metadata: Optional[ClawbackMetadata] = None
|
|
143
|
+
new_puzhash: set[bytes32] = set()
|
|
144
|
+
if conditions is not None:
|
|
145
|
+
for condition in conditions:
|
|
146
|
+
if (
|
|
147
|
+
condition.opcode == ConditionOpcode.REMARK
|
|
148
|
+
and len(condition.vars) == 2
|
|
149
|
+
and int.from_bytes(condition.vars[0], "big") == RemarkDataType.CLAWBACK
|
|
150
|
+
):
|
|
151
|
+
try:
|
|
152
|
+
metadata = ClawbackMetadata.from_bytes(VersionedBlob.from_bytes(condition.vars[1]).blob)
|
|
153
|
+
except Exception:
|
|
154
|
+
# Invalid Clawback metadata
|
|
155
|
+
log.error(f"Invalid Clawback metadata {condition.vars[1].hex()}")
|
|
156
|
+
return None
|
|
157
|
+
if condition.opcode == ConditionOpcode.CREATE_COIN:
|
|
158
|
+
new_puzhash.add(bytes32.from_bytes(condition.vars[0]))
|
|
159
|
+
# Check if the inner puzzle matches the coin puzzle hash
|
|
160
|
+
if metadata is None:
|
|
161
|
+
return metadata
|
|
162
|
+
puzzle: Program = create_merkle_puzzle(
|
|
163
|
+
metadata.time_lock, metadata.sender_puzzle_hash, metadata.recipient_puzzle_hash
|
|
164
|
+
)
|
|
165
|
+
if puzzle.get_tree_hash() not in new_puzhash:
|
|
166
|
+
# The metadata doesn't match the inner puzzle, ignore it
|
|
167
|
+
log.error(
|
|
168
|
+
f"Clawback metadata {metadata} doesn't match inner puzzle {inner_puzzle.get_tree_hash().hex()}"
|
|
169
|
+
) # pragma: no cover
|
|
170
|
+
return None # pragma: no cover
|
|
171
|
+
return metadata
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def generate_clawback_spend_bundle(
|
|
175
|
+
coin: Coin, metadata: ClawbackMetadata, inner_puzzle: Program, inner_solution: Program
|
|
176
|
+
) -> CoinSpend:
|
|
177
|
+
time_lock: uint64 = metadata.time_lock
|
|
178
|
+
puzzle: Program = create_merkle_puzzle(time_lock, metadata.sender_puzzle_hash, metadata.recipient_puzzle_hash)
|
|
179
|
+
if puzzle.get_tree_hash() != coin.puzzle_hash:
|
|
180
|
+
raise ValueError(
|
|
181
|
+
f"Cannot spend merkle coin {coin.name()}, "
|
|
182
|
+
f"recreate puzzle hash {puzzle.get_tree_hash().hex()}, actual puzzle hash {coin.puzzle_hash.hex()}"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
solution: Program = create_merkle_solution(
|
|
186
|
+
time_lock, metadata.sender_puzzle_hash, metadata.recipient_puzzle_hash, inner_puzzle, inner_solution
|
|
187
|
+
)
|
|
188
|
+
return make_spend(coin, puzzle, solution)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from enum import IntEnum
|
|
5
|
+
|
|
6
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
|
+
from chia.util.ints import uint16, uint64
|
|
8
|
+
from chia.util.streamable import Streamable, streamable
|
|
9
|
+
from chia.wallet.wallet_puzzle_store import WalletPuzzleStore
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@streamable
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class ClawbackMetadata(Streamable):
|
|
15
|
+
time_lock: uint64
|
|
16
|
+
sender_puzzle_hash: bytes32
|
|
17
|
+
recipient_puzzle_hash: bytes32
|
|
18
|
+
|
|
19
|
+
async def is_recipient(self, puzzle_store: WalletPuzzleStore) -> bool:
|
|
20
|
+
if await puzzle_store.puzzle_hash_exists(self.sender_puzzle_hash):
|
|
21
|
+
return False
|
|
22
|
+
elif await puzzle_store.puzzle_hash_exists(self.recipient_puzzle_hash):
|
|
23
|
+
return True
|
|
24
|
+
else:
|
|
25
|
+
raise ValueError("Both sender and recipient puzzle hashes not found in puzzle store")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ClawbackVersion(IntEnum):
|
|
29
|
+
V1 = uint16(1)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@streamable
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class AutoClaimSettings(Streamable):
|
|
35
|
+
enabled: bool = False
|
|
36
|
+
tx_fee: uint64 = uint64(0)
|
|
37
|
+
min_amount: uint64 = uint64(0)
|
|
38
|
+
batch_size: uint16 = uint16(50)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from chia.types.blockchain_format.program import Program
|
|
6
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
|
+
from chia.types.condition_opcodes import ConditionOpcode
|
|
8
|
+
from chia.util.ints import uint64
|
|
9
|
+
from chia.util.streamable import VersionedBlob
|
|
10
|
+
from chia.wallet.payment import Payment
|
|
11
|
+
from chia.wallet.puzzles.clawback.drivers import create_merkle_puzzle
|
|
12
|
+
from chia.wallet.puzzles.clawback.metadata import ClawbackMetadata, ClawbackVersion
|
|
13
|
+
from chia.wallet.util.wallet_types import RemarkDataType
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ClawbackPuzzleDecorator:
|
|
17
|
+
"""
|
|
18
|
+
This class is a wrapper for clawback puzzles. It allows us to add Clawback characteristics to the inner puzzle.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
time_lock: uint64
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def create(config: dict[str, Any]) -> ClawbackPuzzleDecorator:
|
|
25
|
+
self = ClawbackPuzzleDecorator()
|
|
26
|
+
self.time_lock = uint64(config.get("clawback_timelock", 0))
|
|
27
|
+
return self
|
|
28
|
+
|
|
29
|
+
def decorate(self, inner_puzzle: Program) -> Program:
|
|
30
|
+
# We don't wrap anything for the Clawback
|
|
31
|
+
return inner_puzzle
|
|
32
|
+
|
|
33
|
+
def decorate_target_puzzle_hash(
|
|
34
|
+
self,
|
|
35
|
+
inner_puzzle: Program,
|
|
36
|
+
target_puzzle_hash: bytes32,
|
|
37
|
+
) -> tuple[Program, bytes32]:
|
|
38
|
+
return (
|
|
39
|
+
self.decorate(inner_puzzle),
|
|
40
|
+
create_merkle_puzzle(self.time_lock, inner_puzzle.get_tree_hash(), target_puzzle_hash).get_tree_hash(),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
def solve(
|
|
44
|
+
self, inner_puzzle: Program, primaries: list[Payment], inner_solution: Program
|
|
45
|
+
) -> tuple[Program, Program]:
|
|
46
|
+
# Append REMARK condition [1, "CLAWBACK", TIME_LOCK, SENDER_PUZHSAH, RECIPIENT_PUZHSAH]
|
|
47
|
+
if len(primaries) == 1:
|
|
48
|
+
recipient_puzhash = primaries[0].puzzle_hash
|
|
49
|
+
metadata = ClawbackMetadata(self.time_lock, inner_puzzle.get_tree_hash(), recipient_puzhash)
|
|
50
|
+
remark_condition = Program.to(
|
|
51
|
+
[
|
|
52
|
+
ConditionOpcode.REMARK.value,
|
|
53
|
+
RemarkDataType.CLAWBACK,
|
|
54
|
+
bytes(VersionedBlob(ClawbackVersion.V1.value, bytes(metadata))),
|
|
55
|
+
]
|
|
56
|
+
)
|
|
57
|
+
# Insert the REMARK condition into the condition list
|
|
58
|
+
conditions = remark_condition.cons(inner_solution.rest().first().rest())
|
|
59
|
+
conditions = inner_solution.rest().first().first().cons(conditions)
|
|
60
|
+
inner_solution = inner_solution.replace(rf=conditions)
|
|
61
|
+
return self.decorate(inner_puzzle), inner_solution
|
|
62
|
+
|
|
63
|
+
def decorate_memos(
|
|
64
|
+
self, inner_puzzle: Program, target_puzzle_hash: bytes32, memos: list[bytes]
|
|
65
|
+
) -> tuple[Program, list[bytes]]:
|
|
66
|
+
memos.insert(0, target_puzzle_hash)
|
|
67
|
+
return self.decorate(inner_puzzle), memos
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
; See chia/types/condition_opcodes.py
|
|
2
|
+
|
|
3
|
+
(
|
|
4
|
+
|
|
5
|
+
; Unavailable until after 2.0 hard fork
|
|
6
|
+
(defconstant AGG_SIG_PARENT 43)
|
|
7
|
+
(defconstant AGG_SIG_PUZZLE 44)
|
|
8
|
+
(defconstant AGG_SIG_AMOUNT 45)
|
|
9
|
+
(defconstant AGG_SIG_PUZZLE_AMOUNT 46)
|
|
10
|
+
(defconstant AGG_SIG_PARENT_AMOUNT 47)
|
|
11
|
+
(defconstant AGG_SIG_PARENT_PUZZLE 48)
|
|
12
|
+
;
|
|
13
|
+
|
|
14
|
+
(defconstant AGG_SIG_UNSAFE 49)
|
|
15
|
+
(defconstant AGG_SIG_ME 50)
|
|
16
|
+
|
|
17
|
+
; the conditions below reserve coin amounts and have to be accounted for in output totals
|
|
18
|
+
|
|
19
|
+
(defconstant CREATE_COIN 51)
|
|
20
|
+
(defconstant RESERVE_FEE 52)
|
|
21
|
+
|
|
22
|
+
; the conditions below deal with announcements, for inter-coin communication
|
|
23
|
+
|
|
24
|
+
; coin announcements
|
|
25
|
+
(defconstant CREATE_COIN_ANNOUNCEMENT 60)
|
|
26
|
+
(defconstant ASSERT_COIN_ANNOUNCEMENT 61)
|
|
27
|
+
|
|
28
|
+
; puzzle announcements
|
|
29
|
+
(defconstant CREATE_PUZZLE_ANNOUNCEMENT 62)
|
|
30
|
+
(defconstant ASSERT_PUZZLE_ANNOUNCEMENT 63)
|
|
31
|
+
|
|
32
|
+
; coin-id
|
|
33
|
+
(defconstant ASSERT_CONCURRENT_SPEND 64)
|
|
34
|
+
; puzzle-hash
|
|
35
|
+
(defconstant ASSERT_CONCURRENT_PUZZLE 65)
|
|
36
|
+
|
|
37
|
+
; mask message ...
|
|
38
|
+
(defconstant SEND_MESSAGE 66)
|
|
39
|
+
(defconstant RECEIVE_MESSAGE 67)
|
|
40
|
+
|
|
41
|
+
; the conditions below let coins inquire about themselves
|
|
42
|
+
|
|
43
|
+
(defconstant ASSERT_MY_COIN_ID 70)
|
|
44
|
+
(defconstant ASSERT_MY_PARENT_ID 71)
|
|
45
|
+
(defconstant ASSERT_MY_PUZZLEHASH 72)
|
|
46
|
+
(defconstant ASSERT_MY_AMOUNT 73)
|
|
47
|
+
(defconstant ASSERT_MY_BIRTH_SECONDS 74)
|
|
48
|
+
(defconstant ASSERT_MY_BIRTH_HEIGHT 75)
|
|
49
|
+
(defconstant ASSERT_EPHEMERAL 76)
|
|
50
|
+
|
|
51
|
+
; the conditions below ensure that we're "far enough" in the future
|
|
52
|
+
|
|
53
|
+
; wall-clock time
|
|
54
|
+
(defconstant ASSERT_SECONDS_RELATIVE 80)
|
|
55
|
+
(defconstant ASSERT_SECONDS_ABSOLUTE 81)
|
|
56
|
+
|
|
57
|
+
; block index
|
|
58
|
+
(defconstant ASSERT_HEIGHT_RELATIVE 82)
|
|
59
|
+
(defconstant ASSERT_HEIGHT_ABSOLUTE 83)
|
|
60
|
+
|
|
61
|
+
; the conditions below ensure that we're "not too far" in the future
|
|
62
|
+
|
|
63
|
+
; wall-clock time
|
|
64
|
+
(defconstant ASSERT_BEFORE_SECONDS_RELATIVE 84)
|
|
65
|
+
(defconstant ASSERT_BEFORE_SECONDS_ABSOLUTE 85)
|
|
66
|
+
|
|
67
|
+
; block index
|
|
68
|
+
(defconstant ASSERT_BEFORE_HEIGHT_RELATIVE 86)
|
|
69
|
+
(defconstant ASSERT_BEFORE_HEIGHT_ABSOLUTE 87)
|
|
70
|
+
|
|
71
|
+
; A condition that is always true and always ignore all arguments
|
|
72
|
+
(defconstant REMARK 1)
|
|
73
|
+
|
|
74
|
+
; A condition whose first argument specifies its cost, but is unkown otherwise
|
|
75
|
+
; It's a place-holder for soft-forking in new conditions
|
|
76
|
+
(defconstant SOFTFORK 90)
|
|
77
|
+
)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
;;
|
|
2
|
+
;; THIS FILE IS DEPRECATED and is only for legacy contracts.
|
|
3
|
+
;; Please use `curry.clib` going forward. It has a less stupid API.
|
|
4
|
+
;;
|
|
5
|
+
|
|
6
|
+
(
|
|
7
|
+
;; The code below is used to calculate of the tree hash of a curried function
|
|
8
|
+
;; without actually doing the curry, and using other optimization tricks
|
|
9
|
+
;; like unrolling `sha256tree`.
|
|
10
|
+
|
|
11
|
+
(defconstant ONE 1)
|
|
12
|
+
(defconstant TWO 2)
|
|
13
|
+
(defconstant A_KW #a)
|
|
14
|
+
(defconstant Q_KW #q)
|
|
15
|
+
(defconstant C_KW #c)
|
|
16
|
+
|
|
17
|
+
;; Given the tree hash `environment-hash` of an environment tree E
|
|
18
|
+
;; and the tree hash `parameter-hash` of a constant parameter P
|
|
19
|
+
;; return the tree hash of the tree corresponding to
|
|
20
|
+
;; `(c (q . P) E)`
|
|
21
|
+
;; This is the new environment tree with the addition parameter P curried in.
|
|
22
|
+
;;
|
|
23
|
+
;; Note that `(c (q . P) E)` = `(c . ((q . P) . (E . 0)))`
|
|
24
|
+
|
|
25
|
+
(defun-inline update-hash-for-parameter-hash (parameter-hash environment-hash)
|
|
26
|
+
(sha256 TWO (sha256 ONE C_KW)
|
|
27
|
+
(sha256 TWO (sha256 TWO (sha256 ONE Q_KW) parameter-hash)
|
|
28
|
+
(sha256 TWO environment-hash (sha256 ONE 0))))
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
;; This function recursively calls `update-hash-for-parameter-hash`, updating `environment-hash`
|
|
32
|
+
;; along the way.
|
|
33
|
+
|
|
34
|
+
(defun build-curry-list (reversed-curry-parameter-hashes environment-hash)
|
|
35
|
+
(if reversed-curry-parameter-hashes
|
|
36
|
+
(build-curry-list (r reversed-curry-parameter-hashes)
|
|
37
|
+
(update-hash-for-parameter-hash (f reversed-curry-parameter-hashes) environment-hash))
|
|
38
|
+
environment-hash
|
|
39
|
+
)
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
;; Given the tree hash `environment-hash` of an environment tree E
|
|
43
|
+
;; and the tree hash `function-hash` of a function tree F
|
|
44
|
+
;; return the tree hash of the tree corresponding to
|
|
45
|
+
;; `(a (q . F) E)`
|
|
46
|
+
;; This is the hash of a new function that adopts the new environment E.
|
|
47
|
+
;; This is used to build of the tree hash of a curried function.
|
|
48
|
+
;;
|
|
49
|
+
;; Note that `(a (q . F) E)` = `(a . ((q . F) . (E . 0)))`
|
|
50
|
+
|
|
51
|
+
(defun-inline tree-hash-of-apply (function-hash environment-hash)
|
|
52
|
+
(sha256 TWO (sha256 ONE A_KW)
|
|
53
|
+
(sha256 TWO (sha256 TWO (sha256 ONE Q_KW) function-hash)
|
|
54
|
+
(sha256 TWO environment-hash (sha256 ONE 0))))
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
;; DO NOT USE THIS FUNCTION GOING FORWARD. Having to pass the arguments in reverse order is stupid.
|
|
58
|
+
;; When I (RK) wrote this, I thought it was necessary, but of course, I was just being dumb
|
|
59
|
+
;; and it is not necessary. It's very confusing.
|
|
60
|
+
;;
|
|
61
|
+
;; function-hash:
|
|
62
|
+
;; the hash of a puzzle function, ie. a `mod`
|
|
63
|
+
;;
|
|
64
|
+
;; reversed-curry-parameter-hashes:
|
|
65
|
+
;; a list of pre-hashed trees representing parameters to be curried into the puzzle.
|
|
66
|
+
;; Note that this must be applied in REVERSED order. This may seem strange, but it greatly simplifies
|
|
67
|
+
;; the underlying code, since we calculate the tree hash from the bottom nodes up, and the last
|
|
68
|
+
;; parameters curried must have their hashes calculated first.
|
|
69
|
+
;;
|
|
70
|
+
;; we return the hash of the curried expression
|
|
71
|
+
;; (a (q . function-hash) (c (cp1 (c cp2 (c ... 1)...))))
|
|
72
|
+
;;
|
|
73
|
+
;; Note that from a user's perspective the hashes passed in here aren't simply
|
|
74
|
+
;; the hashes of the desired parameters, but their treehash representation since
|
|
75
|
+
;; that's the form we're assuming they take in the actual curried program.
|
|
76
|
+
|
|
77
|
+
;; DO NOT USE
|
|
78
|
+
(defun puzzle-hash-of-curried-function (function-hash . reversed-curry-parameter-hashes)
|
|
79
|
+
(tree-hash-of-apply function-hash
|
|
80
|
+
(build-curry-list reversed-curry-parameter-hashes (sha256 ONE ONE)))
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
(defconstant b32 32)
|
|
84
|
+
|
|
85
|
+
(defun-inline size_b32 (var)
|
|
86
|
+
(= (strlen var) b32)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
(defun calculate_coin_id (parent puzzlehash amount)
|
|
90
|
+
(if (all (size_b32 parent) (size_b32 puzzlehash) (> amount -1))
|
|
91
|
+
(sha256 parent puzzlehash amount)
|
|
92
|
+
(x)
|
|
93
|
+
)
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
; takes a lisp tree and returns the hash of it
|
|
97
|
+
(defun sha256tree (TREE)
|
|
98
|
+
(if (l TREE)
|
|
99
|
+
(sha256 2 (sha256tree (f TREE)) (sha256tree (r TREE)))
|
|
100
|
+
(sha256 1 TREE)))
|
|
101
|
+
|
|
102
|
+
)
|