Skip to content

fix: memo naming from payment_id#7385

Merged
SWvheerden merged 3 commits intotari-project:developmentfrom
hansieodendaal:ho_payment_id_not_shown
Aug 4, 2025
Merged

fix: memo naming from payment_id#7385
SWvheerden merged 3 commits intotari-project:developmentfrom
hansieodendaal:ho_payment_id_not_shown

Conversation

@hansieodendaal
Copy link
Copy Markdown
Contributor

@hansieodendaal hansieodendaal commented Aug 1, 2025

Description

  • Fixed memo naming where it still referenced payment_id.
  • Added a unit test to verify that a wallet payment_id address can provide its payment_id.
  • Added debug logs to gRPC method get_payment_id_address.

Motivation and Context

These changes were a result of investigating issue #7363.

How Has This Been Tested?

System-level testing

What process can a PR reviewer use to test or verify this change?

Code review.

Breaking Changes

  • None
  • Requires data directory on base node to be deleted
  • Requires hard fork
  • Other - Please specify

Summary by CodeRabbit

  • Bug Fixes

    • Improved debug logging for payment ID and address handling in the console wallet, aiding in troubleshooting.
  • Tests

    • Added new tests to verify correct retrieval and handling of memo fields (payment ID) in addresses.
    • Enhanced test assertions for memo field extraction and address validation.
  • Style

    • Updated parameter names and documentation to consistently use "memo" instead of "payment ID" for improved clarity.

- Fixed memo naming where it still referenced payment_id
- Added a unit test to verify a wallet payment_id address can provide its payment_id.
@hansieodendaal hansieodendaal requested a review from a team as a code owner August 1, 2025 06:26
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Aug 1, 2025

Walkthrough

This update introduces trace-level logging to the get_payment_id_address gRPC handler, adds a test verifying memo field retrieval from TariAddress instances, renames a parameter in the encrypt_data function for clarity, and systematically replaces "PaymentId" with "Memo" in comments, docs, and tests within the memo field module. No core logic or API signatures were changed.

Changes

Cohort / File(s) Change Summary
Trace Logging in Wallet gRPC Server
applications/minotari_console_wallet/src/grpc/wallet_grpc_server.rs
Added multiple trace-level logs in get_payment_id_address to output raw payment ID bytes and strings, and wallet addresses before and after adding the memo field. No logic or control flow changes.
Memo Field Retrieval Test Addition
base_layer/common_types/src/tari_address/mod.rs
Added retrieve_memo_field test verifying memo field payment ID extraction and string conversion from TariAddress instances, and creation of new addresses with memo fields. No API or core logic changes.
Parameter Rename in EncryptedData
base_layer/core/src/transactions/transaction_components/encrypted_data.rs
Renamed encrypt_data parameter from payment_id to memo and updated internal references accordingly. No functional or logic changes.
Rename and Test Updates in Memo Field Module
base_layer/core/src/transactions/transaction_components/memo_field.rs
Replaced "PaymentId" with "Memo" or "MemoField" in comments, documentation, error messages, and test descriptions. Enhanced tests with additional assertions verifying memo data extraction and address relationships. No changes to logic or API signatures.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant WalletGrpcServer
    participant Logger

    Client->>WalletGrpcServer: get_payment_id_address(request)
    WalletGrpcServer->>Logger: Trace log raw payment ID bytes and string
    WalletGrpcServer->>Logger: Trace log interactive address before/after memo field
    WalletGrpcServer->>Logger: Trace log one-sided address before/after memo field
    WalletGrpcServer-->>Client: return address with memo field
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~7 minutes

Poem

🐇
In code where memos softly hide,
Trace logs now hop side by side.
From PaymentId to Memo’s name,
Clear and tidy is the game.
Tests that check and bytes that gleam,
Our wallet’s logic runs supreme!
🥕

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bf0a822 and 22d576e.

📒 Files selected for processing (1)
  • base_layer/core/src/transactions/transaction_components/memo_field.rs (26 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • base_layer/core/src/transactions/transaction_components/memo_field.rs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Cucumber tests / Base Layer
  • GitHub Check: Cucumber tests / FFI
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (7)
base_layer/core/src/transactions/transaction_components/encrypted_data.rs (2)

108-112: Cache memo_size to avoid repeated calculations.

The literal expression memo.get_size() is evaluated in multiple places. Capturing it once (as shown above) improves readability and guards against accidental mismatch if the layout logic changes.

-let mut data = vec![0; STATIC_ENCRYPTED_DATA_SIZE_TOTAL + memo.get_size()];
+let mut data = vec![0; STATIC_ENCRYPTED_DATA_SIZE_TOTAL + memo_size];
...
-data[SIZE_TAG + SIZE_NONCE..SIZE_TAG + SIZE_NONCE + SIZE_VALUE + SIZE_MASK + memo.get_size()]
+data[SIZE_TAG + SIZE_NONCE..SIZE_TAG + SIZE_NONCE + SIZE_VALUE + SIZE_MASK + memo_size]

207-211: Consider renaming get_payment_id_sizeget_memo_size and updating the doc‐comment.

Now that “payment id” has been generalised to “memo”, keeping the old terminology here may be confusing to new consumers of the API. Unless there is a strong backward-compatibility reason, updating the method name and comment will make the public surface consistent with the rest of this PR.

No code diff supplied because this change touches the public API – please update consciously if acceptable.

applications/minotari_console_wallet/src/grpc/wallet_grpc_server.rs (2)

324-329: Duplicate to_base58() conversions & outdated terminology

  1. interactive_address.to_base58() is called twice; the second call repeats the same conversion after with_memo_field_payment_id.
    Micro-optimisation: cache the first string or use Display impl.

  2. Log text still uses “id”, but the surrounding refactor moves to “memo”. Consider renaming for consistency and to avoid future confusion.


334-339: One-sided address logging suffers the same issues

Same concerns as above: sensitive memo leaks and repeated string conversions. Apply the same fixes here for consistency.

base_layer/core/src/transactions/transaction_components/memo_field.rs (3)

300-308: Error message still refers to “Memo” length limit but constant may drift

The panic-string literally prints “256-byte limit”. If MAX_ENCRYPTED_DATA_SIZE is ever changed, the hard-coded value will become misleading.
Recommend formatting the message with the constant’s value instead of an inline literal.

- "Memo exceeds {}-byte limit: {} bytes (data: {} bytes, tag: 1 byte)",
+ "Memo exceeds {}-byte limit: {} bytes (data: {} bytes, tag: 1 byte)",

(and drop the literal 256 from all similar strings).


325-333: Public API still uses payment_id terminology

new_open receives payment_id: Vec<u8> while comments/doc-strings were renamed to “Memo”.
For long-term clarity consider a follow-up deprecation cycle that:

  1. Adds memo: Vec<u8> synonym parameters / getters.
  2. Marks the payment_id identifiers as deprecated.
  3. Updates downstream call-sites.

Not blocking this PR but worth tracking.


788-792: Log level might be too noisy for non-fatal parsing failures

debug!("Failed to parse Memo …") will emit for every decode miss and could flood logs when peers send unknown payloads.
Consider downgrading to trace!() or gating behind log::log_enabled!(Level::Debug) with rate-limiting.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e955456 and 09deec6.

📒 Files selected for processing (4)
  • applications/minotari_console_wallet/src/grpc/wallet_grpc_server.rs (1 hunks)
  • base_layer/common_types/src/tari_address/mod.rs (1 hunks)
  • base_layer/core/src/transactions/transaction_components/encrypted_data.rs (2 hunks)
  • base_layer/core/src/transactions/transaction_components/memo_field.rs (25 hunks)
🧰 Additional context used
🧠 Learnings (7)
📓 Common learnings
Learnt from: SolfataraEmit
PR: tari-project/tari#6994
File: docs/src/API_GRPC_Explanation.md:236-244
Timestamp: 2025-04-28T11:41:15.722Z
Learning: The minotari_console_wallet reports a fourth field `timelocked_balance` in the terminal output for the `getBalance` method, which should be reflected in the documentation for accuracy. The `wallet.proto` file confirms that `timelocked_balance` is defined as the fourth field in the `GetBalanceResponse` message.
📚 Learning: the minotari_console_wallet reports a fourth field `timelocked_balance` in the terminal output for t...
Learnt from: SolfataraEmit
PR: tari-project/tari#6994
File: docs/src/API_GRPC_Explanation.md:236-244
Timestamp: 2025-04-28T11:41:15.722Z
Learning: The minotari_console_wallet reports a fourth field `timelocked_balance` in the terminal output for the `getBalance` method, which should be reflected in the documentation for accuracy. The `wallet.proto` file confirms that `timelocked_balance` is defined as the fourth field in the `GetBalanceResponse` message.

Applied to files:

  • applications/minotari_console_wallet/src/grpc/wallet_grpc_server.rs
📚 Learning: in applications/minotari_console_wallet/src/automation/commands.rs, the consistent error handling pa...
Learnt from: hansieodendaal
PR: tari-project/tari#7284
File: applications/minotari_console_wallet/src/automation/commands.rs:0-0
Timestamp: 2025-07-15T12:23:14.650Z
Learning: In applications/minotari_console_wallet/src/automation/commands.rs, the consistent error handling pattern for command execution is to use match statements that: 1) On success: log with debug!, print user feedback, and push tx_id to tx_ids vector for monitoring, 2) On error: print error message with eprintln! using the format "{CommandName} error! {}", rather than using .unwrap() which would panic.

Applied to files:

  • applications/minotari_console_wallet/src/grpc/wallet_grpc_server.rs
  • base_layer/core/src/transactions/transaction_components/memo_field.rs
📚 Learning: the minotari_console_wallet reports a fourth field `timelocked_balance` in the terminal output for t...
Learnt from: SolfataraEmit
PR: tari-project/tari#6994
File: docs/src/API_GRPC_Explanation.md:236-244
Timestamp: 2025-04-28T11:41:15.722Z
Learning: The minotari_console_wallet reports a fourth field `timelocked_balance` in the terminal output for the `getBalance` method, which should be reflected in the documentation for accuracy.

Applied to files:

  • applications/minotari_console_wallet/src/grpc/wallet_grpc_server.rs
📚 Learning: the minedinfo struct in the tari blockchain database contains two optional fields: `input: option
Learnt from: hansieodendaal
PR: tari-project/tari#7266
File: base_layer/core/src/chain_storage/blockchain_database.rs:457-461
Timestamp: 2025-06-26T13:18:55.898Z
Learning: The MinedInfo struct in the Tari blockchain database contains two optional fields: `input: Option<InputMinedInfo>` and `output: Option<OutputMinedInfo>`. This design allows methods returning MinedInfo to always return a valid struct rather than wrapping it in Option, with "not found" scenarios represented through the internal optional fields.

Applied to files:

  • base_layer/core/src/transactions/transaction_components/memo_field.rs
📚 Learning: in tari's one-sided transaction offline signing implementation, the script_keys vector in the script...
Learnt from: martinserts
PR: tari-project/tari#7122
File: base_layer/wallet/src/transaction_service/offline_signing/one_sided_signer.rs:0-0
Timestamp: 2025-06-16T14:49:31.831Z
Learning: In Tari's one-sided transaction offline signing implementation, the script_keys vector in the script offset calculation should only include input.output.script_key_id, not output script keys, change output script keys, or recipient script keys. This is by design for the one-sided transaction protocol.

Applied to files:

  • base_layer/core/src/transactions/transaction_components/memo_field.rs
📚 Learning: in the tari codebase, request validation for rpc services is handled at the service layer using the ...
Learnt from: ksrichard
PR: tari-project/tari#7129
File: applications/minotari_node/src/http/handler/sync_utxos_by_block.rs:21-29
Timestamp: 2025-05-29T20:59:32.020Z
Learning: In the Tari codebase, request validation for RPC services is handled at the service layer using the `serde_valid` crate rather than at the HTTP handler level. For example, `SyncUtxosByBlockRequest` validates that limit is between 1-5 and page is minimum 0. HTTP handlers should delegate validation to the service layer rather than implementing their own validation.

Applied to files:

  • base_layer/core/src/transactions/transaction_components/memo_field.rs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: test (nextnet, nextnet)
  • GitHub Check: test (mainnet, stagenet)
  • GitHub Check: test (testnet, esmeralda)
  • GitHub Check: cargo check with stable
  • GitHub Check: Cucumber tests / FFI
  • GitHub Check: ledger build tests
  • GitHub Check: ci
  • GitHub Check: Cucumber tests / Base Layer
🔇 Additional comments (1)
base_layer/common_types/src/tari_address/mod.rs (1)

1010-1051: Rename test variables for consistency and verify memo data

– Align variable names with the new “memo_field” terminology.
– Confirm that each hardcoded base58 address decodes to a Dual variant and yields the expected memo bytes ("vgfve" and "Hello").
– Add a negative test for a Single‐variant address to assert that:
get_memo_field_payment_id_bytes() returns an empty Vec<u8>, and
with_memo_field_payment_id() returns the correct TariAddressError.

Apply this diff to update naming:

-        let pmnt_id_address = TariAddress::from_base58(
+        let memo_address = TariAddress::from_base58(
             "f75xWw72BhjRuSatHg4MtqgqzejhZJEmHH7DyYceQDVfKdepfY22CfPJUFQyhkao28gp7cbVqVdR9zczg9eKpoYjGUBH6G32SB",
         )
         .unwrap();
-        assert_eq!(pmnt_id_address.get_memo_field_payment_id_bytes(), [
+        assert_eq!(memo_address.get_memo_field_payment_id_bytes(), [
             118, 103, 102, 118, 101
         ]);
         assert_eq!(
-            String::from_utf8_lossy(&pmnt_id_address.get_memo_field_payment_id_bytes()).to_string(),
+            String::from_utf8_lossy(&memo_address.get_memo_field_payment_id_bytes()).to_string(),
             "vgfve"
         );

Please verify that the two existing addresses both decode to Dual and carry the expected memo payloads before merging.

Comment on lines +313 to +317
debug!(
target: LOG_TARGET,
"get_payment_id_address: payment_id: '{:?}' / '{}'",
message.payment_id, String::from_utf8_lossy(&message.payment_id),
);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Debug log leaks raw user data

payment_id (now a generic memo) is logged verbatim in both byte form and lossy UTF-8.
This can inadvertently expose sensitive metadata in log files and in aggregated log pipelines.

- debug!(target: LOG_TARGET, "get_payment_id_address: payment_id: '{:?}' / '{}'", …);
+ trace!(target: LOG_TARGET, "get_payment_id_address: memo length: {}", message.payment_id.len());

Either drop the value entirely or hash/truncate it before printing.

🤖 Prompt for AI Agents
In applications/minotari_console_wallet/src/grpc/wallet_grpc_server.rs around
lines 313 to 317, the debug log prints the raw payment_id data in both byte and
UTF-8 forms, which risks exposing sensitive user information. To fix this,
remove the direct logging of the raw payment_id or replace it with a hashed or
truncated version to protect sensitive metadata from being exposed in logs.

Comment on lines +89 to 96
memo: MemoField,
) -> Result<EncryptedData, EncryptedDataError> {
// Encode the value and mask
let mut bytes = Zeroizing::new(vec![0; SIZE_VALUE + SIZE_MASK + payment_id.get_size()]);
let mut bytes = Zeroizing::new(vec![0; SIZE_VALUE + SIZE_MASK + memo.get_size()]);
bytes[..SIZE_VALUE].clone_from_slice(value.as_u64().to_le_bytes().as_ref());
bytes[SIZE_VALUE..SIZE_VALUE + SIZE_MASK].clone_from_slice(mask.as_bytes());
bytes[SIZE_VALUE + SIZE_MASK..].clone_from_slice(&payment_id.to_bytes());
bytes[SIZE_VALUE + SIZE_MASK..].clone_from_slice(&memo.to_bytes());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add explicit memo-size guard and prefer copy_from_slice over clone_from_slice.

A couple of minor but worthwhile tweaks:

  1. memo.get_size() can overflow MAX_ENCRYPTED_DATA_SIZE silently and only be caught later by the MaxSizeBytes::try_from call. A direct check here fails fast with a descriptive error.

  2. clone_from_slice is unnecessary for u8 slices – copy_from_slice is slightly leaner and avoids the Clone bound.

-let mut bytes = Zeroizing::new(vec![0; SIZE_VALUE + SIZE_MASK + memo.get_size()]);
+let memo_size = memo.get_size();
+
+if memo_size > (MAX_ENCRYPTED_DATA_SIZE - STATIC_ENCRYPTED_DATA_SIZE_TOTAL) {
+    return Err(EncryptedDataError::IncorrectLength(format!(
+        "Memo length {} exceeds maximum of {} bytes",
+        memo_size,
+        MAX_ENCRYPTED_DATA_SIZE - STATIC_ENCRYPTED_DATA_SIZE_TOTAL
+    )));
+}
+
+let mut bytes = Zeroizing::new(vec![0; SIZE_VALUE + SIZE_MASK + memo_size]);

-bytes[..SIZE_VALUE].clone_from_slice(value.as_u64().to_le_bytes().as_ref());
-bytes[SIZE_VALUE..SIZE_VALUE + SIZE_MASK].clone_from_slice(mask.as_bytes());
-bytes[SIZE_VALUE + SIZE_MASK..].clone_from_slice(&memo.to_bytes());
+bytes[..SIZE_VALUE].copy_from_slice(value.as_u64().to_le_bytes().as_ref());
+bytes[SIZE_VALUE..SIZE_VALUE + SIZE_MASK].copy_from_slice(mask.as_bytes());
+bytes[SIZE_VALUE + SIZE_MASK..].copy_from_slice(&memo.to_bytes());
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
memo: MemoField,
) -> Result<EncryptedData, EncryptedDataError> {
// Encode the value and mask
let mut bytes = Zeroizing::new(vec![0; SIZE_VALUE + SIZE_MASK + payment_id.get_size()]);
let mut bytes = Zeroizing::new(vec![0; SIZE_VALUE + SIZE_MASK + memo.get_size()]);
bytes[..SIZE_VALUE].clone_from_slice(value.as_u64().to_le_bytes().as_ref());
bytes[SIZE_VALUE..SIZE_VALUE + SIZE_MASK].clone_from_slice(mask.as_bytes());
bytes[SIZE_VALUE + SIZE_MASK..].clone_from_slice(&payment_id.to_bytes());
bytes[SIZE_VALUE + SIZE_MASK..].clone_from_slice(&memo.to_bytes());
// Encode the value and mask
let memo_size = memo.get_size();
if memo_size > (MAX_ENCRYPTED_DATA_SIZE - STATIC_ENCRYPTED_DATA_SIZE_TOTAL) {
return Err(EncryptedDataError::IncorrectLength(format!(
"Memo length {} exceeds maximum of {} bytes",
memo_size,
MAX_ENCRYPTED_DATA_SIZE - STATIC_ENCRYPTED_DATA_SIZE_TOTAL
)));
}
let mut bytes = Zeroizing::new(vec![0; SIZE_VALUE + SIZE_MASK + memo_size]);
bytes[..SIZE_VALUE].copy_from_slice(value.as_u64().to_le_bytes().as_ref());
bytes[SIZE_VALUE..SIZE_VALUE + SIZE_MASK].copy_from_slice(mask.as_bytes());
bytes[SIZE_VALUE + SIZE_MASK..].copy_from_slice(&memo.to_bytes());
🤖 Prompt for AI Agents
In base_layer/core/src/transactions/transaction_components/encrypted_data.rs
around lines 89 to 96, add an explicit check to ensure that memo.get_size() does
not exceed MAX_ENCRYPTED_DATA_SIZE before proceeding, returning a descriptive
error if it does. Also, replace all instances of clone_from_slice used on u8
slices with copy_from_slice for better performance and to avoid unnecessary
Clone trait bounds.

Copy link
Copy Markdown
Collaborator

@SWvheerden SWvheerden left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks mostly correct,
but the logs must be trace, and the docs strings are wrong in a few places.

@hansieodendaal hansieodendaal force-pushed the ho_payment_id_not_shown branch from 71f616e to 22d576e Compare August 4, 2025 12:18
@SWvheerden SWvheerden merged commit d219520 into tari-project:development Aug 4, 2025
12 of 16 checks passed
@hansieodendaal hansieodendaal deleted the ho_payment_id_not_shown branch August 5, 2025 11:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants