def test_receive_payment_with_general_metadata_and_invalid_to_subaddress( stub_client: RestClient, target_client: RestClient, currency: str, hrp: str, stub_config: AppConfig, diem_client: jsonrpc.Client, invalid_to_subaddress: Optional[bytes], ) -> None: """When received a payment with general metadata and invalid to subaddress, receiver should refund the payment by using RefundMetadata with reason `invalid subaddress`. Test Plan: 1. Generate a valid account identifier from receiver account as payee. 2. Create a general metadata with valid from subaddress and invalid to subaddress. 3. Send payment transaction from sender to receiver on-chain account. 4. Wait for the transaction executed successfully. 5. Assert sender account received a payment transaction with refund metadata. 6. Assert receiver account does not receive funds. """ amount = 1_000_000 sender_account = stub_client.create_account(balances={currency: amount}) receiver_account = target_client.create_account() try: receiver_account_identifier = receiver_account.generate_account_identifier( ) receiver_account_address: diem_types.AccountAddress = identifier.decode_account_address( receiver_account_identifier, hrp) sender_account_identifier = sender_account.generate_account_identifier( ) valid_from_subaddress = identifier.decode_account_subaddress( sender_account_identifier, hrp) invalid_metadata = txnmetadata.general_metadata( valid_from_subaddress, invalid_to_subaddress) original_payment_txn: jsonrpc.Transaction = stub_config.account.submit_and_wait_for_txn( diem_client, stdlib.encode_peer_to_peer_with_metadata_script( currency=utils.currency_code(currency), amount=amount, payee=receiver_account_address, metadata=invalid_metadata, metadata_signature=b"", ), ) sender_account.wait_for_event( "created_transaction", status=Transaction.Status.completed, refund_diem_txn_version=original_payment_txn.version, refund_reason=RefundReason.invalid_subaddress, ) assert receiver_account.balance(currency) == 0 finally: receiver_account.log_events() sender_account.log_events()
def test_receive_payment_with_general_metadata_and_invalid_from_subaddress( stub_client: RestClient, target_client: RestClient, currency: str, hrp: str, stub_config: AppConfig, diem_client: jsonrpc.Client, invalid_from_subaddress: Optional[bytes], ) -> None: """When received a payment with general metadata and invalid from subaddress, receiver is not required to take any action on it as long as to subaddress is valid. Test Plan: 1. Generate a valid account identifier from receiver account as payee. 2. Create a general metadata with invalid from subaddress and valid to subaddress. 3. Send payment transaction from sender to receiver on-chain account. 4. Wait for the transaction executed successfully. 5. Assert receiver account received funds eventually. """ amount = 1_000_000 sender_account = stub_client.create_account(balances={currency: amount}) receiver_account = target_client.create_account() try: receiver_account_identifier = receiver_account.generate_account_identifier( ) receiver_account_address = identifier.decode_account_address( receiver_account_identifier, hrp) valid_to_subaddress = identifier.decode_account_subaddress( receiver_account_identifier, hrp) invalid_metadata = txnmetadata.general_metadata( invalid_from_subaddress, valid_to_subaddress) stub_config.account.submit_and_wait_for_txn( diem_client, stdlib.encode_peer_to_peer_with_metadata_script( currency=utils.currency_code(currency), amount=amount, payee=receiver_account_address, metadata=invalid_metadata, metadata_signature=b"", ), ) receiver_account.wait_for_balance(currency, amount) finally: receiver_account.log_events() sender_account.log_events()
def subaddress(account_identifier: str) -> str: return utils.hex( identifier.decode_account_subaddress(account_identifier, hrp))