[LABS-489] Generate Wallet RPC (#21141)

* Generate Wallet RPC

* Comment by @cursor

* fix test

* executable bit

* Comments by @cursor & fix tests

* Fix tests

* Fix tests

* Comments by @cursor

* test coverage

* Add pre-commit build for wallet stubs

* Comments by @cursor

* Comments by @cursor

* Comments by @cursor

* Comments by @cursor

* Port `get_coin_records` and `get_height_info` to `@marshal` decorator

* Remove executable bits?

* Comments by @cursor

* Comments by @cursor

* Add comment at top of .pyi file
This commit is contained in:
Matt Hauff
2026-08-03 16:19:21 -07:00
committed by GitHub
parent dc3b72b15a
commit 545b3e476f
12 changed files with 1641 additions and 1389 deletions
+7
View File
@@ -13,6 +13,13 @@ repos:
entry: ./activated.py python chia/_tests/build-init-files.py -v --root .
language: system
pass_filenames: false
- repo: local
hooks:
- id: generate_wallet_rpc_client_stubs
name: Generate wallet RPC client stubs
entry: ./activated.py python tools/generate_wallet_rpc_client_stub.py
language: system
pass_filenames: false
- repo: local
hooks:
- id: ruff_format
+13 -11
View File
@@ -16,7 +16,7 @@ from copy import deepcopy
from dataclasses import dataclass
from enum import IntEnum
from pathlib import Path
from typing import Any, cast
from typing import Any
from unittest.mock import AsyncMock, MagicMock
import aiohttp
@@ -78,7 +78,6 @@ from chia.util.task_referencer import create_referenced_task
from chia.util.timing import adjusted_timeout, backoff_times
from chia.wallet.lineage_proof import LineageProof
from chia.wallet.trading.offer import Offer as TradingOffer
from chia.wallet.transaction_record import TransactionRecord
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
from chia.wallet.wallet_node import WalletNode
from chia.wallet.wallet_request_types import (
@@ -88,6 +87,9 @@ from chia.wallet.wallet_request_types import (
DLOwnedSingletonsResponse,
DLStopTracking,
DLTrackNew,
Empty,
GetTransaction,
LogIn,
)
from chia.wallet.wallet_rpc_api import WalletRpcApi
from chia.wallet.wallet_service import WalletService
@@ -202,11 +204,11 @@ async def farm_block_check_singleton(
async def is_transaction_confirmed(api: WalletRpcApi, tx_id: bytes32) -> bool:
try:
val = await api.get_transaction({"transaction_id": tx_id.hex()})
val = await api.get_transaction(GetTransaction(transaction_id=tx_id))
except ValueError: # pragma: no cover
return False
return True if TransactionRecord.from_json_dict(val["transaction"]).confirmed else False # mypy
return val.transaction.confirmed
async def check_mempool_spend_count_or_fail(
@@ -214,9 +216,8 @@ async def check_mempool_spend_count_or_fail(
) -> bool:
"""Poll mempool count but raise immediately if the transaction was rejected."""
try:
val = await wallet_rpc_api.get_transaction({"transaction_id": tx_id.hex()})
tx_record = TransactionRecord.from_json_dict(val["transaction"])
for _, status, error in tx_record.sent_to:
val = await wallet_rpc_api.get_transaction(GetTransaction(transaction_id=tx_id))
for _, status, error in val.transaction.sent_to:
if status == MempoolInclusionStatus.FAILED.value:
raise RuntimeError(f"Transaction {tx_id} rejected by mempool: {error}") # pragma: no cover
except ValueError: # pragma: no cover
@@ -2449,16 +2450,17 @@ async def test_wallet_log_in_changes_active_fingerprint(
wallet_rpc_api, _full_node_api, wallet_rpc_port, _ph, bt = await init_wallet_and_node(
self_hostname, one_wallet_and_one_simulator_services
)
primary_fingerprint = cast(int, (await wallet_rpc_api.get_logged_in_fingerprint(request={}))["fingerprint"])
primary_fingerprint = (await wallet_rpc_api.get_logged_in_fingerprint(Empty())).fingerprint
assert primary_fingerprint is not None
mnemonic = create_mnemonic()
assert wallet_rpc_api.service.local_keychain is not None
private_key = wallet_rpc_api.service.local_keychain.add_key(mnemonic_or_pk=mnemonic)
secondary_fingerprint: int = private_key.get_g1().get_fingerprint()
await wallet_rpc_api.log_in(request={"fingerprint": primary_fingerprint})
await wallet_rpc_api.log_in(LogIn(fingerprint=primary_fingerprint))
active_fingerprint = cast(int, (await wallet_rpc_api.get_logged_in_fingerprint(request={}))["fingerprint"])
active_fingerprint = (await wallet_rpc_api.get_logged_in_fingerprint(Empty())).fingerprint
assert active_fingerprint == primary_fingerprint
async with init_data_layer_service(wallet_rpc_port=wallet_rpc_port, bt=bt) as data_layer_service:
@@ -2496,7 +2498,7 @@ async def test_wallet_log_in_changes_active_fingerprint(
else: # pragma: no cover
assert False, "unhandled parametrization"
active_fingerprint = cast(int, (await wallet_rpc_api.get_logged_in_fingerprint(request={}))["fingerprint"])
active_fingerprint = (await wallet_rpc_api.get_logged_in_fingerprint(Empty())).fingerprint
assert active_fingerprint == secondary_fingerprint
+52 -22
View File
@@ -57,9 +57,12 @@ from chia.wallet.wallet_node import WalletNode
from chia.wallet.wallet_request_types import (
CreateNewWallet,
CreateNewWalletType,
DIDFindLostDID,
DIDGetCurrentCoinInfo,
DIDGetInfo,
DIDType,
SetWalletResyncOnStartup,
SignMessageByID,
)
from chia.wallet.wallet_rpc_api import WalletRpcApi
from chia.wallet.wallet_spend_bundle import WalletSpendBundle
@@ -695,7 +698,7 @@ async def test_did_auto_transfer_limit(
backup_data,
)
assert did_wallet_10.did_info.origin_coin is not None
await api_1.did_find_lost_did({"coin_id": did_wallet_10.did_info.origin_coin.name().hex()})
await api_1.did_find_lost_did(DIDFindLostDID(coin_id=did_wallet_10.did_info.origin_coin.name().hex()))
await time_out_assert(15, did_wallet_10.get_confirmed_balance, 101)
await time_out_assert(15, did_wallet_10.get_unconfirmed_balance, 101)
@@ -718,7 +721,7 @@ async def test_did_auto_transfer_limit(
# Try and find lost coin
assert did_wallet_9.did_info.origin_coin is not None
await api_1.did_find_lost_did({"coin_id": did_wallet_9.did_info.origin_coin.name().hex()})
await api_1.did_find_lost_did(DIDFindLostDID(coin_id=did_wallet_9.did_info.origin_coin.name().hex()))
did_wallets = list(
filter(
lambda w: w.type == WalletType.DECENTRALIZED_ID.value,
@@ -1103,44 +1106,71 @@ async def test_did_sign_message(wallet_environments: WalletTestFramework, capsys
await DidSignMessageCMD(
rpc_info=wallet_environments.cmd_tx_endpoint_args(env)["rpc_info"],
did_id=CliAddress(did_wallet_1.did_info.origin_coin.name(), did_id, AddressType.DID),
hex_message=message.encode().hex(),
hex_message=message,
).run()
output = capsys.readouterr().out
assert f"Message: {message.encode().hex()}" in output
assert f"Message: {message}" in output
assert "Public Key:" in output
assert "Signature:" in output
response = await api_0.sign_message_by_id({"id": did_id, "message": message})
pubkey = G1Element.from_bytes(bytes.fromhex(output.split("Public Key:")[1].split("\n")[0].strip()))
signature = G2Element.from_bytes(bytes.fromhex(output.split("Signature:")[1].split("\n")[0].strip()))
puzzle: Program = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, message))
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
pubkey,
puzzle.get_tree_hash(),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
signature,
)
# Test hex string
message = "0123456789ABCDEF"
response = await api_0.sign_message_by_id({"id": did_id, "message": message, "is_hex": True})
response = await api_0.sign_message_by_id(
SignMessageByID(
id=encode_puzzle_hash(did_wallet_1.did_info.origin_coin.name(), AddressType.DID.value),
message=message,
is_hex=True,
)
)
puzzle = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, bytes.fromhex(message)))
puzzle = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, bytes.fromhex(message)))
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
response.pubkey,
puzzle.get_tree_hash(),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
response.signature,
)
message = "Hello World"
response = await api_0.sign_message_by_id({"id": did_id, "message": message, "is_hex": False, "safe_mode": False})
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
bytes(message, "utf-8"),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
assert did_wallet_1.did_info.origin_coin is not None
response = await api_0.sign_message_by_id(
SignMessageByID(
id=encode_puzzle_hash(did_wallet_1.did_info.origin_coin.name(), AddressType.DID.value),
message=message,
is_hex=False,
safe_mode=False,
)
)
message = "0123456789ABCDEF"
response = await api_0.sign_message_by_id({"id": did_id, "message": message, "is_hex": True, "safe_mode": False})
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
response.pubkey,
bytes(message, "utf-8"),
response.signature,
)
# Test BLS sign hex
message = "0123456789ABCDEF"
assert did_wallet_1.did_info.origin_coin is not None
response = await api_0.sign_message_by_id(
SignMessageByID(
id=encode_puzzle_hash(did_wallet_1.did_info.origin_coin.name(), AddressType.DID.value),
message=message,
is_hex=True,
safe_mode=False,
)
)
assert AugSchemeMPL.verify(
response.pubkey,
hexstr_to_bytes(message),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
response.signature,
)
@@ -1414,9 +1444,9 @@ async def test_did_resync(
did_wallet_2 = wallet_node_2.wallet_state_manager.get_wallet(uint32(2), DIDWallet)
did_info = did_wallet_2.did_info
# set flag to reset wallet sync data on start
await wallet_api_1.set_wallet_resync_on_startup({"enable": True})
await wallet_api_1.set_wallet_resync_on_startup(SetWalletResyncOnStartup(enable=True))
fingerprint_1 = wallet_node_1.logged_in_fingerprint
await wallet_api_2.set_wallet_resync_on_startup({"enable": True})
await wallet_api_2.set_wallet_resync_on_startup(SetWalletResyncOnStartup(enable=True))
fingerprint_2 = wallet_node_2.logged_in_fingerprint
# 2 reward coins
assert len(await wallet_node_1.wallet_state_manager.coin_store.get_all_unspent_coins()) == 2
+1 -1
View File
@@ -401,7 +401,7 @@ class TestWalletRpc:
wallet_service.config,
) as client:
with pytest.raises(ValueError, match="No peer connected"):
await wallet_service.rpc_server.rpc_api.dl_verify_proof(fake_gpr.to_json_dict())
await wallet_service.rpc_server.rpc_api.dl_verify_proof(fake_gpr)
await wallet_node.server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
await validate_get_routes(client, wallet_service.rpc_server.rpc_api)
+32 -2
View File
@@ -7,7 +7,7 @@ import logging
import re
from operator import attrgetter
from types import SimpleNamespace
from typing import Any
from typing import Any, cast
from unittest.mock import AsyncMock, MagicMock, patch
import aiosqlite
@@ -65,6 +65,7 @@ from chia.util.bech32m import decode_puzzle_hash, encode_puzzle_hash
from chia.util.config import load_config, lock_and_load_config, save_config
from chia.util.db_wrapper import DBWrapper2
from chia.util.hash import std_hash
from chia.util.streamable import Streamable, streamable
from chia.wallet.cat_wallet.cat_constants import DEFAULT_CATS
from chia.wallet.cat_wallet.cat_utils import CAT_MOD, construct_cat_puzzle
from chia.wallet.cat_wallet.cat_wallet import CATWallet
@@ -180,6 +181,8 @@ from chia.wallet.wallet_request_types import (
SpendClawbackCoins,
SplitCoins,
TakeOffer,
TransactionEndpointRequest,
TransactionEndpointResponse,
VCSpend,
VerifySignature,
VerifySignatureResponse,
@@ -188,6 +191,7 @@ from chia.wallet.wallet_request_types import (
)
from chia.wallet.wallet_rpc_api import WalletRpcApi
from chia.wallet.wallet_rpc_client import WalletRpcClient
from chia.wallet.wallet_rpc_metadata import WalletRpcMetadata
from chia.wallet.wallet_spend_bundle import WalletSpendBundle
from chia.wallet.wallet_state_manager import SyncStatus
@@ -2667,7 +2671,7 @@ async def test_get_height_info_response_variants(
api_self = SimpleNamespace(
service=SimpleNamespace(wallet_state_manager=SimpleNamespace(blockchain=mock_blockchain))
)
response = GetHeightInfoResponse.from_json_dict(await WalletRpcApi.get_height_info(api_self, {}))
response = await WalletRpcApi.get_height_info(cast(WalletRpcApi, api_self), GetHeightInfo())
assert isinstance(response, GetHeightInfoResponse)
assert response.height == sync_height
assert response.is_transaction_block == expected_is_tx
@@ -5135,3 +5139,29 @@ def test_miscellaneous_wallet_rpc_errors() -> None:
spent_height=uint32(0),
coinbase=False,
)
@streamable
@dataclasses.dataclass(frozen=True)
class NotATXRequest(Streamable):
pass
@streamable
@dataclasses.dataclass(frozen=True)
class NotATXResponse(Streamable):
pass
class YesATXRequest(TransactionEndpointRequest):
pass
class YesATXResponse(TransactionEndpointResponse):
pass
with pytest.raises(TypeError, match="tx_endpoint request type must subclass TransactionEndpointRequest"):
WalletRpcMetadata(
endpoint_name="foo", tx_endpoint=True, request_type=NotATXRequest, response_type=YesATXResponse
)
with pytest.raises(TypeError, match="tx_endpoint response type must subclass TransactionEndpointResponse"):
WalletRpcMetadata(
endpoint_name="foo", tx_endpoint=True, request_type=YesATXRequest, response_type=NotATXResponse
)
+19 -16
View File
@@ -5,7 +5,7 @@ from pathlib import Path
from typing import Any
import pytest
from chia_rs import AugSchemeMPL, Coin, CoinSpend, G1Element, G2Element
from chia_rs import AugSchemeMPL, Coin, CoinSpend
from chia_rs.sized_bytes import bytes32
from chia_rs.sized_ints import uint8, uint16, uint32, uint64
@@ -37,6 +37,7 @@ from chia.wallet.wallet_request_types import (
GetTransactionMemo,
GetTransactions,
SendTransaction,
SignMessageByAddress,
SpendClawbackCoins,
)
@@ -2153,59 +2154,61 @@ class TestWalletSimulator:
async with env.wallet_state_manager.new_action_scope(wallet_environments.tx_config, push=True) as action_scope:
ph = await action_scope.get_puzzle_hash(env.wallet_state_manager)
response = await api_0.sign_message_by_address({"address": encode_puzzle_hash(ph, "xch"), "message": message})
response = await api_0.sign_message_by_address(
SignMessageByAddress(address=encode_puzzle_hash(ph, "xch"), message=message)
)
puzzle: Program = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, message))
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
response.pubkey,
puzzle.get_tree_hash(),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
response.signature,
)
# Test hex string
message = "0123456789ABCDEF"
response = await api_0.sign_message_by_address(
{"address": encode_puzzle_hash(ph, "xch"), "message": message, "is_hex": True}
SignMessageByAddress(address=encode_puzzle_hash(ph, "xch"), message=message, is_hex=True)
)
puzzle = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, bytes.fromhex(message)))
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
response.pubkey,
puzzle.get_tree_hash(),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
response.signature,
)
# Test informal input
message = "0123456789ABCDEF"
response = await api_0.sign_message_by_address(
{"address": encode_puzzle_hash(ph, "xch"), "message": message, "is_hex": "true", "safe_mode": "true"}
SignMessageByAddress(address=encode_puzzle_hash(ph, "xch"), message=message, is_hex=True, safe_mode=True)
)
puzzle = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, bytes.fromhex(message)))
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
response.pubkey,
puzzle.get_tree_hash(),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
response.signature,
)
# Test BLS sign string
message = "Hello World"
response = await api_0.sign_message_by_address(
{"address": encode_puzzle_hash(ph, "xch"), "message": message, "is_hex": False, "safe_mode": False}
SignMessageByAddress(address=encode_puzzle_hash(ph, "xch"), message=message, is_hex=False, safe_mode=False)
)
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
response.pubkey,
bytes(message, "utf-8"),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
response.signature,
)
# Test BLS sign hex
message = "0123456789ABCDEF"
response = await api_0.sign_message_by_address(
{"address": encode_puzzle_hash(ph, "xch"), "message": message, "is_hex": True, "safe_mode": False}
SignMessageByAddress(address=encode_puzzle_hash(ph, "xch"), message=message, is_hex=True, safe_mode=False)
)
assert AugSchemeMPL.verify(
G1Element.from_bytes(hexstr_to_bytes(response["pubkey"])),
response.pubkey,
hexstr_to_bytes(message),
G2Element.from_bytes(hexstr_to_bytes(response["signature"])),
response.signature,
)
@pytest.mark.parametrize(
+4 -2
View File
@@ -149,6 +149,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
"""
rpc_api: _T_RpcApiProtocol
rpc_api_routes: dict[str, Endpoint]
stop_cb: Callable[[], None]
service_name: str
ssl_context: SSLContext
@@ -183,6 +184,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
ssl_client_context = ssl_context_for_client(ca_cert_path, ca_key_path, crt_path, key_path, log=log)
return cls(
rpc_api,
rpc_api.get_routes(),
stop_cb,
service_name,
ssl_context,
@@ -261,7 +263,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
def _get_routes(self) -> dict[str, Endpoint]:
return {
**self.rpc_api.get_routes(),
**self.rpc_api_routes,
**{path: MethodType(handler, self) for path, handler in self._routes.items()},
}
@@ -381,7 +383,7 @@ class RpcServer(Generic[_T_RpcApiProtocol]):
f_internal: Endpoint | None = getattr(self, command, None)
if f_internal is not None:
return await f_internal(data)
f_rpc_api: Endpoint | None = getattr(self.rpc_api, command, None)
f_rpc_api: Endpoint | None = self.rpc_api_routes.get("/" + command)
if f_rpc_api is not None:
return await f_rpc_api(data)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+565
View File
@@ -0,0 +1,565 @@
# This file is generated by tools/generate_wallet_rpc_client_stub.py
from chia.data_layer.data_layer_util import DLProof, VerifyProofResponse
from chia.rpc.rpc_client import RpcClient
from chia.wallet import wallet_request_types
from chia.wallet.conditions import Condition, ConditionValidTimes
from chia.wallet.puzzles.clawback.metadata import AutoClaimSettings
from chia.wallet.util.tx_config import TXConfig
def client_method_name(endpoint_name: str) -> str: ...
class WalletRpcClient(RpcClient):
async def log_in(
self,
request: wallet_request_types.LogIn,
) -> wallet_request_types.LogInResponse: ...
async def get_logged_in_fingerprint(self) -> wallet_request_types.GetLoggedInFingerprintResponse: ...
async def get_public_keys(self) -> wallet_request_types.GetPublicKeysResponse: ...
async def get_private_key(
self,
request: wallet_request_types.GetPrivateKey,
) -> wallet_request_types.GetPrivateKeyResponse: ...
async def generate_mnemonic(self) -> wallet_request_types.GenerateMnemonicResponse: ...
async def add_key(
self,
request: wallet_request_types.AddKey,
) -> wallet_request_types.AddKeyResponse: ...
async def delete_key(
self,
request: wallet_request_types.DeleteKey,
) -> None: ...
async def check_delete_key(
self,
request: wallet_request_types.CheckDeleteKey,
) -> wallet_request_types.CheckDeleteKeyResponse: ...
async def delete_all_keys(self) -> None: ...
async def set_wallet_resync_on_startup(
self,
request: wallet_request_types.SetWalletResyncOnStartup,
) -> None: ...
async def get_sync_status(self) -> wallet_request_types.GetSyncStatusResponse: ...
async def get_full_node_peer_count(self) -> wallet_request_types.GetFullNodePeerCountResponse: ...
async def get_height_info(
self,
request: wallet_request_types.GetHeightInfo,
) -> wallet_request_types.GetHeightInfoResponse: ...
async def push_tx(
self,
request: wallet_request_types.PushTX,
) -> None: ...
async def push_transactions(
self,
request: wallet_request_types.PushTransactions,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.PushTransactionsResponse: ...
async def get_timestamp_for_height(
self,
request: wallet_request_types.GetTimestampForHeight,
) -> wallet_request_types.GetTimestampForHeightResponse: ...
async def get_fee_estimate(self) -> wallet_request_types.GetFeeEstimateResponse: ...
async def set_auto_claim(
self,
request: AutoClaimSettings,
) -> AutoClaimSettings: ...
async def get_auto_claim(self) -> AutoClaimSettings: ...
async def get_wallets(
self,
request: wallet_request_types.GetWallets,
) -> wallet_request_types.GetWalletsResponse: ...
async def create_new_wallet(
self,
request: wallet_request_types.CreateNewWallet,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CreateNewWalletResponse: ...
async def get_wallet_balance(
self,
request: wallet_request_types.GetWalletBalance,
) -> wallet_request_types.GetWalletBalanceResponse: ...
async def get_wallet_balances(
self,
request: wallet_request_types.GetWalletBalances,
) -> wallet_request_types.GetWalletBalancesResponse: ...
async def get_transaction(
self,
request: wallet_request_types.GetTransaction,
) -> wallet_request_types.GetTransactionResponse: ...
async def get_transactions(
self,
request: wallet_request_types.GetTransactions,
) -> wallet_request_types.GetTransactionsResponse: ...
async def get_transaction_count(
self,
request: wallet_request_types.GetTransactionCount,
) -> wallet_request_types.GetTransactionCountResponse: ...
async def get_next_address(
self,
request: wallet_request_types.GetNextAddress,
) -> wallet_request_types.GetNextAddressResponse: ...
async def send_transaction(
self,
request: wallet_request_types.SendTransaction,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.SendTransactionResponse: ...
async def send_transaction_multi(
self,
request: wallet_request_types.SendTransactionMulti,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.SendTransactionMultiResponse: ...
async def spend_clawback_coins(
self,
request: wallet_request_types.SpendClawbackCoins,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.SpendClawbackCoinsResponse: ...
async def get_farmed_amount(
self,
request: wallet_request_types.GetFarmedAmount,
) -> wallet_request_types.GetFarmedAmountResponse: ...
async def create_signed_transactions(
self,
request: wallet_request_types.CreateSignedTransaction,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CreateSignedTransactionsResponse: ...
async def delete_unconfirmed_transactions(
self,
request: wallet_request_types.DeleteUnconfirmedTransactions,
) -> None: ...
async def select_coins(
self,
request: wallet_request_types.SelectCoins,
) -> wallet_request_types.SelectCoinsResponse: ...
async def get_spendable_coins(
self,
request: wallet_request_types.GetSpendableCoins,
) -> wallet_request_types.GetSpendableCoinsResponse: ...
async def get_coin_records_by_names(
self,
request: wallet_request_types.GetCoinRecordsByNames,
) -> wallet_request_types.GetCoinRecordsByNamesResponse: ...
async def get_puzzle_and_solution(
self,
request: wallet_request_types.GetPuzzleAndSolution,
) -> wallet_request_types.GetPuzzleAndSolutionResponse: ...
async def get_current_derivation_index(self) -> wallet_request_types.GetCurrentDerivationIndexResponse: ...
async def extend_derivation_index(
self,
request: wallet_request_types.ExtendDerivationIndex,
) -> wallet_request_types.ExtendDerivationIndexResponse: ...
async def get_notifications(
self,
request: wallet_request_types.GetNotifications,
) -> wallet_request_types.GetNotificationsResponse: ...
async def delete_notifications(
self,
request: wallet_request_types.DeleteNotifications,
) -> None: ...
async def send_notification(
self,
request: wallet_request_types.SendNotification,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.SendNotificationResponse: ...
async def sign_message_by_address(
self,
request: wallet_request_types.SignMessageByAddress,
) -> wallet_request_types.SignMessageByAddressResponse: ...
async def sign_message_by_id(
self,
request: wallet_request_types.SignMessageByID,
) -> wallet_request_types.SignMessageByIDResponse: ...
async def verify_signature(
self,
request: wallet_request_types.VerifySignature,
) -> wallet_request_types.VerifySignatureResponse: ...
async def get_transaction_memo(
self,
request: wallet_request_types.GetTransactionMemo,
) -> wallet_request_types.GetTransactionMemoResponse: ...
async def split_coins(
self,
request: wallet_request_types.SplitCoins,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.SplitCoinsResponse: ...
async def combine_coins(
self,
request: wallet_request_types.CombineCoins,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CombineCoinsResponse: ...
async def set_cat_name(
self,
request: wallet_request_types.CATSetName,
) -> wallet_request_types.CATSetNameResponse: ...
async def cat_asset_id_to_name(
self,
request: wallet_request_types.CATAssetIDToName,
) -> wallet_request_types.CATAssetIDToNameResponse: ...
async def get_cat_name(
self,
request: wallet_request_types.CATGetName,
) -> wallet_request_types.CATGetNameResponse: ...
async def get_stray_cats(self) -> wallet_request_types.GetStrayCATsResponse: ...
async def cat_spend(
self,
request: wallet_request_types.CATSpend,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CATSpendResponse: ...
async def get_cat_asset_id(
self,
request: wallet_request_types.CATGetAssetID,
) -> wallet_request_types.CATGetAssetIDResponse: ...
async def create_offer_for_ids(
self,
request: wallet_request_types.CreateOfferForIDs,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CreateOfferForIDsResponse: ...
async def get_offer_summary(
self,
request: wallet_request_types.GetOfferSummary,
) -> wallet_request_types.GetOfferSummaryResponse: ...
async def check_offer_validity(
self,
request: wallet_request_types.CheckOfferValidity,
) -> wallet_request_types.CheckOfferValidityResponse: ...
async def take_offer(
self,
request: wallet_request_types.TakeOffer,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.TakeOfferResponse: ...
async def get_offer(
self,
request: wallet_request_types.GetOffer,
) -> wallet_request_types.GetOfferResponse: ...
async def get_all_offers(
self,
request: wallet_request_types.GetAllOffers,
) -> wallet_request_types.GetAllOffersResponse: ...
async def get_offers_count(self) -> wallet_request_types.GetOffersCountResponse: ...
async def cancel_offer(
self,
request: wallet_request_types.CancelOffer,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CancelOfferResponse: ...
async def cancel_offers(
self,
request: wallet_request_types.CancelOffers,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CancelOffersResponse: ...
async def get_cat_list(self) -> wallet_request_types.GetCATListResponse: ...
async def did_set_wallet_name(
self,
request: wallet_request_types.DIDSetWalletName,
) -> wallet_request_types.DIDSetWalletNameResponse: ...
async def did_get_wallet_name(
self,
request: wallet_request_types.DIDGetWalletName,
) -> wallet_request_types.DIDGetWalletNameResponse: ...
async def update_did_metadata(
self,
request: wallet_request_types.DIDUpdateMetadata,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.DIDUpdateMetadataResponse: ...
async def get_did_pubkey(
self,
request: wallet_request_types.DIDGetPubkey,
) -> wallet_request_types.DIDGetPubkeyResponse: ...
async def get_did_id(
self,
request: wallet_request_types.DIDGetDID,
) -> wallet_request_types.DIDGetDIDResponse: ...
async def get_did_metadata(
self,
request: wallet_request_types.DIDGetMetadata,
) -> wallet_request_types.DIDGetMetadataResponse: ...
async def did_get_current_coin_info(
self,
request: wallet_request_types.DIDGetCurrentCoinInfo,
) -> wallet_request_types.DIDGetCurrentCoinInfoResponse: ...
async def create_did_backup_file(
self,
request: wallet_request_types.DIDCreateBackupFile,
) -> wallet_request_types.DIDCreateBackupFileResponse: ...
async def did_transfer_did(
self,
request: wallet_request_types.DIDTransferDID,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.DIDTransferDIDResponse: ...
async def did_message_spend(
self,
request: wallet_request_types.DIDMessageSpend,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.DIDMessageSpendResponse: ...
async def get_did_info(
self,
request: wallet_request_types.DIDGetInfo,
) -> wallet_request_types.DIDGetInfoResponse: ...
async def find_lost_did(
self,
request: wallet_request_types.DIDFindLostDID,
) -> wallet_request_types.DIDFindLostDIDResponse: ...
async def mint_nft(
self,
request: wallet_request_types.NFTMintNFTRequest,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.NFTMintNFTResponse: ...
async def count_nfts(
self,
request: wallet_request_types.NFTCountNFTs,
) -> wallet_request_types.NFTCountNFTsResponse: ...
async def list_nfts(
self,
request: wallet_request_types.NFTGetNFTs,
) -> wallet_request_types.NFTGetNFTsResponse: ...
async def get_nft_wallet_by_did(
self,
request: wallet_request_types.NFTGetByDID,
) -> wallet_request_types.NFTGetByDIDResponse: ...
async def set_nft_did(
self,
request: wallet_request_types.NFTSetNFTDID,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.NFTSetNFTDIDResponse: ...
async def set_nft_status(
self,
request: wallet_request_types.NFTSetNFTStatus,
) -> None: ...
async def get_nft_wallet_did(
self,
request: wallet_request_types.NFTGetWalletDID,
) -> wallet_request_types.NFTGetWalletDIDResponse: ...
async def get_nft_wallets_with_dids(self) -> wallet_request_types.NFTGetWalletsWithDIDsResponse: ...
async def get_nft_info(
self,
request: wallet_request_types.NFTGetInfo,
) -> wallet_request_types.NFTGetInfoResponse: ...
async def transfer_nft(
self,
request: wallet_request_types.NFTTransferNFT,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.NFTTransferNFTResponse: ...
async def add_uri_to_nft(
self,
request: wallet_request_types.NFTAddURI,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.NFTAddURIResponse: ...
async def nft_calculate_royalties(
self,
request: wallet_request_types.NFTCalculateRoyalties,
) -> wallet_request_types.NFTCalculateRoyaltiesResponse: ...
async def nft_mint_bulk(
self,
request: wallet_request_types.NFTMintBulk,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.NFTMintBulkResponse: ...
async def set_nft_did_bulk(
self,
request: wallet_request_types.NFTSetDIDBulk,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.NFTSetDIDBulkResponse: ...
async def transfer_nft_bulk(
self,
request: wallet_request_types.NFTTransferBulk,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.NFTTransferBulkResponse: ...
async def register_remote_coins(
self,
request: wallet_request_types.RegisterRemoteCoins,
) -> None: ...
async def get_coin_records(
self,
request: wallet_request_types.GetCoinRecords,
) -> wallet_request_types.GetCoinRecordsResponse: ...
async def pw_join_pool(
self,
request: wallet_request_types.PWJoinPool,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.PWJoinPoolResponse: ...
async def pw_self_pool(
self,
request: wallet_request_types.PWSelfPool,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.PWSelfPoolResponse: ...
async def pw_absorb_rewards(
self,
request: wallet_request_types.PWAbsorbRewards,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.PWAbsorbRewardsResponse: ...
async def pw_status(
self,
request: wallet_request_types.PWStatus,
) -> wallet_request_types.PWStatusResponse: ...
async def create_new_dl(
self,
request: wallet_request_types.CreateNewDL,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CreateNewDLResponse: ...
async def dl_track_new(
self,
request: wallet_request_types.DLTrackNew,
) -> None: ...
async def dl_stop_tracking(
self,
request: wallet_request_types.DLStopTracking,
) -> None: ...
async def dl_latest_singleton(
self,
request: wallet_request_types.DLLatestSingleton,
) -> wallet_request_types.DLLatestSingletonResponse: ...
async def dl_singletons_by_root(
self,
request: wallet_request_types.DLSingletonsByRoot,
) -> wallet_request_types.DLSingletonsByRootResponse: ...
async def dl_update_root(
self,
request: wallet_request_types.DLUpdateRoot,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.DLUpdateRootResponse: ...
async def dl_update_multiple(
self,
request: wallet_request_types.DLUpdateMultiple,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.DLUpdateMultipleResponse: ...
async def dl_history(
self,
request: wallet_request_types.DLHistory,
) -> wallet_request_types.DLHistoryResponse: ...
async def dl_owned_singletons(self) -> wallet_request_types.DLOwnedSingletonsResponse: ...
async def dl_get_mirrors(
self,
request: wallet_request_types.DLGetMirrors,
) -> wallet_request_types.DLGetMirrorsResponse: ...
async def dl_new_mirror(
self,
request: wallet_request_types.DLNewMirror,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.DLNewMirrorResponse: ...
async def dl_delete_mirror(
self,
request: wallet_request_types.DLDeleteMirror,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.DLDeleteMirrorResponse: ...
async def dl_verify_proof(
self,
request: DLProof,
) -> VerifyProofResponse: ...
async def vc_mint(
self,
request: wallet_request_types.VCMint,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.VCMintResponse: ...
async def vc_get(
self,
request: wallet_request_types.VCGet,
) -> wallet_request_types.VCGetResponse: ...
async def vc_get_list(
self,
request: wallet_request_types.VCGetList,
) -> wallet_request_types.VCGetListResponse: ...
async def vc_spend(
self,
request: wallet_request_types.VCSpend,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.VCSpendResponse: ...
async def vc_add_proofs(
self,
request: wallet_request_types.VCAddProofs,
) -> None: ...
async def vc_get_proofs_for_root(
self,
request: wallet_request_types.VCGetProofsForRoot,
) -> wallet_request_types.VCGetProofsForRootResponse: ...
async def vc_revoke(
self,
request: wallet_request_types.VCRevoke,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.VCRevokeResponse: ...
async def crcat_approve_pending(
self,
request: wallet_request_types.CRCATApprovePending,
tx_config: TXConfig,
extra_conditions: tuple[Condition, ...] = ...,
timelock_info: ConditionValidTimes = ...,
) -> wallet_request_types.CRCATApprovePendingResponse: ...
async def gather_signing_info(
self,
request: wallet_request_types.GatherSigningInfo,
) -> wallet_request_types.GatherSigningInfoResponse: ...
async def apply_signatures(
self,
request: wallet_request_types.ApplySignatures,
) -> wallet_request_types.ApplySignaturesResponse: ...
async def submit_transactions(
self,
request: wallet_request_types.SubmitTransactions,
) -> wallet_request_types.SubmitTransactionsResponse: ...
async def execute_signing_instructions(
self,
request: wallet_request_types.ExecuteSigningInstructions,
) -> wallet_request_types.ExecuteSigningInstructionsResponse: ...
+724
View File
@@ -0,0 +1,724 @@
from __future__ import annotations
from dataclasses import dataclass
from chia.data_layer.data_layer_util import DLProof, VerifyProofResponse
from chia.util.streamable import Streamable
from chia.wallet import wallet_request_types
from chia.wallet.puzzles.clawback.metadata import AutoClaimSettings
@dataclass(frozen=True, kw_only=True)
class RpcMetadata:
endpoint_name: str
request_type: type[Streamable]
response_type: type[Streamable]
@dataclass(frozen=True, kw_only=True)
class WalletRpcMetadata(RpcMetadata):
tx_endpoint: bool = False
auto_push: bool = False
auto_merge_spends: bool = True
def __post_init__(self) -> None:
if self.tx_endpoint and not issubclass(self.request_type, wallet_request_types.TransactionEndpointRequest):
raise TypeError("tx_endpoint request type must subclass TransactionEndpointRequest")
if self.tx_endpoint and not issubclass(self.response_type, wallet_request_types.TransactionEndpointResponse):
raise TypeError("tx_endpoint response type must subclass TransactionEndpointResponse")
WALLET_RPC_ENDPOINT_METADATA: list[WalletRpcMetadata] = [
# Key management
WalletRpcMetadata(
endpoint_name="log_in",
request_type=wallet_request_types.LogIn,
response_type=wallet_request_types.LogInResponse,
),
WalletRpcMetadata(
endpoint_name="get_logged_in_fingerprint",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetLoggedInFingerprintResponse,
),
WalletRpcMetadata(
endpoint_name="get_public_keys",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetPublicKeysResponse,
),
WalletRpcMetadata(
endpoint_name="get_private_key",
request_type=wallet_request_types.GetPrivateKey,
response_type=wallet_request_types.GetPrivateKeyResponse,
),
WalletRpcMetadata(
endpoint_name="generate_mnemonic",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GenerateMnemonicResponse,
),
WalletRpcMetadata(
endpoint_name="add_key",
request_type=wallet_request_types.AddKey,
response_type=wallet_request_types.AddKeyResponse,
),
WalletRpcMetadata(
endpoint_name="delete_key",
request_type=wallet_request_types.DeleteKey,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="check_delete_key",
request_type=wallet_request_types.CheckDeleteKey,
response_type=wallet_request_types.CheckDeleteKeyResponse,
),
WalletRpcMetadata(
endpoint_name="delete_all_keys",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.Empty,
),
# Wallet node
WalletRpcMetadata(
endpoint_name="set_wallet_resync_on_startup",
request_type=wallet_request_types.SetWalletResyncOnStartup,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="get_sync_status",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetSyncStatusResponse,
),
WalletRpcMetadata(
endpoint_name="get_full_node_peer_count",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetFullNodePeerCountResponse,
),
WalletRpcMetadata(
endpoint_name="get_height_info",
request_type=wallet_request_types.GetHeightInfo,
response_type=wallet_request_types.GetHeightInfoResponse,
),
WalletRpcMetadata(
endpoint_name="push_tx",
request_type=wallet_request_types.PushTX,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="push_transactions",
request_type=wallet_request_types.PushTransactions,
response_type=wallet_request_types.PushTransactionsResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="get_timestamp_for_height",
request_type=wallet_request_types.GetTimestampForHeight,
response_type=wallet_request_types.GetTimestampForHeightResponse,
),
WalletRpcMetadata(
endpoint_name="get_fee_estimate",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetFeeEstimateResponse,
),
WalletRpcMetadata(
endpoint_name="set_auto_claim",
request_type=AutoClaimSettings,
response_type=AutoClaimSettings,
),
WalletRpcMetadata(
endpoint_name="get_auto_claim",
request_type=wallet_request_types.Empty,
response_type=AutoClaimSettings,
),
# Wallet management
WalletRpcMetadata(
endpoint_name="get_wallets",
request_type=wallet_request_types.GetWallets,
response_type=wallet_request_types.GetWalletsResponse,
),
WalletRpcMetadata(
endpoint_name="create_new_wallet",
request_type=wallet_request_types.CreateNewWallet,
response_type=wallet_request_types.CreateNewWalletResponse,
tx_endpoint=True,
auto_push=True,
),
# Wallet
WalletRpcMetadata(
endpoint_name="get_wallet_balance",
request_type=wallet_request_types.GetWalletBalance,
response_type=wallet_request_types.GetWalletBalanceResponse,
),
WalletRpcMetadata(
endpoint_name="get_wallet_balances",
request_type=wallet_request_types.GetWalletBalances,
response_type=wallet_request_types.GetWalletBalancesResponse,
),
WalletRpcMetadata(
endpoint_name="get_transaction",
request_type=wallet_request_types.GetTransaction,
response_type=wallet_request_types.GetTransactionResponse,
),
WalletRpcMetadata(
endpoint_name="get_transactions",
request_type=wallet_request_types.GetTransactions,
response_type=wallet_request_types.GetTransactionsResponse,
),
WalletRpcMetadata(
endpoint_name="get_transaction_count",
request_type=wallet_request_types.GetTransactionCount,
response_type=wallet_request_types.GetTransactionCountResponse,
),
WalletRpcMetadata(
endpoint_name="get_next_address",
request_type=wallet_request_types.GetNextAddress,
response_type=wallet_request_types.GetNextAddressResponse,
),
WalletRpcMetadata(
endpoint_name="send_transaction",
request_type=wallet_request_types.SendTransaction,
response_type=wallet_request_types.SendTransactionResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="send_transaction_multi",
request_type=wallet_request_types.SendTransactionMulti,
response_type=wallet_request_types.SendTransactionMultiResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="spend_clawback_coins",
request_type=wallet_request_types.SpendClawbackCoins,
response_type=wallet_request_types.SpendClawbackCoinsResponse,
tx_endpoint=True,
auto_push=True,
auto_merge_spends=False,
),
# get_coin_records remains a legacy untyped endpoint.
WalletRpcMetadata(
endpoint_name="get_farmed_amount",
request_type=wallet_request_types.GetFarmedAmount,
response_type=wallet_request_types.GetFarmedAmountResponse,
),
WalletRpcMetadata(
endpoint_name="create_signed_transaction",
request_type=wallet_request_types.CreateSignedTransaction,
response_type=wallet_request_types.CreateSignedTransactionsResponse,
tx_endpoint=True,
),
WalletRpcMetadata(
endpoint_name="delete_unconfirmed_transactions",
request_type=wallet_request_types.DeleteUnconfirmedTransactions,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="select_coins",
request_type=wallet_request_types.SelectCoins,
response_type=wallet_request_types.SelectCoinsResponse,
),
WalletRpcMetadata(
endpoint_name="get_spendable_coins",
request_type=wallet_request_types.GetSpendableCoins,
response_type=wallet_request_types.GetSpendableCoinsResponse,
),
WalletRpcMetadata(
endpoint_name="get_coin_records_by_names",
request_type=wallet_request_types.GetCoinRecordsByNames,
response_type=wallet_request_types.GetCoinRecordsByNamesResponse,
),
WalletRpcMetadata(
endpoint_name="get_puzzle_and_solution",
request_type=wallet_request_types.GetPuzzleAndSolution,
response_type=wallet_request_types.GetPuzzleAndSolutionResponse,
),
WalletRpcMetadata(
endpoint_name="get_current_derivation_index",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetCurrentDerivationIndexResponse,
),
WalletRpcMetadata(
endpoint_name="extend_derivation_index",
request_type=wallet_request_types.ExtendDerivationIndex,
response_type=wallet_request_types.ExtendDerivationIndexResponse,
),
WalletRpcMetadata(
endpoint_name="get_notifications",
request_type=wallet_request_types.GetNotifications,
response_type=wallet_request_types.GetNotificationsResponse,
),
WalletRpcMetadata(
endpoint_name="delete_notifications",
request_type=wallet_request_types.DeleteNotifications,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="send_notification",
request_type=wallet_request_types.SendNotification,
response_type=wallet_request_types.SendNotificationResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="sign_message_by_address",
request_type=wallet_request_types.SignMessageByAddress,
response_type=wallet_request_types.SignMessageByAddressResponse,
),
WalletRpcMetadata(
endpoint_name="sign_message_by_id",
request_type=wallet_request_types.SignMessageByID,
response_type=wallet_request_types.SignMessageByIDResponse,
),
WalletRpcMetadata(
endpoint_name="verify_signature",
request_type=wallet_request_types.VerifySignature,
response_type=wallet_request_types.VerifySignatureResponse,
),
WalletRpcMetadata(
endpoint_name="get_transaction_memo",
request_type=wallet_request_types.GetTransactionMemo,
response_type=wallet_request_types.GetTransactionMemoResponse,
),
WalletRpcMetadata(
endpoint_name="split_coins",
request_type=wallet_request_types.SplitCoins,
response_type=wallet_request_types.SplitCoinsResponse,
tx_endpoint=True,
),
WalletRpcMetadata(
endpoint_name="combine_coins",
request_type=wallet_request_types.CombineCoins,
response_type=wallet_request_types.CombineCoinsResponse,
tx_endpoint=True,
),
# CATs and trading
WalletRpcMetadata(
endpoint_name="cat_set_name",
request_type=wallet_request_types.CATSetName,
response_type=wallet_request_types.CATSetNameResponse,
),
WalletRpcMetadata(
endpoint_name="cat_asset_id_to_name",
request_type=wallet_request_types.CATAssetIDToName,
response_type=wallet_request_types.CATAssetIDToNameResponse,
),
WalletRpcMetadata(
endpoint_name="cat_get_name",
request_type=wallet_request_types.CATGetName,
response_type=wallet_request_types.CATGetNameResponse,
),
WalletRpcMetadata(
endpoint_name="get_stray_cats",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetStrayCATsResponse,
),
WalletRpcMetadata(
endpoint_name="cat_spend",
request_type=wallet_request_types.CATSpend,
response_type=wallet_request_types.CATSpendResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="cat_get_asset_id",
request_type=wallet_request_types.CATGetAssetID,
response_type=wallet_request_types.CATGetAssetIDResponse,
),
WalletRpcMetadata(
endpoint_name="create_offer_for_ids",
request_type=wallet_request_types.CreateOfferForIDs,
response_type=wallet_request_types.CreateOfferForIDsResponse,
tx_endpoint=True,
),
WalletRpcMetadata(
endpoint_name="get_offer_summary",
request_type=wallet_request_types.GetOfferSummary,
response_type=wallet_request_types.GetOfferSummaryResponse,
),
WalletRpcMetadata(
endpoint_name="check_offer_validity",
request_type=wallet_request_types.CheckOfferValidity,
response_type=wallet_request_types.CheckOfferValidityResponse,
),
WalletRpcMetadata(
endpoint_name="take_offer",
request_type=wallet_request_types.TakeOffer,
response_type=wallet_request_types.TakeOfferResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="get_offer",
request_type=wallet_request_types.GetOffer,
response_type=wallet_request_types.GetOfferResponse,
),
WalletRpcMetadata(
endpoint_name="get_all_offers",
request_type=wallet_request_types.GetAllOffers,
response_type=wallet_request_types.GetAllOffersResponse,
),
WalletRpcMetadata(
endpoint_name="get_offers_count",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetOffersCountResponse,
),
WalletRpcMetadata(
endpoint_name="cancel_offer",
request_type=wallet_request_types.CancelOffer,
response_type=wallet_request_types.CancelOfferResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="cancel_offers",
request_type=wallet_request_types.CancelOffers,
response_type=wallet_request_types.CancelOffersResponse,
tx_endpoint=True,
auto_push=True,
auto_merge_spends=False,
),
WalletRpcMetadata(
endpoint_name="get_cat_list",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.GetCATListResponse,
),
# DID wallet
WalletRpcMetadata(
endpoint_name="did_set_wallet_name",
request_type=wallet_request_types.DIDSetWalletName,
response_type=wallet_request_types.DIDSetWalletNameResponse,
),
WalletRpcMetadata(
endpoint_name="did_get_wallet_name",
request_type=wallet_request_types.DIDGetWalletName,
response_type=wallet_request_types.DIDGetWalletNameResponse,
),
WalletRpcMetadata(
endpoint_name="did_update_metadata",
request_type=wallet_request_types.DIDUpdateMetadata,
response_type=wallet_request_types.DIDUpdateMetadataResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="did_get_pubkey",
request_type=wallet_request_types.DIDGetPubkey,
response_type=wallet_request_types.DIDGetPubkeyResponse,
),
WalletRpcMetadata(
endpoint_name="did_get_did",
request_type=wallet_request_types.DIDGetDID,
response_type=wallet_request_types.DIDGetDIDResponse,
),
WalletRpcMetadata(
endpoint_name="did_get_metadata",
request_type=wallet_request_types.DIDGetMetadata,
response_type=wallet_request_types.DIDGetMetadataResponse,
),
WalletRpcMetadata(
endpoint_name="did_get_current_coin_info",
request_type=wallet_request_types.DIDGetCurrentCoinInfo,
response_type=wallet_request_types.DIDGetCurrentCoinInfoResponse,
),
WalletRpcMetadata(
endpoint_name="did_create_backup_file",
request_type=wallet_request_types.DIDCreateBackupFile,
response_type=wallet_request_types.DIDCreateBackupFileResponse,
),
WalletRpcMetadata(
endpoint_name="did_transfer_did",
request_type=wallet_request_types.DIDTransferDID,
response_type=wallet_request_types.DIDTransferDIDResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="did_message_spend",
request_type=wallet_request_types.DIDMessageSpend,
response_type=wallet_request_types.DIDMessageSpendResponse,
tx_endpoint=True,
),
WalletRpcMetadata(
endpoint_name="did_get_info",
request_type=wallet_request_types.DIDGetInfo,
response_type=wallet_request_types.DIDGetInfoResponse,
),
WalletRpcMetadata(
endpoint_name="did_find_lost_did",
request_type=wallet_request_types.DIDFindLostDID,
response_type=wallet_request_types.DIDFindLostDIDResponse,
),
# NFT wallet
WalletRpcMetadata(
endpoint_name="nft_mint_nft",
request_type=wallet_request_types.NFTMintNFTRequest,
response_type=wallet_request_types.NFTMintNFTResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="nft_count_nfts",
request_type=wallet_request_types.NFTCountNFTs,
response_type=wallet_request_types.NFTCountNFTsResponse,
),
WalletRpcMetadata(
endpoint_name="nft_get_nfts",
request_type=wallet_request_types.NFTGetNFTs,
response_type=wallet_request_types.NFTGetNFTsResponse,
),
WalletRpcMetadata(
endpoint_name="nft_get_by_did",
request_type=wallet_request_types.NFTGetByDID,
response_type=wallet_request_types.NFTGetByDIDResponse,
),
WalletRpcMetadata(
endpoint_name="nft_set_nft_did",
request_type=wallet_request_types.NFTSetNFTDID,
response_type=wallet_request_types.NFTSetNFTDIDResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="nft_set_nft_status",
request_type=wallet_request_types.NFTSetNFTStatus,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="nft_get_wallet_did",
request_type=wallet_request_types.NFTGetWalletDID,
response_type=wallet_request_types.NFTGetWalletDIDResponse,
),
WalletRpcMetadata(
endpoint_name="nft_get_wallets_with_dids",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.NFTGetWalletsWithDIDsResponse,
),
WalletRpcMetadata(
endpoint_name="nft_get_info",
request_type=wallet_request_types.NFTGetInfo,
response_type=wallet_request_types.NFTGetInfoResponse,
),
WalletRpcMetadata(
endpoint_name="nft_transfer_nft",
request_type=wallet_request_types.NFTTransferNFT,
response_type=wallet_request_types.NFTTransferNFTResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="nft_add_uri",
request_type=wallet_request_types.NFTAddURI,
response_type=wallet_request_types.NFTAddURIResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="nft_calculate_royalties",
request_type=wallet_request_types.NFTCalculateRoyalties,
response_type=wallet_request_types.NFTCalculateRoyaltiesResponse,
),
WalletRpcMetadata(
endpoint_name="nft_mint_bulk",
request_type=wallet_request_types.NFTMintBulk,
response_type=wallet_request_types.NFTMintBulkResponse,
tx_endpoint=True,
),
WalletRpcMetadata(
endpoint_name="nft_set_did_bulk",
request_type=wallet_request_types.NFTSetDIDBulk,
response_type=wallet_request_types.NFTSetDIDBulkResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="nft_transfer_bulk",
request_type=wallet_request_types.NFTTransferBulk,
response_type=wallet_request_types.NFTTransferBulkResponse,
tx_endpoint=True,
auto_push=True,
),
# Remote wallet
WalletRpcMetadata(
endpoint_name="register_remote_coins",
request_type=wallet_request_types.RegisterRemoteCoins,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="get_coin_records",
request_type=wallet_request_types.GetCoinRecords,
response_type=wallet_request_types.GetCoinRecordsResponse,
),
# Pool wallet
WalletRpcMetadata(
endpoint_name="pw_join_pool",
request_type=wallet_request_types.PWJoinPool,
response_type=wallet_request_types.PWJoinPoolResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="pw_self_pool",
request_type=wallet_request_types.PWSelfPool,
response_type=wallet_request_types.PWSelfPoolResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="pw_absorb_rewards",
request_type=wallet_request_types.PWAbsorbRewards,
response_type=wallet_request_types.PWAbsorbRewardsResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="pw_status",
request_type=wallet_request_types.PWStatus,
response_type=wallet_request_types.PWStatusResponse,
),
# Data layer wallet
WalletRpcMetadata(
endpoint_name="create_new_dl",
request_type=wallet_request_types.CreateNewDL,
response_type=wallet_request_types.CreateNewDLResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="dl_track_new",
request_type=wallet_request_types.DLTrackNew,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="dl_stop_tracking",
request_type=wallet_request_types.DLStopTracking,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="dl_latest_singleton",
request_type=wallet_request_types.DLLatestSingleton,
response_type=wallet_request_types.DLLatestSingletonResponse,
),
WalletRpcMetadata(
endpoint_name="dl_singletons_by_root",
request_type=wallet_request_types.DLSingletonsByRoot,
response_type=wallet_request_types.DLSingletonsByRootResponse,
),
WalletRpcMetadata(
endpoint_name="dl_update_root",
request_type=wallet_request_types.DLUpdateRoot,
response_type=wallet_request_types.DLUpdateRootResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="dl_update_multiple",
request_type=wallet_request_types.DLUpdateMultiple,
response_type=wallet_request_types.DLUpdateMultipleResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="dl_history",
request_type=wallet_request_types.DLHistory,
response_type=wallet_request_types.DLHistoryResponse,
),
WalletRpcMetadata(
endpoint_name="dl_owned_singletons",
request_type=wallet_request_types.Empty,
response_type=wallet_request_types.DLOwnedSingletonsResponse,
),
WalletRpcMetadata(
endpoint_name="dl_get_mirrors",
request_type=wallet_request_types.DLGetMirrors,
response_type=wallet_request_types.DLGetMirrorsResponse,
),
WalletRpcMetadata(
endpoint_name="dl_new_mirror",
request_type=wallet_request_types.DLNewMirror,
response_type=wallet_request_types.DLNewMirrorResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="dl_delete_mirror",
request_type=wallet_request_types.DLDeleteMirror,
response_type=wallet_request_types.DLDeleteMirrorResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="dl_verify_proof",
request_type=DLProof,
response_type=VerifyProofResponse,
),
# Verified credentials
WalletRpcMetadata(
endpoint_name="vc_mint",
request_type=wallet_request_types.VCMint,
response_type=wallet_request_types.VCMintResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="vc_get",
request_type=wallet_request_types.VCGet,
response_type=wallet_request_types.VCGetResponse,
),
WalletRpcMetadata(
endpoint_name="vc_get_list",
request_type=wallet_request_types.VCGetList,
response_type=wallet_request_types.VCGetListResponse,
),
WalletRpcMetadata(
endpoint_name="vc_spend",
request_type=wallet_request_types.VCSpend,
response_type=wallet_request_types.VCSpendResponse,
tx_endpoint=True,
auto_push=True,
),
WalletRpcMetadata(
endpoint_name="vc_add_proofs",
request_type=wallet_request_types.VCAddProofs,
response_type=wallet_request_types.Empty,
),
WalletRpcMetadata(
endpoint_name="vc_get_proofs_for_root",
request_type=wallet_request_types.VCGetProofsForRoot,
response_type=wallet_request_types.VCGetProofsForRootResponse,
),
WalletRpcMetadata(
endpoint_name="vc_revoke",
request_type=wallet_request_types.VCRevoke,
response_type=wallet_request_types.VCRevokeResponse,
tx_endpoint=True,
auto_push=True,
),
# CR-CATs
WalletRpcMetadata(
endpoint_name="crcat_approve_pending",
request_type=wallet_request_types.CRCATApprovePending,
response_type=wallet_request_types.CRCATApprovePendingResponse,
tx_endpoint=True,
auto_push=True,
),
# Signer protocol
WalletRpcMetadata(
endpoint_name="gather_signing_info",
request_type=wallet_request_types.GatherSigningInfo,
response_type=wallet_request_types.GatherSigningInfoResponse,
),
WalletRpcMetadata(
endpoint_name="apply_signatures",
request_type=wallet_request_types.ApplySignatures,
response_type=wallet_request_types.ApplySignaturesResponse,
),
WalletRpcMetadata(
endpoint_name="submit_transactions",
request_type=wallet_request_types.SubmitTransactions,
response_type=wallet_request_types.SubmitTransactionsResponse,
),
WalletRpcMetadata(
endpoint_name="execute_signing_instructions",
request_type=wallet_request_types.ExecuteSigningInstructions,
response_type=wallet_request_types.ExecuteSigningInstructionsResponse,
),
]
+89
View File
@@ -0,0 +1,89 @@
#!/usr/bin/env python3
from __future__ import annotations
from pathlib import Path
from chia.wallet import wallet_rpc_client
from chia.wallet.wallet_request_types import Empty
from chia.wallet.wallet_rpc_metadata import WALLET_RPC_ENDPOINT_METADATA
REPO_ROOT = Path(__file__).resolve().parents[1]
OUTPUT_PATH = REPO_ROOT / "chia" / "wallet" / "wallet_rpc_client.pyi"
def _type_name(cls: type) -> str:
return cls.__name__
def _import_name(cls: type) -> str:
return cls.__module__
def generate() -> str:
methods: list[str] = []
for meta in WALLET_RPC_ENDPOINT_METADATA:
method_name = wallet_rpc_client.client_method_name(meta.endpoint_name)
request_type = meta.request_type
response_type = meta.response_type
if response_type is Empty:
response_ann = "None"
elif _import_name(response_type) == "chia.wallet.wallet_request_types":
response_ann = "wallet_request_types." + _type_name(response_type)
else:
response_ann = _type_name(response_type)
if _import_name(request_type) == "chia.wallet.wallet_request_types":
request_ann = "wallet_request_types." + _type_name(request_type)
else:
request_ann = _type_name(request_type)
if meta.tx_endpoint:
methods.append(
f" async def {method_name}(\n"
f" self,\n"
f" request: {request_ann},\n"
f" tx_config: TXConfig,\n"
f" extra_conditions: tuple[Condition, ...] = ...,\n"
f" timelock_info: ConditionValidTimes = ...,\n"
f" ) -> {response_ann}: ..."
)
elif request_type is Empty:
methods.append(f" async def {method_name}(self) -> {response_ann}: ...")
else:
methods.append(
f" async def {method_name}(\n"
" self,\n"
f" request: {request_ann},\n"
f" ) -> {response_ann}: ..."
)
body = "\n".join(
[
"# This file is generated by tools/generate_wallet_rpc_client_stub.py",
"from chia.data_layer.data_layer_util import DLProof, VerifyProofResponse",
"from chia.rpc.rpc_client import RpcClient",
"from chia.wallet import wallet_request_types",
"from chia.wallet.conditions import Condition, ConditionValidTimes",
"from chia.wallet.puzzles.clawback.metadata import AutoClaimSettings",
"from chia.wallet.util.tx_config import TXConfig",
"",
"def client_method_name(endpoint_name: str) -> str: ...",
"",
"class WalletRpcClient(RpcClient):",
*methods,
"",
]
)
return body
def main() -> None:
OUTPUT_PATH.write_text(generate(), encoding="utf-8", newline="\n")
print(f"Wrote {OUTPUT_PATH}")
if __name__ == "__main__":
main()