Skip to content

feat: add replaced_by_tx_id to replaced mempool transactions #2271

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

Merged
merged 20 commits into from
Jun 2, 2025

Conversation

rafaelcr
Copy link
Collaborator

@rafaelcr rafaelcr commented May 2, 2025

This PR performs multiple checks to make sure we trace transactions that are replaced by fee correctly:

  1. Adds a replaced_by_tx_id key to dropped mempool transaction responses that will include another transaction ID if this represents an RBF operation.
  2. Takes the new_tx_id field from Stacks core when included on dropped mempool messages
  3. On mempool inserts, block confirmations and re-orgs, check for duplicate nonces for the same sender/sponsor and calculate the correct RBF setting. In other words, find the same nonce transaction that got confirmed or has the highest fee and mark all others as replaced.

Replaces #2141
Fixes #1813

Copy link

github-actions bot commented May 2, 2025

Vercel deployment URL: https://stacks-blockchain-1ht0fcc46-hirosystems.vercel.app 🚀

Copy link

codecov bot commented May 2, 2025

Codecov Report

Attention: Patch coverage is 86.36364% with 3 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/datastore/pg-write-store.ts 90.00% 2 Missing ⚠️
src/event-stream/event-server.ts 0.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@rafaelcr rafaelcr marked this pull request as ready for review May 2, 2025 19:32
@rafaelcr rafaelcr changed the title feat: specify transaction id being replaced in mempool results feat: add replaced_by_tx_id to replaced mempool transactions May 2, 2025
@@ -2129,8 +2207,8 @@ describe('mempool tests', () => {
});
});

test('prunes transactions with nonces that were already confirmed', async () => {
// Initial block
test('prunes and restores replaced-by-fee transactions', async () => {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@zone117x this is the main test of the new functionality

Copy link
Member

@zone117x zone117x left a comment

Choose a reason for hiding this comment

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

The code looks great, nice tests 💯

The new sql query is in the block ingestion path -- have we tested its performance?

Copy link
Collaborator

@janniks janniks left a comment

Choose a reason for hiding this comment

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

Nice test 👍

@rafaelcr
Copy link
Collaborator Author

@zone117x thanks, I've tested locally but the next step will be to deploy this PR to dev and then staging to perform some load tests

@rafaelcr rafaelcr merged commit a70c3d1 into develop Jun 2, 2025
26 checks passed
@rafaelcr rafaelcr deleted the feat/rbf branch June 2, 2025 15:12
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.

specify which transaction replaced another via RBF
3 participants