From 5de36b075f83a37d34698fe0a6e3a160d97b60df Mon Sep 17 00:00:00 2001 From: Pablo Maldonado Date: Thu, 15 Jan 2026 10:32:49 +0000 Subject: [PATCH 1/3] fix: Hash ancillaryData in entity IDs to prevent PostgreSQL index overflow --- .../src/mappings/optimisticOracleV2.ts | 79 +++++++++---------- .../src/utils/helpers/index.ts | 2 +- .../src/utils/helpers/optimisticOracle.ts | 20 ++++- .../managed-oracle-v2/managedOracle.test.ts | 19 ++++- 4 files changed, 71 insertions(+), 49 deletions(-) diff --git a/packages/managed-oracle-v2/src/mappings/optimisticOracleV2.ts b/packages/managed-oracle-v2/src/mappings/optimisticOracleV2.ts index 1141817..c0331a8 100644 --- a/packages/managed-oracle-v2/src/mappings/optimisticOracleV2.ts +++ b/packages/managed-oracle-v2/src/mappings/optimisticOracleV2.ts @@ -8,7 +8,7 @@ import { SetEventBasedCall, Settle, } from "../../generated/ManagedOracleV2/ManagedOracleV2"; -import { getManagedRequestId, getOrCreateOptimisticPriceRequest } from "../utils/helpers"; +import { createOptimisticPriceRequestId, getManagedRequestId, getOrCreateOptimisticPriceRequest } from "../utils/helpers"; import { CustomBond, CustomLiveness } from "../../generated/schema"; import { Address, BigInt, Bytes, dataSource, log } from "@graphprotocol/graph-ts"; @@ -89,12 +89,11 @@ export function handleOptimisticRequestPrice(event: RequestPrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -184,12 +183,11 @@ export function handleOptimisticProposePrice(event: ProposePrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -260,12 +258,11 @@ export function handleOptimisticDisputePrice(event: DisputePrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -306,12 +303,11 @@ export function handleOptimisticSettle(event: Settle): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -347,12 +343,11 @@ export function handleSetCustomLiveness(call: SetCustomLivenessCall): void { call.inputs.ancillaryData.toHex(), call.inputs.customLiveness.toString(), ]); - let requestId = call.inputs.identifier - .toString() - .concat("-") - .concat(call.inputs.timestamp.toString()) - .concat("-") - .concat(call.inputs.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + call.inputs.identifier, + call.inputs.timestamp, + call.inputs.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); request.customLiveness = call.inputs.customLiveness; @@ -367,12 +362,11 @@ export function handleSetBond(call: SetBondCall): void { call.inputs.ancillaryData.toHex(), call.inputs.bond.toString(), ]); - let requestId = call.inputs.identifier - .toString() - .concat("-") - .concat(call.inputs.timestamp.toString()) - .concat("-") - .concat(call.inputs.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + call.inputs.identifier, + call.inputs.timestamp, + call.inputs.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); request.bond = call.inputs.bond; @@ -386,12 +380,11 @@ export function handleSetEventBased(call: SetEventBasedCall): void { call.inputs.identifier.toString(), call.inputs.ancillaryData.toHex(), ]); - let requestId = call.inputs.identifier - .toString() - .concat("-") - .concat(call.inputs.timestamp.toString()) - .concat("-") - .concat(call.inputs.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + call.inputs.identifier, + call.inputs.timestamp, + call.inputs.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); request.eventBased = true; diff --git a/packages/managed-oracle-v2/src/utils/helpers/index.ts b/packages/managed-oracle-v2/src/utils/helpers/index.ts index 76b46bd..3f9cdba 100644 --- a/packages/managed-oracle-v2/src/utils/helpers/index.ts +++ b/packages/managed-oracle-v2/src/utils/helpers/index.ts @@ -1,2 +1,2 @@ -export { getOrCreateOptimisticPriceRequest } from "./optimisticOracle"; +export { getOrCreateOptimisticPriceRequest, createOptimisticPriceRequestId } from "./optimisticOracle"; export { getManagedRequestId } from "./managedOracleV2"; diff --git a/packages/managed-oracle-v2/src/utils/helpers/optimisticOracle.ts b/packages/managed-oracle-v2/src/utils/helpers/optimisticOracle.ts index f4f9058..8e081da 100644 --- a/packages/managed-oracle-v2/src/utils/helpers/optimisticOracle.ts +++ b/packages/managed-oracle-v2/src/utils/helpers/optimisticOracle.ts @@ -1,9 +1,25 @@ -import { Bytes } from "@graphprotocol/graph-ts"; +import { BigInt, Bytes, crypto } from "@graphprotocol/graph-ts"; import { OptimisticPriceRequest } from "../../../generated/schema"; import { BIGINT_ZERO } from "../constants"; + +// Creates a unique ID for an OptimisticPriceRequest entity. +export function createOptimisticPriceRequestId( + identifier: Bytes, + timestamp: BigInt, + ancillaryData: Bytes +): string { + const ancillaryDataHash = crypto.keccak256(ancillaryData).toHexString(); + return identifier + .toString() + .concat("-") + .concat(timestamp.toString()) + .concat("-") + .concat(ancillaryDataHash); +} + export function getOrCreateOptimisticPriceRequest( - id: String, + id: string, createIfNotFound: boolean = true ): OptimisticPriceRequest { let request = OptimisticPriceRequest.load(id); diff --git a/packages/managed-oracle-v2/tests/managed-oracle-v2/managedOracle.test.ts b/packages/managed-oracle-v2/tests/managed-oracle-v2/managedOracle.test.ts index 1b46b17..f40c61f 100644 --- a/packages/managed-oracle-v2/tests/managed-oracle-v2/managedOracle.test.ts +++ b/packages/managed-oracle-v2/tests/managed-oracle-v2/managedOracle.test.ts @@ -2,6 +2,7 @@ import { describe, test, clearStore, assert, log, afterEach } from "matchstick-a import { handleCustomLivenessSet, handleCustomBondSet } from "../../src/mappings/managedOracleV2"; import { handleOptimisticProposePrice, handleOptimisticRequestPrice } from "../../src/mappings/optimisticOracleV2"; import { createCustomBondIdFromEvent } from "../../src/utils/helpers/managedOracleV2"; +import { createOptimisticPriceRequestId } from "../../src/utils/helpers/optimisticOracle"; import { createCustomLivenessSetEvent, createCustomBondSetEvent, @@ -173,7 +174,11 @@ describe("Managed OOv2", () => { ); handleOptimisticRequestPrice(requestPriceEvent); - const requestId = identifierString.concat("-").concat(timestamp.toString()).concat("-").concat(ancillaryData); + const requestId = createOptimisticPriceRequestId( + Bytes.fromHexString(identifierHex) as Bytes, + BigInt.fromI32(timestamp), + Bytes.fromHexString(ancillaryData) as Bytes + ); const priceRequestEntity = OptimisticPriceRequest.load(requestId); @@ -294,7 +299,11 @@ describe("Managed OOv2", () => { ); handleOptimisticProposePrice(proposePriceEvent); - const requestId = identifierString.concat("-").concat(timestamp.toString()).concat("-").concat(ancillaryData); + const requestId = createOptimisticPriceRequestId( + Bytes.fromHexString(identifierHex) as Bytes, + BigInt.fromI32(timestamp), + Bytes.fromHexString(ancillaryData) as Bytes + ); const priceRequestEntity = OptimisticPriceRequest.load(requestId); @@ -389,7 +398,11 @@ describe("Managed OOv2", () => { ); handleOptimisticRequestPrice(requestPriceEvent); - const requestId = identifierString.concat("-").concat(timestamp.toString()).concat("-").concat(ancillaryData); + const requestId = createOptimisticPriceRequestId( + Bytes.fromHexString(identifierHex) as Bytes, + BigInt.fromI32(timestamp), + Bytes.fromHexString(ancillaryData) as Bytes + ); const priceRequestEntity = OptimisticPriceRequest.load(requestId); From 05c42bda9fcef3f6b3766507d29035597e855d2c Mon Sep 17 00:00:00 2001 From: Pablo Maldonado Date: Thu, 15 Jan 2026 12:58:22 +0000 Subject: [PATCH 2/3] fix: remaining ancillary data in keys --- .../src/mappings/optimisticOracleV2.ts | 79 +++++++++---------- .../src/utils/helpers/index.ts | 2 +- .../src/utils/helpers/optimisticOracle.ts | 17 +++- .../src/mappings/optimisticOracle.ts | 57 ++++++------- .../src/utils/helpers/index.ts | 2 +- .../src/utils/helpers/optimisticOracle.ts | 16 ++++ .../src/mappings/skinnyOptimisticOracle.ts | 46 +++++------ .../src/utils/helpers/index.ts | 2 +- .../src/utils/helpers/optimisticOracle.ts | 16 ++++ .../voting/src/mappings/votingAncillary.ts | 61 +++++++------- packages/voting/src/utils/helpers/index.ts | 2 + packages/voting/src/utils/helpers/voting.ts | 38 +++++++++ packages/votingV2/src/mappings/votingV2.ts | 24 +++--- packages/votingV2/src/utils/helpers/voting.ts | 18 +++-- 14 files changed, 225 insertions(+), 155 deletions(-) diff --git a/packages/optimistic-oracle-v2/src/mappings/optimisticOracleV2.ts b/packages/optimistic-oracle-v2/src/mappings/optimisticOracleV2.ts index 26452bf..f110752 100644 --- a/packages/optimistic-oracle-v2/src/mappings/optimisticOracleV2.ts +++ b/packages/optimistic-oracle-v2/src/mappings/optimisticOracleV2.ts @@ -8,7 +8,7 @@ import { SetEventBasedCall, Settle, } from "../../generated/OptimisticOracleV2/OptimisticOracleV2"; -import { getOrCreateOptimisticPriceRequest } from "../utils/helpers"; +import { createOptimisticPriceRequestId, getOrCreateOptimisticPriceRequest } from "../utils/helpers"; import { Address, BigInt, Bytes, dataSource, log } from "@graphprotocol/graph-ts"; @@ -56,12 +56,11 @@ export function handleOptimisticRequestPrice(event: RequestPrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -122,12 +121,11 @@ export function handleOptimisticProposePrice(event: ProposePrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -169,12 +167,11 @@ export function handleOptimisticDisputePrice(event: DisputePrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -215,12 +212,11 @@ export function handleOptimisticSettle(event: Settle): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -256,12 +252,11 @@ export function handleSetCustomLiveness(call: SetCustomLivenessCall): void { call.inputs.ancillaryData.toHex(), call.inputs.customLiveness.toString(), ]); - let requestId = call.inputs.identifier - .toString() - .concat("-") - .concat(call.inputs.timestamp.toString()) - .concat("-") - .concat(call.inputs.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + call.inputs.identifier, + call.inputs.timestamp, + call.inputs.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); request.customLiveness = call.inputs.customLiveness; @@ -276,12 +271,11 @@ export function handleSetBond(call: SetBondCall): void { call.inputs.ancillaryData.toHex(), call.inputs.bond.toString(), ]); - let requestId = call.inputs.identifier - .toString() - .concat("-") - .concat(call.inputs.timestamp.toString()) - .concat("-") - .concat(call.inputs.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + call.inputs.identifier, + call.inputs.timestamp, + call.inputs.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); request.bond = call.inputs.bond; @@ -295,12 +289,11 @@ export function handleSetEventBased(call: SetEventBasedCall): void { call.inputs.identifier.toString(), call.inputs.ancillaryData.toHex(), ]); - let requestId = call.inputs.identifier - .toString() - .concat("-") - .concat(call.inputs.timestamp.toString()) - .concat("-") - .concat(call.inputs.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + call.inputs.identifier, + call.inputs.timestamp, + call.inputs.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); request.eventBased = true; diff --git a/packages/optimistic-oracle-v2/src/utils/helpers/index.ts b/packages/optimistic-oracle-v2/src/utils/helpers/index.ts index 176a55e..ad82039 100644 --- a/packages/optimistic-oracle-v2/src/utils/helpers/index.ts +++ b/packages/optimistic-oracle-v2/src/utils/helpers/index.ts @@ -1 +1 @@ -export { getOrCreateOptimisticPriceRequest } from "./optimisticOracle"; +export { getOrCreateOptimisticPriceRequest, createOptimisticPriceRequestId } from "./optimisticOracle"; diff --git a/packages/optimistic-oracle-v2/src/utils/helpers/optimisticOracle.ts b/packages/optimistic-oracle-v2/src/utils/helpers/optimisticOracle.ts index f4f9058..a49440b 100644 --- a/packages/optimistic-oracle-v2/src/utils/helpers/optimisticOracle.ts +++ b/packages/optimistic-oracle-v2/src/utils/helpers/optimisticOracle.ts @@ -1,7 +1,22 @@ -import { Bytes } from "@graphprotocol/graph-ts"; +import { BigInt, Bytes, crypto } from "@graphprotocol/graph-ts"; import { OptimisticPriceRequest } from "../../../generated/schema"; import { BIGINT_ZERO } from "../constants"; +// Creates a unique ID for an OptimisticPriceRequest entity. +export function createOptimisticPriceRequestId( + identifier: Bytes, + timestamp: BigInt, + ancillaryData: Bytes +): string { + const ancillaryDataHash = crypto.keccak256(ancillaryData).toHexString(); + return identifier + .toString() + .concat("-") + .concat(timestamp.toString()) + .concat("-") + .concat(ancillaryDataHash); +} + export function getOrCreateOptimisticPriceRequest( id: String, createIfNotFound: boolean = true diff --git a/packages/optimistic-oracle/src/mappings/optimisticOracle.ts b/packages/optimistic-oracle/src/mappings/optimisticOracle.ts index 04d9b9e..26ca021 100644 --- a/packages/optimistic-oracle/src/mappings/optimisticOracle.ts +++ b/packages/optimistic-oracle/src/mappings/optimisticOracle.ts @@ -6,7 +6,7 @@ import { SetBondCall, Settle, } from "../../generated/OptimisticOracle/OptimisticOracle"; -import { getOrCreateOptimisticPriceRequest } from "../utils/helpers"; +import { createOptimisticPriceRequestId, getOrCreateOptimisticPriceRequest } from "../utils/helpers"; import { Address, BigInt, Bytes, log, dataSource } from "@graphprotocol/graph-ts"; @@ -54,12 +54,11 @@ export function handleOptimisticRequestPrice(event: RequestPrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -117,12 +116,11 @@ export function handleOptimisticProposePrice(event: ProposePrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -164,12 +162,11 @@ export function handleOptimisticDisputePrice(event: DisputePrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -210,12 +207,11 @@ export function handleOptimisticSettle(event: Settle): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + event.params.timestamp, + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -251,12 +247,11 @@ export function handleSetBond(call: SetBondCall): void { call.inputs.ancillaryData.toHex(), call.inputs.bond.toString(), ]); - let requestId = call.inputs.identifier - .toString() - .concat("-") - .concat(call.inputs.timestamp.toString()) - .concat("-") - .concat(call.inputs.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + call.inputs.identifier, + call.inputs.timestamp, + call.inputs.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); request.finalFee = call.outputs.totalBond; diff --git a/packages/optimistic-oracle/src/utils/helpers/index.ts b/packages/optimistic-oracle/src/utils/helpers/index.ts index 176a55e..ad82039 100644 --- a/packages/optimistic-oracle/src/utils/helpers/index.ts +++ b/packages/optimistic-oracle/src/utils/helpers/index.ts @@ -1 +1 @@ -export { getOrCreateOptimisticPriceRequest } from "./optimisticOracle"; +export { getOrCreateOptimisticPriceRequest, createOptimisticPriceRequestId } from "./optimisticOracle"; diff --git a/packages/optimistic-oracle/src/utils/helpers/optimisticOracle.ts b/packages/optimistic-oracle/src/utils/helpers/optimisticOracle.ts index cc48822..8a90be1 100644 --- a/packages/optimistic-oracle/src/utils/helpers/optimisticOracle.ts +++ b/packages/optimistic-oracle/src/utils/helpers/optimisticOracle.ts @@ -1,5 +1,21 @@ +import { BigInt, Bytes, crypto } from "@graphprotocol/graph-ts"; import { OptimisticPriceRequest } from "../../../generated/schema"; +// Creates a unique ID for an OptimisticPriceRequest entity. +export function createOptimisticPriceRequestId( + identifier: Bytes, + timestamp: BigInt, + ancillaryData: Bytes +): string { + const ancillaryDataHash = crypto.keccak256(ancillaryData).toHexString(); + return identifier + .toString() + .concat("-") + .concat(timestamp.toString()) + .concat("-") + .concat(ancillaryDataHash); +} + export function getOrCreateOptimisticPriceRequest( id: String, createIfNotFound: boolean = true diff --git a/packages/skinny-optimistic-oracle/src/mappings/skinnyOptimisticOracle.ts b/packages/skinny-optimistic-oracle/src/mappings/skinnyOptimisticOracle.ts index 7951769..2daa76c 100644 --- a/packages/skinny-optimistic-oracle/src/mappings/skinnyOptimisticOracle.ts +++ b/packages/skinny-optimistic-oracle/src/mappings/skinnyOptimisticOracle.ts @@ -10,7 +10,7 @@ import { SkinnyOptimisticOracle, SkinnyOptimisticOracle__getStateInputRequestStruct, } from "../../generated/SkinnyOptimisticOracle/SkinnyOptimisticOracle"; -import { getOrCreateOptimisticPriceRequest } from "../utils/helpers"; +import { createOptimisticPriceRequestId, getOrCreateOptimisticPriceRequest } from "../utils/helpers"; import { Address, BigInt, Bytes, ethereum, log } from "@graphprotocol/graph-ts"; @@ -63,12 +63,11 @@ export function handleOptimisticRequestPrice(event: RequestPrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + BigInt.fromI32(event.params.timestamp), + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -112,12 +111,11 @@ export function handleOptimisticProposePrice(event: ProposePrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + BigInt.fromI32(event.params.timestamp), + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -156,12 +154,11 @@ export function handleOptimisticDisputePrice(event: DisputePrice): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + BigInt.fromI32(event.params.timestamp), + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); @@ -198,12 +195,11 @@ export function handleOptimisticSettle(event: Settle): void { event.params.identifier.toString(), event.params.ancillaryData.toHex(), ]); - let requestId = event.params.identifier - .toString() - .concat("-") - .concat(event.params.timestamp.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let requestId = createOptimisticPriceRequestId( + event.params.identifier, + BigInt.fromI32(event.params.timestamp), + event.params.ancillaryData + ); let request = getOrCreateOptimisticPriceRequest(requestId); diff --git a/packages/skinny-optimistic-oracle/src/utils/helpers/index.ts b/packages/skinny-optimistic-oracle/src/utils/helpers/index.ts index 176a55e..ad82039 100644 --- a/packages/skinny-optimistic-oracle/src/utils/helpers/index.ts +++ b/packages/skinny-optimistic-oracle/src/utils/helpers/index.ts @@ -1 +1 @@ -export { getOrCreateOptimisticPriceRequest } from "./optimisticOracle"; +export { getOrCreateOptimisticPriceRequest, createOptimisticPriceRequestId } from "./optimisticOracle"; diff --git a/packages/skinny-optimistic-oracle/src/utils/helpers/optimisticOracle.ts b/packages/skinny-optimistic-oracle/src/utils/helpers/optimisticOracle.ts index cc48822..8a90be1 100644 --- a/packages/skinny-optimistic-oracle/src/utils/helpers/optimisticOracle.ts +++ b/packages/skinny-optimistic-oracle/src/utils/helpers/optimisticOracle.ts @@ -1,5 +1,21 @@ +import { BigInt, Bytes, crypto } from "@graphprotocol/graph-ts"; import { OptimisticPriceRequest } from "../../../generated/schema"; +// Creates a unique ID for an OptimisticPriceRequest entity. +export function createOptimisticPriceRequestId( + identifier: Bytes, + timestamp: BigInt, + ancillaryData: Bytes +): string { + const ancillaryDataHash = crypto.keccak256(ancillaryData).toHexString(); + return identifier + .toString() + .concat("-") + .concat(timestamp.toString()) + .concat("-") + .concat(ancillaryDataHash); +} + export function getOrCreateOptimisticPriceRequest( id: String, createIfNotFound: boolean = true diff --git a/packages/voting/src/mappings/votingAncillary.ts b/packages/voting/src/mappings/votingAncillary.ts index 2c6daad..60f463d 100644 --- a/packages/voting/src/mappings/votingAncillary.ts +++ b/packages/voting/src/mappings/votingAncillary.ts @@ -16,6 +16,8 @@ import { getOrCreatePriceRequestRound, getTokenContract, getOrCreateVoterGroup, + createPriceRequestRoundId, + createVoteId, } from "../utils/helpers"; import { toDecimal } from "../utils/decimals"; import { BIGDECIMAL_HUNDRED, BIGDECIMAL_ONE, BIGDECIMAL_ZERO, BIGINT_ZERO, BIGINT_ONE } from "../utils/constants"; @@ -48,7 +50,7 @@ export function handlePriceResolved(event: PriceResolved): void { let requestId = event.params.identifier.toString().concat("-").concat(event.params.time.toString()); let request = getOrCreatePriceRequest(requestId); let requestRound = getOrCreatePriceRequestRound( - requestId.concat("-").concat(event.params.roundId.toString()).concat("-").concat(event.params.ancillaryData.toHex()) + createPriceRequestRoundId(requestId, event.params.roundId, event.params.ancillaryData) ); let groupId = requestRound.id.concat("-").concat(event.params.price.toString()); let voterGroup = getOrCreateVoterGroup(groupId); @@ -99,21 +101,18 @@ export function handlePriceResolved(event: PriceResolved): void { // ); export function handleRewardsRetrieved(event: RewardsRetrieved): void { - let rewardClaimedId = event.params.voter - .toHexString() - .concat("-") - .concat(event.params.identifier.toString()) - .concat("-") - .concat(event.params.time.toString()) - .concat("-") - .concat(event.params.roundId.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let rewardClaimedId = createVoteId( + event.params.voter.toHexString(), + event.params.identifier.toString(), + event.params.time, + event.params.roundId, + event.params.ancillaryData + ); let rewardClaimed = getOrCreateRewardsClaimed(rewardClaimedId); let claimer = getOrCreateUser(event.params.voter); let requestId = event.params.identifier.toString().concat("-").concat(event.params.time.toString()); let requestRound = getOrCreatePriceRequestRound( - requestId.concat("-").concat(event.params.roundId.toString()).concat("-").concat(event.params.ancillaryData.toHex()) + createPriceRequestRoundId(requestId, event.params.roundId, event.params.ancillaryData) ); let winnerGroup: VoterGroup | null = requestRound.winnerGroup != null ? getOrCreateVoterGroup(requestRound.winnerGroup) : null; @@ -173,21 +172,18 @@ export function handleVoteCommitted(event: VoteCommitted): void { event.params.ancillaryData.toHex(), ]); - let voteId = event.params.voter - .toHexString() - .concat("-") - .concat(event.params.identifier.toString()) - .concat("-") - .concat(event.params.time.toString()) - .concat("-") - .concat(event.params.roundId.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let voteId = createVoteId( + event.params.voter.toHexString(), + event.params.identifier.toString(), + event.params.time, + event.params.roundId, + event.params.ancillaryData + ); let vote = getOrCreateCommittedVote(voteId); let voter = getOrCreateUser(event.params.voter); let requestId = event.params.identifier.toString().concat("-").concat(event.params.time.toString()); let requestRound = getOrCreatePriceRequestRound( - requestId.concat("-").concat(event.params.roundId.toString()).concat("-").concat(event.params.ancillaryData.toHex()) + createPriceRequestRoundId(requestId, event.params.roundId, event.params.ancillaryData) ); vote.voter = voter.id; @@ -221,21 +217,18 @@ export function handleVoteCommitted(event: VoteCommitted): void { // ); export function handleVoteRevealed(event: VoteRevealed): void { - let voteId = event.params.voter - .toHexString() - .concat("-") - .concat(event.params.identifier.toString()) - .concat("-") - .concat(event.params.time.toString()) - .concat("-") - .concat(event.params.roundId.toString()) - .concat("-") - .concat(event.params.ancillaryData.toHex()); + let voteId = createVoteId( + event.params.voter.toHexString(), + event.params.identifier.toString(), + event.params.time, + event.params.roundId, + event.params.ancillaryData + ); let vote = getOrCreateRevealedVote(voteId); let voter = getOrCreateUser(event.params.voter); let requestId = event.params.identifier.toString().concat("-").concat(event.params.time.toString()); let requestRound = getOrCreatePriceRequestRound( - requestId.concat("-").concat(event.params.roundId.toString()).concat("-").concat(event.params.ancillaryData.toHex()) + createPriceRequestRoundId(requestId, event.params.roundId, event.params.ancillaryData) ); let groupId = requestRound.id.concat("-").concat(event.params.price.toString()); let voterGroup = getOrCreateVoterGroup(groupId); diff --git a/packages/voting/src/utils/helpers/index.ts b/packages/voting/src/utils/helpers/index.ts index 6f9a4d4..0809c96 100644 --- a/packages/voting/src/utils/helpers/index.ts +++ b/packages/voting/src/utils/helpers/index.ts @@ -7,6 +7,8 @@ export { getOrCreateRevealedVote, getOrCreateRewardsClaimed, getOrCreateVoterGroup, + createPriceRequestRoundId, + createVoteId, } from "./voting"; export { getOrCreatePriceIdentifier } from "./identifierWhitelist"; diff --git a/packages/voting/src/utils/helpers/voting.ts b/packages/voting/src/utils/helpers/voting.ts index c141e7b..08b5209 100644 --- a/packages/voting/src/utils/helpers/voting.ts +++ b/packages/voting/src/utils/helpers/voting.ts @@ -1,3 +1,4 @@ +import { BigInt, Bytes, crypto } from "@graphprotocol/graph-ts"; import { PriceRequest, PriceRequestRound, @@ -8,6 +9,43 @@ import { } from "../../../generated/schema"; import { BIGDECIMAL_ZERO } from "../constants"; +// Helper function to hash ancillaryData +function hashAncillaryData(ancillaryData: Bytes): string { + return crypto.keccak256(ancillaryData).toHexString(); +} + +// Creates ID for PriceRequestRound: requestId-roundId-hash(ancillaryData) +export function createPriceRequestRoundId( + requestId: string, + roundId: BigInt, + ancillaryData: Bytes +): string { + return requestId + .concat("-") + .concat(roundId.toString()) + .concat("-") + .concat(hashAncillaryData(ancillaryData)); +} + +// Creates ID for vote entities: voter-identifier-time-roundId-hash(ancillaryData) +export function createVoteId( + voter: string, + identifier: string, + time: BigInt, + roundId: BigInt, + ancillaryData: Bytes +): string { + return voter + .concat("-") + .concat(identifier) + .concat("-") + .concat(time.toString()) + .concat("-") + .concat(roundId.toString()) + .concat("-") + .concat(hashAncillaryData(ancillaryData)); +} + export function getOrCreatePriceRequest(id: String, createIfNotFound: boolean = true): PriceRequest { let request = PriceRequest.load(id); diff --git a/packages/votingV2/src/mappings/votingV2.ts b/packages/votingV2/src/mappings/votingV2.ts index 26d0534..7504326 100644 --- a/packages/votingV2/src/mappings/votingV2.ts +++ b/packages/votingV2/src/mappings/votingV2.ts @@ -55,7 +55,7 @@ export function handlePriceRequestAdded(event: RequestAdded): void { let requestId = getPriceRequestId( event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString() + event.params.ancillaryData ); let request = getOrCreatePriceRequest(requestId); let requestRound = getOrCreatePriceRequestRound(requestId.concat("-").concat(event.params.roundId.toString())); @@ -107,7 +107,7 @@ export function handlePriceResolved(event: RequestResolved): void { let requestId = getPriceRequestId( event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString() + event.params.ancillaryData ); let request = getOrCreatePriceRequest(requestId); @@ -179,7 +179,7 @@ export function handleVoteCommitted(event: VoteCommitted): void { event.params.voter.toHexString(), event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString(), + event.params.ancillaryData, event.params.roundId.toString() ); let vote = getOrCreateCommittedVote(voteId); @@ -196,7 +196,7 @@ export function handleVoteCommitted(event: VoteCommitted): void { let requestId = getPriceRequestId( event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString() + event.params.ancillaryData ); let requestRound = getOrCreatePriceRequestRound(requestId.concat("-").concat(event.params.roundId.toString())); @@ -244,7 +244,7 @@ export function handleVoteRevealed(event: VoteRevealed): void { event.params.voter.toHexString(), event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString(), + event.params.ancillaryData, event.params.roundId.toString() ); let vote = getOrCreateRevealedVote(voteId); @@ -255,7 +255,7 @@ export function handleVoteRevealed(event: VoteRevealed): void { let requestId = getPriceRequestId( event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString() + event.params.ancillaryData ); let request = getOrCreatePriceRequest(requestId); let requestRound = getOrCreatePriceRequestRound(requestId.concat("-").concat(event.params.roundId.toString())); @@ -318,7 +318,7 @@ export function handleVoteRevealed(event: VoteRevealed): void { event.params.voter.toHexString(), event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString() + event.params.ancillaryData ); let voteSlashed = getOrCreateSlashedVote(voteSlashedId, requestId, voter.id); @@ -459,7 +459,7 @@ export function handleVoterSlashed(event: VoterSlashed): void { let requestId = getPriceRequestId( priceRequest.value.getIdentifier().toString(), priceRequest.value.getTime().toString(), - priceRequest.value.getAncillaryData().toHexString() + priceRequest.value.getAncillaryData() ); let request = getOrCreatePriceRequest(requestId); @@ -468,7 +468,7 @@ export function handleVoterSlashed(event: VoterSlashed): void { event.params.voter.toHexString(), priceRequest.value.getIdentifier().toString(), priceRequest.value.getTime().toString(), - priceRequest.value.getAncillaryData().toHexString() + priceRequest.value.getAncillaryData() ); let voteSlashed = getOrCreateSlashedVote(voteSlashedId, requestId, user.id); voteSlashed.isGovernance = request.isGovernance; @@ -482,7 +482,7 @@ export function handleVoterSlashed(event: VoterSlashed): void { event.params.voter.toHexString(), priceRequest.value.getIdentifier().toString(), priceRequest.value.getTime().toString(), - priceRequest.value.getAncillaryData().toHexString(), + priceRequest.value.getAncillaryData(), slashingTracker.lastVotingRound.toString() ); @@ -550,7 +550,7 @@ export function handleRequestDeleted(event: RequestDeleted): void { let requestId = getPriceRequestId( event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString() + event.params.ancillaryData ); let request = getOrCreatePriceRequest(requestId); @@ -564,7 +564,7 @@ export function handleRequestRolled(event: RequestRolled): void { let requestId = getPriceRequestId( event.params.identifier.toString(), event.params.time.toString(), - event.params.ancillaryData.toHexString() + event.params.ancillaryData ); let request = getOrCreatePriceRequest(requestId); diff --git a/packages/votingV2/src/utils/helpers/voting.ts b/packages/votingV2/src/utils/helpers/voting.ts index 79b2479..a734ef3 100644 --- a/packages/votingV2/src/utils/helpers/voting.ts +++ b/packages/votingV2/src/utils/helpers/voting.ts @@ -1,3 +1,4 @@ +import { Bytes, crypto } from "@graphprotocol/graph-ts"; import { CommittedVote, Global, @@ -11,6 +12,11 @@ import { import { BIGDECIMAL_ZERO, BIGINT_ZERO } from "../constants"; export const GLOBAL = "global"; +// Helper function to hash ancillaryData +function hashAncillaryData(ancillaryData: Bytes): string { + return crypto.keccak256(ancillaryData).toHexString(); +} + export function getOrCreateGlobals(): Global { let request = Global.load(GLOBAL); @@ -150,7 +156,7 @@ export function getVoteId( voter: string, identifier: string, time: string, - ancillaryData: string, + ancillaryData: Bytes, roundId: string ): string { return voter @@ -159,17 +165,17 @@ export function getVoteId( .concat("-") .concat(time) .concat("-") - .concat(ancillaryData) + .concat(hashAncillaryData(ancillaryData)) .concat("-") .concat(roundId); } -export function getVoteIdNoRoundId(voter: string, identifier: string, time: string, ancillaryData: string): string { - return voter.concat("-").concat(identifier).concat("-").concat(time).concat("-").concat(ancillaryData); +export function getVoteIdNoRoundId(voter: string, identifier: string, time: string, ancillaryData: Bytes): string { + return voter.concat("-").concat(identifier).concat("-").concat(time).concat("-").concat(hashAncillaryData(ancillaryData)); } -export function getPriceRequestId(identifier: string, time: string, ancillaryData: string): string { - return identifier.concat("-").concat(time).concat("-").concat(ancillaryData); +export function getPriceRequestId(identifier: string, time: string, ancillaryData: Bytes): string { + return identifier.concat("-").concat(time).concat("-").concat(hashAncillaryData(ancillaryData)); } export function getSlashingTransactionId(transactionHash: string, voter: string): string { From 6e89844f11347729b7a9ec729c0a22a1250dd9b0 Mon Sep 17 00:00:00 2001 From: Pablo Maldonado Date: Thu, 15 Jan 2026 14:07:31 +0000 Subject: [PATCH 3/3] feat: deploy new graphs Signed-off-by: Pablo Maldonado --- README.md | 28 +++++++++---------- .../src/mappings/skinnyOptimisticOracle.ts | 8 +++--- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 6d1c060..b07cb49 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,10 @@ This subgraph indexes events emitted by the "Skinny Optimistic Oracle" contracts - Mainnet - TheGraph: - - Goldsky: + - Goldsky: - (testnet) Sepolia - TheGraph: - - Goldsky: + - Goldsky: ## Optimistic Oracle Events @@ -107,16 +107,16 @@ This subgraph indexes events and function calls by the "Optimistic Oracle V2" co - Mainnet - TheGraph: - - Goldsky: <> + - Goldsky: - Polygon - TheGraph: - - Goldsky: + - Goldsky: - Arbitrum - TheGraph: - - Goldsky: + - Goldsky: - Optimism - TheGraph: - - Goldsky: + - Goldsky: - Boba - TheGraph: - Goldsky: @@ -126,19 +126,19 @@ This subgraph indexes events and function calls by the "Optimistic Oracle V2" co - TheGraph: - (testnet) Sepolia - TheGraph: - - Goldsky: + - Goldsky: - Base - TheGraph: - - Goldsky: + - Goldsky: - (staging) Base Sepolia - TheGraph: - - Goldsky: + - Goldsky: - Blast - TheGraph: - - Goldsky: + - Goldsky: - Story - TheGraph: - - Goldsky: + - Goldsky: ## Managed Optimistic Oracle V2 Events and Calls @@ -146,10 +146,10 @@ This subgraph indexes events and function calls by the "Managed Optimistic Oracl - Amoy - TheGraph: - - Goldsky: + - Goldsky: - Polygon - TheGraph: - - Goldsky: + - Goldsky: ## Financial Contract Events @@ -179,7 +179,7 @@ This subgraph indexes events emitted by the core Oracle contracts. The code can - Mainnet - TheGraph: - - Goldsky: + - Goldsky: - (testnet) Sepolia - TheGraph: - Goldsky: diff --git a/packages/skinny-optimistic-oracle/src/mappings/skinnyOptimisticOracle.ts b/packages/skinny-optimistic-oracle/src/mappings/skinnyOptimisticOracle.ts index 2daa76c..3c75809 100644 --- a/packages/skinny-optimistic-oracle/src/mappings/skinnyOptimisticOracle.ts +++ b/packages/skinny-optimistic-oracle/src/mappings/skinnyOptimisticOracle.ts @@ -65,7 +65,7 @@ export function handleOptimisticRequestPrice(event: RequestPrice): void { ]); let requestId = createOptimisticPriceRequestId( event.params.identifier, - BigInt.fromI32(event.params.timestamp), + event.params.timestamp, event.params.ancillaryData ); @@ -113,7 +113,7 @@ export function handleOptimisticProposePrice(event: ProposePrice): void { ]); let requestId = createOptimisticPriceRequestId( event.params.identifier, - BigInt.fromI32(event.params.timestamp), + event.params.timestamp, event.params.ancillaryData ); @@ -156,7 +156,7 @@ export function handleOptimisticDisputePrice(event: DisputePrice): void { ]); let requestId = createOptimisticPriceRequestId( event.params.identifier, - BigInt.fromI32(event.params.timestamp), + event.params.timestamp, event.params.ancillaryData ); @@ -197,7 +197,7 @@ export function handleOptimisticSettle(event: Settle): void { ]); let requestId = createOptimisticPriceRequestId( event.params.identifier, - BigInt.fromI32(event.params.timestamp), + event.params.timestamp, event.params.ancillaryData );