fix: Fix edge case where txIndex is the same as logIndex (#1368)

This commit is contained in:
Sanjay
2023-09-08 15:40:02 -07:00
committed by GitHub
parent 0805122c55
commit 79e23bf85e
2 changed files with 9 additions and 4 deletions

View File

@@ -31,6 +31,7 @@ import { ok, ResultAsync } from "neverthrow";
import { OnChainEventPostfix, RootPrefix } from "../db/types.js";
import { getHubState, putHubState } from "../db/hubState.js";
import { PageOptions } from "./types.js";
import { logger } from "../../utils/logger.js";
const SUPPORTED_SIGNER_SCHEMES = [1];
export const MIGRATION_BLOCK = 108911959;
@@ -146,10 +147,12 @@ class OnChainEventStore {
() => undefined,
);
if (_badEvent.isOk()) {
const txn = putOnChainEventTransaction(this._db.transaction(), event);
const incorrectPrimaryKey = makeOnChainEventPrimaryKey(event.type, event.fid, event.blockNumber, event.txIndex);
const correctPrimaryKey = makeOnChainEventPrimaryKey(event.type, event.fid, event.blockNumber, event.logIndex);
const txn = this._db.transaction();
txn.del(incorrectPrimaryKey);
putOnChainEventTransaction(txn, event);
if (isSignerOnChainEvent(_badEvent.value)) {
txn.put(makeSignerOnChainEventBySignerKey(event.fid, _badEvent.value.signerEventBody.key), correctPrimaryKey);
} else if (isIdRegisterOnChainEvent(_badEvent.value)) {
@@ -245,7 +248,7 @@ class OnChainEventStore {
() => undefined,
);
if (existingEventResult.isErr()) {
throw new HubError("unavailable.storage_failure", `secondary index corrupted for ${secondaryKey}`);
logger.warn(`secondary index corrupted for ${secondaryKey.toString("hex")}`);
} else {
return existingEventResult.value;
}

View File

@@ -52,8 +52,9 @@ describe("OnChainEventStore", () => {
badSignerEvent.txIndex = txIndex;
badSignerEvent.logIndex = logIndex;
badRegisterEvent.txIndex = txIndex;
badRegisterEvent.logIndex = logIndex;
badRegisterEvent.logIndex = txIndex; // Assume log index is the same as tx index
await expect(set.mergeOnChainEvent(badSignerEvent)).rejects.toThrow("already exists");
await expect(set.mergeOnChainEvent(badSignerEvent)).rejects.toThrow("already exists");
const signerEvents = await set.getOnChainEvents(OnChainEventType.EVENT_TYPE_SIGNER, badSignerEvent.fid);
expect(signerEvents).toHaveLength(1);
@@ -63,6 +64,7 @@ describe("OnChainEventStore", () => {
const onChainSigner = await set.getActiveSigner(badSignerEvent.fid, badSignerEvent.signerEventBody.key);
expect(onChainSigner.signerEventBody.key).toEqual(badSignerEvent.signerEventBody.key);
await expect(set.mergeOnChainEvent(badRegisterEvent)).rejects.toThrow("already exists");
await expect(set.mergeOnChainEvent(badRegisterEvent)).rejects.toThrow("already exists");
const registerEvents = await set.getOnChainEvents(
OnChainEventType.EVENT_TYPE_ID_REGISTER,
@@ -70,7 +72,7 @@ describe("OnChainEventStore", () => {
);
expect(registerEvents).toHaveLength(1);
expect(registerEvents[0]?.txIndex).toEqual(txIndex);
expect(registerEvents[0]?.logIndex).toEqual(logIndex);
expect(registerEvents[0]?.logIndex).toEqual(txIndex);
const idRegisterByFid = await set.getIdRegisterEventByFid(badRegisterEvent.fid);
expect(idRegisterByFid).toEqual(badRegisterEvent);