Skip to content

Commit f4945e9

Browse files
committed
Port get_next_address
1 parent 2dfe433 commit f4945e9

File tree

7 files changed

+55
-37
lines changed

7 files changed

+55
-37
lines changed

chia/_tests/cmds/cmd_test_utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
from chia.wallet.util.tx_config import CoinSelectionConfig, TXConfig
3535
from chia.wallet.util.wallet_types import WalletType
3636
from chia.wallet.wallet_request_types import (
37+
GetNextAddress,
38+
GetNextAddressResponse,
3739
GetSyncStatusResponse,
3840
GetTransaction,
3941
GetTransactionResponse,
@@ -250,13 +252,13 @@ async def get_spendable_coins(
250252
unconfirmed_additions = [Coin(bytes32([7] * 32), bytes32([8] * 32), uint64(1234580000))]
251253
return confirmed_records, unconfirmed_removals, unconfirmed_additions
252254

253-
async def get_next_address(self, wallet_id: int, new_address: bool) -> str:
254-
self.add_to_log("get_next_address", (wallet_id, new_address))
255+
async def get_next_address(self, request: GetNextAddress) -> GetNextAddressResponse:
256+
self.add_to_log("get_next_address", (request.wallet_id, request.new_address))
255257
addr = encode_puzzle_hash(bytes32([self.wallet_index] * 32), "xch")
256258
self.wallet_index += 1
257259
if self.wallet_index > 254:
258260
self.wallet_index = 1
259-
return addr
261+
return GetNextAddressResponse(request.wallet_id, addr)
260262

261263
async def send_transaction_multi(
262264
self,

chia/_tests/cmds/wallet/test_wallet.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
CreateOfferForIDsResponse,
4848
FungibleAsset,
4949
GetHeightInfoResponse,
50+
GetNextAddress,
51+
GetNextAddressResponse,
5052
GetTransaction,
5153
GetTransactions,
5254
GetTransactionsResponse,
@@ -493,11 +495,11 @@ def test_get_address(capsys: object, get_test_cli_clients: tuple[TestRpcClients,
493495

494496
# set RPC Client
495497
class GetAddressWalletRpcClient(TestWalletRpcClient):
496-
async def get_next_address(self, wallet_id: int, new_address: bool) -> str:
497-
self.add_to_log("get_next_address", (wallet_id, new_address))
498-
if new_address:
499-
return encode_puzzle_hash(get_bytes32(3), "xch")
500-
return encode_puzzle_hash(get_bytes32(4), "xch")
498+
async def get_next_address(self, request: GetNextAddress) -> GetNextAddressResponse:
499+
self.add_to_log("get_next_address", (request.wallet_id, request.new_address))
500+
if request.new_address:
501+
return GetNextAddressResponse(request.wallet_id, encode_puzzle_hash(get_bytes32(3), "xch"))
502+
return GetNextAddressResponse(request.wallet_id, encode_puzzle_hash(get_bytes32(4), "xch"))
501503

502504
inst_rpc_client = GetAddressWalletRpcClient()
503505
test_rpc_clients.wallet_rpc_client = inst_rpc_client

chia/_tests/wallet/rpc/test_wallet_rpc.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
DIDTransferDID,
119119
DIDUpdateMetadata,
120120
FungibleAsset,
121+
GetNextAddress,
121122
GetNotifications,
122123
GetPrivateKey,
123124
GetSyncStatusResponse,
@@ -195,11 +196,11 @@ async def farm_transaction(
195196

196197

197198
async def generate_funds(full_node_api: FullNodeSimulator, wallet_bundle: WalletBundle, num_blocks: int = 1) -> int:
198-
wallet_id = 1
199-
initial_balances = (
200-
await wallet_bundle.rpc_client.get_wallet_balance(GetWalletBalance(uint32(wallet_id)))
201-
).wallet_balance
202-
ph: bytes32 = decode_puzzle_hash(await wallet_bundle.rpc_client.get_next_address(wallet_id, True))
199+
wallet_id = uint32(1)
200+
initial_balances = (await wallet_bundle.rpc_client.get_wallet_balance(GetWalletBalance(wallet_id))).wallet_balance
201+
ph: bytes32 = decode_puzzle_hash(
202+
(await wallet_bundle.rpc_client.get_next_address(GetNextAddress(wallet_id, True))).address
203+
)
203204
generated_funds = 0
204205
for _ in range(num_blocks):
205206
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph))
@@ -1213,8 +1214,8 @@ async def test_cat_endpoints(wallet_environments: WalletTestFramework, wallet_ty
12131214
]
12141215
)
12151216

1216-
addr_0 = await env_0.rpc_client.get_next_address(cat_0_id, False)
1217-
addr_1 = await env_1.rpc_client.get_next_address(cat_1_id, False)
1217+
addr_0 = (await env_0.rpc_client.get_next_address(GetNextAddress(cat_0_id, False))).address
1218+
addr_1 = (await env_1.rpc_client.get_next_address(GetNextAddress(cat_1_id, False))).address
12181219

12191220
assert addr_0 != addr_1
12201221

@@ -1420,7 +1421,7 @@ async def test_offer_endpoints(wallet_environments: WalletTestFramework, wallet_
14201421

14211422
# Creates a wallet for the same CAT on wallet_2 and send 4 CAT from wallet_1 to it
14221423
await env_2.rpc_client.create_wallet_for_existing_cat(cat_asset_id)
1423-
wallet_2_address = await env_2.rpc_client.get_next_address(cat_wallet_id, False)
1424+
wallet_2_address = (await env_2.rpc_client.get_next_address(GetNextAddress(cat_wallet_id, False))).address
14241425
adds = [{"puzzle_hash": decode_puzzle_hash(wallet_2_address), "amount": uint64(4), "memos": ["the cat memo"]}]
14251426
tx_res = (
14261427
await env_1.rpc_client.send_transaction_multi(
@@ -2149,7 +2150,7 @@ async def test_key_and_address_endpoints(wallet_rpc_environment: WalletRpcTestEn
21492150
wallet_node: WalletNode = env.wallet_1.node
21502151
client: WalletRpcClient = env.wallet_1.rpc_client
21512152

2152-
address = await client.get_next_address(1, True)
2153+
address = (await client.get_next_address(GetNextAddress(uint32(1), True))).address
21532154
assert len(address) > 10
21542155

21552156
pks = (await client.get_public_keys()).pk_fingerprints
@@ -2793,7 +2794,7 @@ async def test_set_wallet_resync_on_startup(wallet_rpc_environment: WalletRpcTes
27932794

27942795
nft_wallet = await wc.create_new_nft_wallet(None)
27952796
nft_wallet_id = nft_wallet["wallet_id"]
2796-
address = await wc.get_next_address(env.wallet_1.wallet.id(), True)
2797+
address = (await wc.get_next_address(GetNextAddress(env.wallet_1.wallet.id(), True))).address
27972798
await wc.mint_nft(
27982799
request=NFTMintNFTRequest(
27992800
wallet_id=nft_wallet_id,

chia/cmds/wallet_funcs.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
DIDTransferDID,
5454
DIDUpdateMetadata,
5555
FungibleAsset,
56+
GetNextAddress,
5657
GetNotifications,
5758
GetTransaction,
5859
GetTransactions,
@@ -416,7 +417,7 @@ async def get_address(
416417
root_path: pathlib.Path, wallet_rpc_port: Optional[int], fp: Optional[int], wallet_id: int, new_address: bool
417418
) -> None:
418419
async with get_wallet_client(root_path, wallet_rpc_port, fp) as (wallet_client, _, _):
419-
res = await wallet_client.get_next_address(wallet_id, new_address)
420+
res = (await wallet_client.get_next_address(GetNextAddress(uint32(wallet_id), new_address))).address
420421
print(res)
421422

422423

chia/wallet/wallet_request_types.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,21 @@ class GetTransactionCountResponse(Streamable):
412412
count: uint16
413413

414414

415+
@streamable
416+
@dataclass(frozen=True)
417+
class GetNextAddress(Streamable):
418+
wallet_id: uint32
419+
new_address: bool = False
420+
save_derivations: bool = True
421+
422+
423+
@streamable
424+
@dataclass(frozen=True)
425+
class GetNextAddressResponse(Streamable):
426+
wallet_id: uint32
427+
address: str
428+
429+
415430
@streamable
416431
@dataclass(frozen=True)
417432
class GetOffersCountResponse(Streamable):

chia/wallet/wallet_rpc_api.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@
170170
GenerateMnemonicResponse,
171171
GetHeightInfoResponse,
172172
GetLoggedInFingerprintResponse,
173+
GetNextAddress,
174+
GetNextAddressResponse,
173175
GetNotifications,
174176
GetNotificationsResponse,
175177
GetPrivateKey,
@@ -1550,33 +1552,29 @@ async def get_transaction_count(self, request: GetTransactionCount) -> GetTransa
15501552
uint16(count),
15511553
)
15521554

1553-
async def get_next_address(self, request: dict[str, Any]) -> EndpointResult:
1555+
@marshal
1556+
async def get_next_address(self, request: GetNextAddress) -> GetNextAddressResponse:
15541557
"""
15551558
Returns a new address
15561559
"""
1557-
if request["new_address"] is True:
1558-
create_new = True
1559-
else:
1560-
create_new = False
1561-
wallet_id = uint32(request["wallet_id"])
1562-
wallet = self.service.wallet_state_manager.wallets[wallet_id]
1560+
wallet = self.service.wallet_state_manager.wallets[request.wallet_id]
15631561
selected = self.service.config["selected_network"]
15641562
prefix = self.service.config["network_overrides"]["config"][selected]["address_prefix"]
15651563
if wallet.type() in {WalletType.STANDARD_WALLET, WalletType.CAT, WalletType.CRCAT, WalletType.RCAT}:
15661564
async with self.service.wallet_state_manager.new_action_scope(
1567-
DEFAULT_TX_CONFIG, push=request.get("save_derivations", True)
1565+
DEFAULT_TX_CONFIG, push=request.save_derivations
15681566
) as action_scope:
15691567
raw_puzzle_hash = await action_scope.get_puzzle_hash(
1570-
self.service.wallet_state_manager, override_reuse_puzhash_with=not create_new
1568+
self.service.wallet_state_manager, override_reuse_puzhash_with=not request.new_address
15711569
)
15721570
address = encode_puzzle_hash(raw_puzzle_hash, prefix)
15731571
else:
15741572
raise ValueError(f"Wallet type {wallet.type()} cannot create puzzle hashes")
15751573

1576-
return {
1577-
"wallet_id": wallet_id,
1578-
"address": address,
1579-
}
1574+
return GetNextAddressResponse(
1575+
request.wallet_id,
1576+
address,
1577+
)
15801578

15811579
@tx_endpoint(push=True)
15821580
async def send_transaction(

chia/wallet/wallet_rpc_client.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@
8787
GetCATListResponse,
8888
GetHeightInfoResponse,
8989
GetLoggedInFingerprintResponse,
90+
GetNextAddress,
91+
GetNextAddressResponse,
9092
GetNotifications,
9193
GetNotificationsResponse,
9294
GetOffersCountResponse,
@@ -281,11 +283,8 @@ async def get_transaction_count(self, request: GetTransactionCount) -> GetTransa
281283
await self.fetch("get_transaction_count", request.to_json_dict())
282284
)
283285

284-
async def get_next_address(self, wallet_id: int, new_address: bool) -> str:
285-
request = {"wallet_id": wallet_id, "new_address": new_address}
286-
response = await self.fetch("get_next_address", request)
287-
# TODO: casting due to lack of type checked deserialization
288-
return cast(str, response["address"])
286+
async def get_next_address(self, request: GetNextAddress) -> GetNextAddressResponse:
287+
return GetNextAddressResponse.from_json_dict(await self.fetch("get_next_address", request.to_json_dict()))
289288

290289
async def send_transaction(
291290
self,

0 commit comments

Comments
 (0)