Skip to content

Commit 00f7040

Browse files
committed
Port get_transaction(s)
1 parent 48ef7d2 commit 00f7040

File tree

11 files changed

+313
-156
lines changed

11 files changed

+313
-156
lines changed

chia/_tests/cmds/cmd_test_utils.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,17 @@
3535
from chia.wallet.util.wallet_types import WalletType
3636
from chia.wallet.wallet_request_types import (
3737
GetSyncStatusResponse,
38+
GetTransaction,
39+
GetTransactionResponse,
3840
GetWallets,
3941
GetWalletsResponse,
4042
NFTCalculateRoyalties,
4143
NFTCalculateRoyaltiesResponse,
4244
NFTGetInfo,
4345
NFTGetInfoResponse,
4446
SendTransactionMultiResponse,
47+
UserFriendlyMemos,
48+
UserFriendlyTransactionRecord,
4549
WalletInfoResponse,
4650
)
4751
from chia.wallet.wallet_rpc_client import WalletRpcClient
@@ -115,26 +119,30 @@ async def get_wallets(self, request: GetWallets) -> GetWalletsResponse:
115119
raise ValueError(f"Invalid fingerprint: {self.fingerprint}")
116120
return GetWalletsResponse([WalletInfoResponse(id=uint32(1), name="", type=uint8(w_type.value), data="")])
117121

118-
async def get_transaction(self, transaction_id: bytes32) -> TransactionRecord:
119-
self.add_to_log("get_transaction", (transaction_id,))
120-
return TransactionRecord(
121-
confirmed_at_height=uint32(1),
122-
created_at_time=uint64(1234),
123-
to_puzzle_hash=bytes32([1] * 32),
124-
amount=uint64(12345678),
125-
fee_amount=uint64(1234567),
126-
confirmed=False,
127-
sent=uint32(0),
128-
spend_bundle=WalletSpendBundle([], G2Element()),
129-
additions=[Coin(bytes32([1] * 32), bytes32([2] * 32), uint64(12345678))],
130-
removals=[Coin(bytes32([2] * 32), bytes32([4] * 32), uint64(12345678))],
131-
wallet_id=uint32(1),
132-
sent_to=[("aaaaa", uint8(1), None)],
133-
trade_id=None,
134-
type=uint32(TransactionType.OUTGOING_TX.value),
135-
name=bytes32([2] * 32),
136-
memos=[(bytes32([3] * 32), [bytes([4] * 32)])],
137-
valid_times=ConditionValidTimes(),
122+
async def get_transaction(self, request: GetTransaction) -> GetTransactionResponse:
123+
self.add_to_log("get_transaction", (request,))
124+
return GetTransactionResponse(
125+
UserFriendlyTransactionRecord(
126+
confirmed_at_height=uint32(1),
127+
created_at_time=uint64(1234),
128+
to_puzzle_hash=bytes32([1] * 32),
129+
amount=uint64(12345678),
130+
fee_amount=uint64(1234567),
131+
confirmed=False,
132+
sent=uint32(0),
133+
spend_bundle=WalletSpendBundle([], G2Element()),
134+
additions=[Coin(bytes32([1] * 32), bytes32([2] * 32), uint64(12345678))],
135+
removals=[Coin(bytes32([2] * 32), bytes32([4] * 32), uint64(12345678))],
136+
wallet_id=uint32(1),
137+
sent_to=[("aaaaa", uint8(1), None)],
138+
trade_id=None,
139+
type=uint32(TransactionType.OUTGOING_TX.value),
140+
name=bytes32([2] * 32),
141+
memos=UserFriendlyMemos([(bytes32([3] * 32), [bytes([4] * 32)])]),
142+
valid_times=ConditionValidTimes(),
143+
to_address="",
144+
),
145+
bytes32([2] * 32),
138146
)
139147

140148
async def get_cat_name(self, wallet_id: int) -> str:

chia/_tests/cmds/wallet/test_wallet.py

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from chia.wallet.trading.trade_status import TradeStatus
3636
from chia.wallet.transaction_record import TransactionRecord
3737
from chia.wallet.transaction_sorting import SortKey
38-
from chia.wallet.util.query_filter import HashFilter, TransactionTypeFilter
38+
from chia.wallet.util.query_filter import HashFilter
3939
from chia.wallet.util.transaction_type import TransactionType
4040
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG, TXConfig
4141
from chia.wallet.util.wallet_types import WalletType
@@ -47,6 +47,9 @@
4747
CreateOfferForIDsResponse,
4848
FungibleAsset,
4949
GetHeightInfoResponse,
50+
GetTransaction,
51+
GetTransactions,
52+
GetTransactionsResponse,
5053
GetWalletBalance,
5154
GetWalletBalanceResponse,
5255
GetWallets,
@@ -57,6 +60,8 @@
5760
RoyaltyAsset,
5861
SendTransactionResponse,
5962
TakeOfferResponse,
63+
UserFriendlyMemos,
64+
UserFriendlyTransactionRecordWithMetadata,
6065
WalletInfoResponse,
6166
)
6267
from chia.wallet.wallet_spend_bundle import WalletSpendBundle
@@ -100,9 +105,9 @@ def test_get_transaction(capsys: object, get_test_cli_clients: tuple[TestRpcClie
100105
"get_wallets": [(GetWallets(type=None, include_data=True),)] * 3,
101106
"get_cat_name": [(1,)],
102107
"get_transaction": [
103-
(bytes32.from_hexstr(bytes32_hexstr),),
104-
(bytes32.from_hexstr(bytes32_hexstr),),
105-
(bytes32.from_hexstr(bytes32_hexstr),),
108+
(GetTransaction(bytes32.from_hexstr(bytes32_hexstr)),),
109+
(GetTransaction(bytes32.from_hexstr(bytes32_hexstr)),),
110+
(GetTransaction(bytes32.from_hexstr(bytes32_hexstr)),),
106111
],
107112
}
108113
test_rpc_clients.wallet_rpc_client.check_log(expected_calls)
@@ -113,24 +118,13 @@ def test_get_transactions(capsys: object, get_test_cli_clients: tuple[TestRpcCli
113118

114119
# set RPC Client
115120
class GetTransactionsWalletRpcClient(TestWalletRpcClient):
116-
async def get_transactions(
117-
self,
118-
wallet_id: int,
119-
start: int,
120-
end: int,
121-
sort_key: Optional[SortKey] = None,
122-
reverse: bool = False,
123-
to_address: Optional[str] = None,
124-
type_filter: Optional[TransactionTypeFilter] = None,
125-
confirmed: Optional[bool] = None,
126-
) -> list[TransactionRecord]:
127-
self.add_to_log(
128-
"get_transactions", (wallet_id, start, end, sort_key, reverse, to_address, type_filter, confirmed)
129-
)
121+
async def get_transactions(self, request: GetTransactions) -> GetTransactionsResponse:
122+
self.add_to_log("get_transactions", (request,))
130123
l_tx_rec = []
131-
for i in range(start, end):
132-
t_type = TransactionType.INCOMING_CLAWBACK_SEND if i == end - 1 else TransactionType.INCOMING_TX
133-
tx_rec = TransactionRecord(
124+
assert request.start is not None and request.end is not None
125+
for i in range(request.start, request.end):
126+
t_type = TransactionType.INCOMING_CLAWBACK_SEND if i == request.end - 1 else TransactionType.INCOMING_TX
127+
tx_rec = UserFriendlyTransactionRecordWithMetadata(
134128
confirmed_at_height=uint32(1 + i),
135129
created_at_time=uint64(1234 + i),
136130
to_puzzle_hash=bytes32([1 + i] * 32),
@@ -146,12 +140,13 @@ async def get_transactions(
146140
trade_id=None,
147141
type=uint32(t_type.value),
148142
name=bytes32([2 + i] * 32),
149-
memos=[(bytes32([3 + i] * 32), [bytes([4 + i] * 32)])],
143+
memos=UserFriendlyMemos([(bytes32([3 + i] * 32), [bytes([4 + i] * 32)])]),
150144
valid_times=ConditionValidTimes(),
145+
to_address="",
151146
)
152147
l_tx_rec.append(tx_rec)
153148

154-
return l_tx_rec
149+
return GetTransactionsResponse(l_tx_rec, request.wallet_id)
155150

156151
async def get_coin_records(self, request: GetCoinRecords) -> dict[str, Any]:
157152
self.add_to_log("get_coin_records", (request,))
@@ -200,8 +195,8 @@ async def get_coin_records(self, request: GetCoinRecords) -> dict[str, Any]:
200195
expected_calls: logType = {
201196
"get_wallets": [(GetWallets(type=None, include_data=True),)] * 2,
202197
"get_transactions": [
203-
(1, 2, 4, SortKey.RELEVANCE, True, None, None, None),
204-
(1, 2, 4, SortKey.RELEVANCE, True, None, None, None),
198+
(GetTransactions(uint32(1), uint16(2), uint16(4), SortKey.RELEVANCE.name, True, None, None, None),),
199+
(GetTransactions(uint32(1), uint16(2), uint16(4), SortKey.RELEVANCE.name, True, None, None, None),),
205200
],
206201
"get_coin_records": [
207202
(GetCoinRecords(coin_id_filter=HashFilter.include([expected_coin_id])),),
@@ -488,7 +483,7 @@ async def cat_spend(
488483
test_condition_valid_times,
489484
)
490485
],
491-
"get_transaction": [(get_bytes32(2),), (get_bytes32(2),)],
486+
"get_transaction": [(GetTransaction(get_bytes32(2)),), (GetTransaction(get_bytes32(2)),)],
492487
}
493488
test_rpc_clients.wallet_rpc_client.check_log(expected_calls)
494489

chia/_tests/pools/test_pool_rpc.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
from chia.wallet.util.wallet_types import WalletType
4343
from chia.wallet.wallet_node import WalletNode
4444
from chia.wallet.wallet_request_types import (
45+
GetTransactions,
4546
GetWalletBalance,
4647
GetWallets,
4748
PWAbsorbRewards,
@@ -605,7 +606,7 @@ async def test_absorb_self(
605606
PWAbsorbRewards(wallet_id=uint32(2), fee=uint64(fee), push=True), DEFAULT_TX_CONFIG
606607
)
607608

608-
tx1 = await client.get_transactions(1)
609+
tx1 = (await client.get_transactions(GetTransactions(uint32(1)))).transactions
609610
assert (250_000_000_000 + fee) in [tx.amount for tx in tx1]
610611

611612
@pytest.mark.anyio

chia/_tests/wallet/rpc/test_wallet_rpc.py

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@
123123
GetPrivateKey,
124124
GetSyncStatusResponse,
125125
GetTimestampForHeight,
126+
GetTransaction,
127+
GetTransactions,
126128
GetWalletBalance,
127129
GetWalletBalances,
128130
GetWallets,
@@ -345,7 +347,7 @@ async def assert_get_balance(rpc_client: WalletRpcClient, wallet_node: WalletNod
345347

346348

347349
async def tx_in_mempool(client: WalletRpcClient, transaction_id: bytes32) -> bool:
348-
tx = await client.get_transaction(transaction_id)
350+
tx = (await client.get_transaction(GetTransaction(transaction_id))).transaction
349351
return tx.is_in_mempool()
350352

351353

@@ -433,7 +435,7 @@ async def test_send_transaction(wallet_rpc_environment: WalletRpcTestEnvironment
433435
await farm_transaction(full_node_api, wallet_node, spend_bundle)
434436

435437
# Checks that the memo can be retrieved
436-
tx_confirmed = await client.get_transaction(transaction_id)
438+
tx_confirmed = (await client.get_transaction(GetTransaction(transaction_id))).transaction.to_transaction_record()
437439
assert tx_confirmed.confirmed
438440
assert len(tx_confirmed.get_memos()) == 1
439441
assert [b"this is a basic tx"] in tx_confirmed.get_memos().values()
@@ -481,7 +483,7 @@ async def test_push_transactions(wallet_rpc_environment: WalletRpcTestEnvironmen
481483
await farm_transaction(full_node_api, wallet_node, spend_bundle)
482484

483485
for tx in resp_client.transactions:
484-
assert (await client.get_transaction(transaction_id=tx.name)).confirmed
486+
assert (await client.get_transaction(GetTransaction(transaction_id=tx.name))).transaction.confirmed
485487

486488
# Just testing NOT failure here really (parsing)
487489
await client.push_tx(PushTX(spend_bundle))
@@ -975,7 +977,7 @@ async def test_send_transaction_multi(wallet_rpc_environment: WalletRpcTestEnvir
975977
await time_out_assert(20, get_confirmed_balance, generated_funds - amount_outputs - amount_fee, client, 1)
976978

977979
# Checks that the memo can be retrieved
978-
tx_confirmed = await client.get_transaction(send_tx_res.name)
980+
tx_confirmed = (await client.get_transaction(GetTransaction(send_tx_res.name))).transaction
979981
assert tx_confirmed.confirmed
980982
memos = tx_confirmed.get_memos()
981983
assert len(memos) == len(outputs)
@@ -998,18 +1000,20 @@ async def test_get_transactions(wallet_rpc_environment: WalletRpcTestEnvironment
9981000

9991001
await generate_funds(full_node_api, env.wallet_1, 5)
10001002

1001-
all_transactions = await client.get_transactions(1)
1003+
all_transactions = (await client.get_transactions(GetTransactions(uint32(1)))).transactions
10021004
assert len(all_transactions) >= 10
10031005
# Test transaction pagination
1004-
some_transactions = await client.get_transactions(1, 0, 5)
1005-
some_transactions_2 = await client.get_transactions(1, 5, 10)
1006+
some_transactions = (await client.get_transactions(GetTransactions(uint32(1), uint16(0), uint16(5)))).transactions
1007+
some_transactions_2 = (
1008+
await client.get_transactions(GetTransactions(uint32(1), uint16(5), uint16(10)))
1009+
).transactions
10061010
assert some_transactions == all_transactions[0:5]
10071011
assert some_transactions_2 == all_transactions[5:10]
10081012

10091013
# Testing sorts
10101014
# Test the default sort (CONFIRMED_AT_HEIGHT)
10111015
assert all_transactions == sorted(all_transactions, key=attrgetter("confirmed_at_height"))
1012-
all_transactions = await client.get_transactions(1, reverse=True)
1016+
all_transactions = (await client.get_transactions(GetTransactions(uint32(1), reverse=True))).transactions
10131017
assert all_transactions == sorted(all_transactions, key=attrgetter("confirmed_at_height"), reverse=True)
10141018

10151019
# Test RELEVANCE
@@ -1020,13 +1024,17 @@ async def test_get_transactions(wallet_rpc_environment: WalletRpcTestEnvironment
10201024
1, uint64(1), encode_puzzle_hash(puzhash, "txch"), DEFAULT_TX_CONFIG
10211025
) # Create a pending tx
10221026

1023-
all_transactions = await client.get_transactions(1, sort_key=SortKey.RELEVANCE)
1027+
all_transactions = (
1028+
await client.get_transactions(GetTransactions(uint32(1), sort_key=SortKey.RELEVANCE.name))
1029+
).transactions
10241030
sorted_transactions = sorted(all_transactions, key=attrgetter("created_at_time"), reverse=True)
10251031
sorted_transactions = sorted(sorted_transactions, key=attrgetter("confirmed_at_height"), reverse=True)
10261032
sorted_transactions = sorted(sorted_transactions, key=attrgetter("confirmed"))
10271033
assert all_transactions == sorted_transactions
10281034

1029-
all_transactions = await client.get_transactions(1, sort_key=SortKey.RELEVANCE, reverse=True)
1035+
all_transactions = (
1036+
await client.get_transactions(GetTransactions(uint32(1), sort_key=SortKey.RELEVANCE.name, reverse=True))
1037+
).transactions
10301038
sorted_transactions = sorted(all_transactions, key=attrgetter("created_at_time"))
10311039
sorted_transactions = sorted(sorted_transactions, key=attrgetter("confirmed_at_height"))
10321040
sorted_transactions = sorted(sorted_transactions, key=attrgetter("confirmed"), reverse=True)
@@ -1038,31 +1046,43 @@ async def test_get_transactions(wallet_rpc_environment: WalletRpcTestEnvironment
10381046
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
10391047
await client.send_transaction(1, uint64(1), encode_puzzle_hash(ph_by_addr, "txch"), DEFAULT_TX_CONFIG)
10401048
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
1041-
tx_for_address = await client.get_transactions(1, to_address=encode_puzzle_hash(ph_by_addr, "txch"))
1049+
tx_for_address = (
1050+
await client.get_transactions(GetTransactions(uint32(1), to_address=encode_puzzle_hash(ph_by_addr, "txch")))
1051+
).transactions
10421052
assert len(tx_for_address) == 1
10431053
assert tx_for_address[0].to_puzzle_hash == ph_by_addr
10441054

10451055
# Test type filter
1046-
all_transactions = await client.get_transactions(
1047-
1, type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD])
1048-
)
1056+
all_transactions = (
1057+
await client.get_transactions(
1058+
GetTransactions(uint32(1), type_filter=TransactionTypeFilter.include([TransactionType.COINBASE_REWARD]))
1059+
)
1060+
).transactions
10491061
assert len(all_transactions) == 5
10501062
assert all(transaction.type == TransactionType.COINBASE_REWARD.value for transaction in all_transactions)
10511063
# Test confirmed filter
1052-
all_transactions = await client.get_transactions(1, confirmed=True)
1064+
all_transactions = (await client.get_transactions(GetTransactions(uint32(1), confirmed=True))).transactions
10531065
assert len(all_transactions) == 10
10541066
assert all(transaction.confirmed for transaction in all_transactions)
1055-
all_transactions = await client.get_transactions(1, confirmed=False)
1067+
all_transactions = (await client.get_transactions(GetTransactions(uint32(1), confirmed=False))).transactions
10561068
assert len(all_transactions) == 2
10571069
assert all(not transaction.confirmed for transaction in all_transactions)
10581070

10591071
# Test bypass broken txs
10601072
await wallet.wallet_state_manager.tx_store.add_transaction_record(
1061-
dataclasses.replace(all_transactions[0], type=uint32(TransactionType.INCOMING_CLAWBACK_SEND))
1062-
)
1063-
all_transactions = await client.get_transactions(
1064-
1, type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_SEND]), confirmed=False
1073+
dataclasses.replace(
1074+
all_transactions[0].to_transaction_record(), type=uint32(TransactionType.INCOMING_CLAWBACK_SEND)
1075+
)
10651076
)
1077+
all_transactions = (
1078+
await client.get_transactions(
1079+
GetTransactions(
1080+
uint32(1),
1081+
type_filter=TransactionTypeFilter.include([TransactionType.INCOMING_CLAWBACK_SEND]),
1082+
confirmed=False,
1083+
)
1084+
)
1085+
).transactions
10661086
assert len(all_transactions) == 1
10671087

10681088

@@ -1075,7 +1095,7 @@ async def test_get_transaction_count(wallet_rpc_environment: WalletRpcTestEnviro
10751095

10761096
await generate_funds(full_node_api, env.wallet_1)
10771097

1078-
all_transactions = await client.get_transactions(1)
1098+
all_transactions = (await client.get_transactions(GetTransactions(uint32(1)))).transactions
10791099
assert len(all_transactions) > 0
10801100
transaction_count = await client.get_transaction_count(1)
10811101
assert transaction_count == len(all_transactions)

chia/_tests/wallet/test_wallet.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ async def test_wallet_clawback_clawback(self, wallet_environments: WalletTestFra
395395
assert len(txs["transactions"]) == 1
396396
assert not txs["transactions"][0]["confirmed"]
397397
assert txs["transactions"][0]["metadata"]["recipient_puzzle_hash"][2:] == normal_puzhash.hex()
398-
assert txs["transactions"][0]["metadata"]["coin_id"] == merkle_coin.name().hex()
398+
assert txs["transactions"][0]["metadata"]["coin_id"][2:] == merkle_coin.name().hex()
399399
with pytest.raises(ValueError):
400400
await api_0.spend_clawback_coins({})
401401

@@ -587,7 +587,7 @@ async def test_wallet_clawback_sent_self(self, wallet_environments: WalletTestFr
587587
assert txs["transactions"][0]["confirmed"]
588588
assert txs["transactions"][1]["confirmed"]
589589
assert txs["transactions"][0]["memos"] != txs["transactions"][1]["memos"]
590-
assert next(iter(txs["transactions"][0]["memos"].values())) == b"Test".hex()
590+
assert next(iter(txs["transactions"][0]["memos"].values()))[2:] == b"Test".hex()
591591

592592
@pytest.mark.parametrize(
593593
"wallet_environments",

0 commit comments

Comments
 (0)