Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CHIA-427] Port chia wallet take/cancel_offer to @tx_out_cmd #18038

Merged
merged 1 commit into from
May 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 11 additions & 5 deletions chia/_tests/cmds/wallet/test_wallet.py
Original file line number Diff line number Diff line change
Expand Up @@ -937,8 +937,9 @@ async def take_offer(
tx_config: TXConfig,
solver: Optional[Dict[str, Any]] = None,
fee: uint64 = uint64(0),
push: bool = True,
) -> TakeOfferResponse:
self.add_to_log("take_offer", (offer, tx_config, solver, fee))
self.add_to_log("take_offer", (offer, tx_config, solver, fee, push))
return TakeOfferResponse(
[STD_UTX],
[STD_TX],
Expand Down Expand Up @@ -981,7 +982,7 @@ async def take_offer(
(cat2,),
(bytes32.from_hexstr("accce8e1c71b56624f2ecaeff5af57eac41365080449904d0717bd333c04806d"),),
],
"take_offer": [(Offer.from_bech32(test_offer_file_bech32), DEFAULT_TX_CONFIG, None, 1000000000000)],
"take_offer": [(Offer.from_bech32(test_offer_file_bech32), DEFAULT_TX_CONFIG, None, 1000000000000, True)],
}
test_rpc_clients.wallet_rpc_client.check_log(expected_calls)

Expand Down Expand Up @@ -1010,9 +1011,14 @@ async def get_offer(self, trade_id: bytes32, file_contents: bool = False) -> Tra
)

async def cancel_offer(
self, trade_id: bytes32, tx_config: TXConfig, fee: uint64 = uint64(0), secure: bool = True
self,
trade_id: bytes32,
tx_config: TXConfig,
fee: uint64 = uint64(0),
secure: bool = True,
push: bool = True,
) -> CancelOfferResponse:
self.add_to_log("cancel_offer", (trade_id, tx_config, fee, secure))
self.add_to_log("cancel_offer", (trade_id, tx_config, fee, secure, push))
return CancelOfferResponse([STD_UTX], [STD_TX])

inst_rpc_client = CancelOfferRpcClient() # pylint: disable=no-value-for-parameter
Expand All @@ -1033,7 +1039,7 @@ async def cancel_offer(
run_cli_command_and_assert(capsys, root_dir, command_args, assert_list)
expected_calls: logType = {
"get_offer": [(test_offer_id_bytes, True)],
"cancel_offer": [(test_offer_id_bytes, DEFAULT_TX_CONFIG, 1000000000000, True)],
"cancel_offer": [(test_offer_id_bytes, DEFAULT_TX_CONFIG, 1000000000000, True, True)],
"cat_asset_id_to_name": [
(cat1,),
(cat2,),
Expand Down
17 changes: 12 additions & 5 deletions chia/cmds/wallet.py
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,8 @@ def add_token_cmd(wallet_rpc_port: Optional[int], asset_id: str, token_name: str
default=False,
)
@click.option("--override", help="Creates offer without checking for unusual values", is_flag=True, default=False)
# This command looks like a good candidate for @tx_out_cmd however, pushing an incomplete tx is nonsensical and
# we already have a canonical offer file format which the idea of exporting a different transaction conflicts with
def make_offer_cmd(
wallet_rpc_port: Optional[int],
fingerprint: int,
Expand Down Expand Up @@ -564,17 +566,19 @@ def get_offers_cmd(
is_flag=True,
default=False,
)
@tx_out_cmd
def take_offer_cmd(
path_or_hex: str,
wallet_rpc_port: Optional[int],
fingerprint: int,
examine_only: bool,
fee: str,
reuse: bool,
) -> None:
reuse: bool, # reuse is not used
push: bool,
) -> List[TransactionRecord]:
from .wallet_funcs import take_offer

asyncio.run(take_offer(wallet_rpc_port, fingerprint, Decimal(fee), path_or_hex, examine_only)) # reuse is not used
return asyncio.run(take_offer(wallet_rpc_port, fingerprint, Decimal(fee), path_or_hex, examine_only, push=push))


@wallet_cmd.command("cancel_offer", help="Cancel an existing offer")
Expand All @@ -591,10 +595,13 @@ def take_offer_cmd(
@click.option(
"-m", "--fee", help="The fee to use when cancelling the offer securely, in XCH", default="0", show_default=True
)
def cancel_offer_cmd(wallet_rpc_port: Optional[int], fingerprint: int, id: str, insecure: bool, fee: str) -> None:
@tx_out_cmd
def cancel_offer_cmd(
wallet_rpc_port: Optional[int], fingerprint: int, id: str, insecure: bool, fee: str, push: bool
) -> List[TransactionRecord]:
from .wallet_funcs import cancel_offer

asyncio.run(cancel_offer(wallet_rpc_port, fingerprint, Decimal(fee), id, not insecure))
return asyncio.run(cancel_offer(wallet_rpc_port, fingerprint, Decimal(fee), id, not insecure, push=push))


@wallet_cmd.command("check", short_help="Check wallet DB integrity", help=check_help_text)
Expand Down
45 changes: 30 additions & 15 deletions chia/cmds/wallet_funcs.py
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,8 @@ async def take_offer(
d_fee: Decimal,
file: str,
examine_only: bool,
) -> None:
push: bool = True,
) -> List[TransactionRecord]:
async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
if os.path.exists(file):
filepath = pathlib.Path(file)
Expand All @@ -711,7 +712,7 @@ async def take_offer(
offer = Offer.from_bech32(offer_hex)
except ValueError:
print("Please enter a valid offer file or hex blob")
return
return []

offered, requested, _, _ = offer.summary()
cat_name_resolver = wallet_client.cat_asset_id_to_name
Expand Down Expand Up @@ -776,15 +777,21 @@ async def take_offer(
if not examine_only:
print()
cli_confirm("Would you like to take this offer? (y/n): ")
trade_record = (
await wallet_client.take_offer(
offer,
fee=fee,
tx_config=CMDTXConfigLoader().to_tx_config(units["chia"], config, fingerprint),
res = await wallet_client.take_offer(
offer,
fee=fee,
tx_config=CMDTXConfigLoader().to_tx_config(units["chia"], config, fingerprint),
push=push,
)
if push:
print(f"Accepted offer with ID {res.trade_record.trade_id}")
print(
f"Use chia wallet get_offers --id {res.trade_record.trade_id} -f {fingerprint} to view its status"
)
).trade_record
print(f"Accepted offer with ID {trade_record.trade_id}")
print(f"Use chia wallet get_offers --id {trade_record.trade_id} -f {fingerprint} to view its status")

return res.transactions
else:
return []


async def cancel_offer(
Expand All @@ -793,7 +800,8 @@ async def cancel_offer(
d_fee: Decimal,
offer_id_hex: str,
secure: bool,
) -> None:
push: bool = True,
) -> List[TransactionRecord]:
async with get_wallet_client(wallet_rpc_port, fp) as (wallet_client, fingerprint, config):
offer_id = bytes32.from_hexstr(offer_id_hex)
fee: int = int(d_fee * units["chia"])
Expand All @@ -802,13 +810,20 @@ async def cancel_offer(
await print_trade_record(trade_record, wallet_client, summaries=True)

cli_confirm(f"Are you sure you wish to cancel offer with ID: {trade_record.trade_id}? (y/n): ")
await wallet_client.cancel_offer(
offer_id, CMDTXConfigLoader().to_tx_config(units["chia"], config, fingerprint), secure=secure, fee=fee
res = await wallet_client.cancel_offer(
offer_id,
CMDTXConfigLoader().to_tx_config(units["chia"], config, fingerprint),
secure=secure,
fee=fee,
push=push,
)
print(f"Cancelled offer with ID {trade_record.trade_id}")
if secure:
if push or not secure:
print(f"Cancelled offer with ID {trade_record.trade_id}")
if secure and push:
print(f"Use chia wallet get_offers --id {trade_record.trade_id} -f {fingerprint} to view cancel status")

return res.transactions


def wallet_coin_unit(typ: WalletType, address_prefix: str) -> Tuple[str, int]: # pragma: no cover
if typ in {WalletType.CAT, WalletType.CRCAT}:
Expand Down