Skip to content
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.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
9 changes: 9 additions & 0 deletions backend/docs/specs/stellar_ingestion/checklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Checklist

- [x] `indexer_state` table created via migration (Sequelize Model defined).
- [x] `IndexerState` model implemented.
- [x] `SubSchedule` model updated with `block_number`.
- [x] `StellarIngestionService` implemented.
- [x] `rollbackToLedger` successfully deletes "future" records.
- [x] `indexer_state` updates correctly after ingestion/rollback.
- [x] Unit tests passing for rollback scenarios.
49 changes: 49 additions & 0 deletions backend/docs/specs/stellar_ingestion/spec.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Stellar Ingestion & Re-org Handling Specification

## Overview
This feature implements robust Stellar ledger ingestion with protection against network re-orgs (forks). It ensures that deposits (vault top-ups) and claims are not double-counted if the network reorganizes.

## Requirements
1. **State Tracking**: Store the `last_ingested_ledger` sequence number in the database.
2. **Re-org Detection**: Detect when the local chain tip diverges from the network (not applicable for simple forward-sync, but necessary for robustness).
3. **Rollback Logic**: Ability to revert database changes (claims, deposits) that occurred after a specific ledger sequence.
4. **Idempotency**: Ensure processing the same ledger twice does not result in duplicate data.

## Architecture

### Database Schema
New table `indexer_state` to track ingestion progress:
```sql
CREATE TABLE indexer_state (
service_name VARCHAR(50) PRIMARY KEY,
last_ingested_ledger BIGINT NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

### Components
1. **`src/services/stellarIngestionService.js`**:
- Manages the ingestion loop (polling or streaming).
- Checks for re-orgs (simulated or actual if using a horizon instance).
- Orchestrates the rollback process.
2. **`src/models/indexerState.js`**: Sequelize model for `indexer_state`.
3. **Rollback Methods**:
- `ClaimsHistory.destroy({ where: { block_number: { [Op.gt]: targetLedger } } })`
- `SubSchedule.destroy({ where: { block_number: { [Op.gt]: targetLedger } } })` (Note: `block_number` needs to be added to `SubSchedule` if missing).

## Data Flow
1. **Ingestion**:
- Fetch next ledger from Stellar Horizon/RPC.
- Process transactions (deposits/claims).
- Update `indexer_state` with `last_ingested_ledger`.
- Commit transaction.

2. **Re-org Handling (Rollback)**:
- If a re-org is detected (e.g., current ledger parent hash != stored last ledger hash - *advanced, for now we will implement the rollback mechanism triggered manually or by specific error*), or if we need to re-process:
- Call `rollbackToLedger(targetSequence)`.
- Delete all `ClaimsHistory` and `SubSchedule` records with `block_number > targetSequence`.
- Update `indexer_state` to `targetSequence`.

## Configuration
- `STELLAR_HORIZON_URL`: URL of the Stellar Horizon instance.
- `STARTING_LEDGER`: Ledger sequence to start ingestion from (if state is empty).
11 changes: 11 additions & 0 deletions backend/docs/specs/stellar_ingestion/tasks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Tasks

1. [x] Create migration for `indexer_state` table. (Handled via Sequelize sync in `models/index.js` but model definition created)
2. [x] Create `src/models/indexerState.js` model.
3. [x] Add `block_number` (ledger sequence) column to `SubSchedule` model/table if it doesn't exist (it exists in `ClaimsHistory`).
4. [x] Create `src/services/stellarIngestionService.js` with:
- `getLastIngestedLedger()`
- `updateLastIngestedLedger(sequence)`
- `rollbackToLedger(sequence)`
5. [x] Implement `rollbackToLedger` logic to delete records from `ClaimsHistory` and `SubSchedule` greater than the target ledger.
6. [x] Add unit tests for `stellarIngestionService` specifically testing the rollback logic.
16 changes: 16 additions & 0 deletions backend/node_modules/.bin/apollo-pbjs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions backend/node_modules/.bin/apollo-pbjs.cmd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions backend/node_modules/.bin/apollo-pbjs.ps1

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions backend/node_modules/.bin/apollo-pbts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions backend/node_modules/.bin/apollo-pbts.cmd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions backend/node_modules/.bin/apollo-pbts.ps1

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions backend/node_modules/.bin/baseline-browser-mapping

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions backend/node_modules/.bin/baseline-browser-mapping.cmd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions backend/node_modules/.bin/baseline-browser-mapping.ps1

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions backend/node_modules/.bin/browserslist

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions backend/node_modules/.bin/browserslist.cmd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions backend/node_modules/.bin/browserslist.ps1

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions backend/node_modules/.bin/create-jest

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions backend/node_modules/.bin/create-jest.cmd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions backend/node_modules/.bin/create-jest.ps1

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading