Skip to content

Commit 580fc8f

Browse files
authored
Add Balance Verification into backend and frontend (#33)
1 parent 8465175 commit 580fc8f

File tree

4 files changed

+80
-12
lines changed

4 files changed

+80
-12
lines changed

backend/src/routes/updates.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ type EventType =
2828
| 'dmpQueueEvent'
2929
| 'umpQueueEvent'
3030
| 'dmpQueuePriority'
31-
| 'umpQueuePriority';
31+
| 'umpQueuePriority'
32+
| 'rcBalanceMigration';
3233

3334
export const updatesHandler: RequestHandler = async (req: Request, res: Response) => {
3435
const requestedEvents = ((req.query.events as string) || '')

backend/src/services/BlockProcessor.ts

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { PalletRcMigratorMigrationStage, PalletRcMigratorQueuePriority } from '../types/pjs';
1+
import type { PalletRcMigratorMigrationStage, PalletRcMigratorQueuePriority, PalletRcMigratorAccountsMigratedBalances } from '../types/pjs';
22
import type { ApiDecoration } from '@polkadot/api/types';
33
import type { Vec, Bytes } from '@polkadot/types';
44
import type { Event } from '@polkadot/types/interfaces';
@@ -49,6 +49,7 @@ export class BlockProcessor {
4949
private processing: Map<string, boolean> = new Map();
5050
private lastBlockNumber: Map<string, number> = new Map();
5151
private previousDmpQueueSize: number = 0;
52+
private previousRcBalanceMigration: { kept: string; migrated: string } | null = null;
5253
private currentMode: ProcessingMode = ProcessingMode.DETECTION;
5354
private migrationStartBlockNumber?: number;
5455
private rcPriorityConfigQueried: boolean = false;
@@ -745,29 +746,33 @@ export class BlockProcessor {
745746
try {
746747
// Query priority config only once on first full mode block
747748
if (!this.rcPriorityConfigQueried) {
748-
const [migrationStage, dmpMessageQueue, umpQueuePriority] = await Promise.all([
749+
const [migrationStage, dmpMessageQueue, umpQueuePriority, rcBalanceMigration] = await Promise.all([
749750
apiAt.query.rcMigrator.rcMigrationStage<PalletRcMigratorMigrationStage>(),
750751
apiAt.query.dmp.downwardMessageQueues<Vec<PolkadotCorePrimitivesInboundDownwardMessage>>(
751752
1000
752753
),
753754
apiAt.query.rcMigrator.ahUmpQueuePriorityConfig<PalletRcMigratorQueuePriority>(),
755+
apiAt.query.rcMigrator.rcMigratedBalance<PalletRcMigratorAccountsMigratedBalances>(),
754756
]);
755757

756758
await this.handleRcMigrationStage(migrationStage, item);
757759
await this.handleRcDownwardMessageQueues(dmpMessageQueue, item);
758760
await this.handleUmpQueuePriority(umpQueuePriority, item);
761+
await this.handleRcBalanceMigration(rcBalanceMigration, item);
759762

760763
this.rcPriorityConfigQueried = true;
761764
} else {
762-
const [migrationStage, dmpMessageQueue] = await Promise.all([
765+
const [migrationStage, dmpMessageQueue, rcBalanceMigration] = await Promise.all([
763766
apiAt.query.rcMigrator.rcMigrationStage<PalletRcMigratorMigrationStage>(),
764767
apiAt.query.dmp.downwardMessageQueues<Vec<PolkadotCorePrimitivesInboundDownwardMessage>>(
765768
1000
766769
),
770+
apiAt.query.rcMigrator.rcMigratedBalance<PalletRcMigratorAccountsMigratedBalances>(),
767771
]);
768772

769773
await this.handleRcMigrationStage(migrationStage, item);
770774
await this.handleRcDownwardMessageQueues(dmpMessageQueue, item);
775+
await this.handleRcBalanceMigration(rcBalanceMigration, item);
771776
}
772777

773778
Log.service({
@@ -1067,6 +1072,63 @@ export class BlockProcessor {
10671072
}
10681073
}
10691074

1075+
private async handleRcBalanceMigration(
1076+
balanceMigration: PalletRcMigratorAccountsMigratedBalances,
1077+
item: QueueItem
1078+
): Promise<void> {
1079+
try {
1080+
const kept = balanceMigration.kept.toString();
1081+
const migrated = balanceMigration.migrated.toString();
1082+
1083+
// Don't emit if migrated goes to 0 after previously being above 0 (migration completion reset)
1084+
if (
1085+
this.previousRcBalanceMigration &&
1086+
this.previousRcBalanceMigration.migrated !== '0' &&
1087+
migrated === '0'
1088+
) {
1089+
Log.service({
1090+
service: 'RC Balance Migration',
1091+
action: 'Ignoring reset to zero (migration completed)',
1092+
details: {
1093+
previousMigrated: this.previousRcBalanceMigration.migrated,
1094+
},
1095+
});
1096+
return;
1097+
}
1098+
1099+
// Only emit if values have changed
1100+
if (
1101+
!this.previousRcBalanceMigration ||
1102+
this.previousRcBalanceMigration.kept !== kept ||
1103+
this.previousRcBalanceMigration.migrated !== migrated
1104+
) {
1105+
eventService.emit('rcBalanceMigration', {
1106+
kept: kept.toString(),
1107+
migrated: migrated.toString(),
1108+
timestamp: new Date(item.timestamp!).toISOString(),
1109+
});
1110+
1111+
Log.service({
1112+
service: 'RC Balance Migration',
1113+
action: 'Balance migration values updated',
1114+
details: {
1115+
kept: kept.toString(),
1116+
migrated: migrated.toString(),
1117+
},
1118+
});
1119+
1120+
// Update tracking variable
1121+
this.previousRcBalanceMigration = { kept, migrated };
1122+
}
1123+
} catch (error) {
1124+
Log.service({
1125+
service: 'RC Balance Migration',
1126+
action: 'Error processing RC balance migration',
1127+
error: error as Error,
1128+
});
1129+
}
1130+
}
1131+
10701132
/**
10711133
* Lightweight detection mode - only looks for migration scheduling events on Relay Chain
10721134
*/

backend/src/types/pjs.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,19 @@ interface PalletRcMigratorCall extends Enum {
2929
| 'UpdateAhMsgProcessedCount';
3030
}
3131

32+
export interface PalletRcMigratorAccountsMigratedBalances extends Struct {
33+
readonly kept: u128;
34+
readonly migrated: u128;
35+
}
36+
3237
/** @name PalletRcMigratorQueuePriority (552) */
33-
export interface PalletRcMigratorQueuePriority extends Enum {
34-
readonly isConfig: boolean;
35-
readonly isOverrideConfig: boolean;
36-
readonly asOverrideConfig: ITuple<[u32, u32]>;
37-
readonly isDisabled: boolean;
38-
readonly type: 'Config' | 'OverrideConfig' | 'Disabled';
39-
}
38+
export interface PalletRcMigratorQueuePriority extends Enum {
39+
readonly isConfig: boolean;
40+
readonly isOverrideConfig: boolean;
41+
readonly asOverrideConfig: ITuple<[u32, u32]>;
42+
readonly isDisabled: boolean;
43+
readonly type: 'Config' | 'OverrideConfig' | 'Disabled';
44+
}
4045

4146
/** @name PalletRcMigratorMigrationStage (503) */
4247
export interface PalletRcMigratorMigrationStage extends Enum {

frontend/src/hooks/useEventSource.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export const EventSourceProvider: React.FC<EventSourceProviderProps> = ({
8484
eventSourceRef.current.close();
8585
}
8686

87-
const allEventTypes: EventType[] = ['rcHead', 'ahHead', 'dmpMessageCounter', 'umpMessageCounter', 'rcStageUpdate', 'ahStageUpdate', 'dmpQueueEvent', 'umpQueueEvent', 'dmpQueuePriority', 'umpQueuePriority', 'palletMigrationUpdate', 'palletMigrationSummary'];
87+
const allEventTypes: EventType[] = ['rcHead', 'ahHead', 'dmpMessageCounter', 'umpMessageCounter', 'rcStageUpdate', 'ahStageUpdate', 'dmpQueueEvent', 'umpQueueEvent', 'dmpQueuePriority', 'umpQueuePriority', 'rcBalanceMigration', 'palletMigrationUpdate', 'palletMigrationSummary'];
8888
const apiUrl = url ? `${url}/api/updates` : '/api/updates';
8989
const es = new EventSource(`${apiUrl}?events=${allEventTypes.join(',')}`);
9090

0 commit comments

Comments
 (0)