feat(monitor-v2): add ui links in og and oov3 monitors (#4544)

Signed-off-by: Reinis Martinsons <reinis@umaproject.org>
This commit is contained in:
Reinis Martinsons
2023-04-28 10:17:23 +03:00
committed by GitHub
parent 8d018ea105
commit cb7bf27dc0
9 changed files with 52 additions and 10 deletions
@@ -1,4 +1,4 @@
import { Logger, MonitoringParams, runQueryFilter, getOg } from "./common";
import { Logger, MonitoringParams, runQueryFilter, getOg, getOo } from "./common";
import { logProposalDeleted, logProposalExecuted, logSetCollateralAndBond, logSetRules } from "./MonitorLogger";
import {
logSetIdentifier,
@@ -10,7 +10,14 @@ import {
export async function monitorTransactionsProposed(logger: typeof Logger, params: MonitoringParams): Promise<void> {
const og = await getOg(params);
const oo = await getOo(params);
const transactions = await runQueryFilter(og, og.filters.TransactionsProposed(), params.blockRange);
const getAssertionEventIndex = async (assertionId: string): Promise<number> => {
const assertionMade = await runQueryFilter(oo, oo.filters.AssertionMade(assertionId), params.blockRange);
return assertionMade[0].logIndex; // There should only be one event matching unique assertionId.
};
for (const transaction of transactions) {
await logTransactions(
logger,
@@ -23,6 +30,7 @@ export async function monitorTransactionsProposed(logger: typeof Logger, params:
rules: transaction.args.rules,
challengeWindowEnds: transaction.args.challengeWindowEnds,
tx: transaction.transactionHash,
ooEventIndex: await getAssertionEventIndex(transaction.args.assertionId),
},
params
);
@@ -1,6 +1,6 @@
import { createEtherscanLinkMarkdown } from "@uma/common";
import { BigNumber } from "ethers";
import { Logger, tryHexToUtf8String } from "./common";
import { generateOOv3UILink, Logger, tryHexToUtf8String } from "./common";
import type { MonitoringParams } from "./common";
@@ -15,6 +15,7 @@ export async function logTransactions(
rules: string;
challengeWindowEnds: BigNumber;
tx: string;
ooEventIndex: number;
},
params: MonitoringParams
): Promise<void> {
@@ -36,7 +37,10 @@ export async function logTransactions(
". Explanation: " +
tryHexToUtf8String(transaction.explanation) +
". The proposal can be disputed till " +
new Date(Number(transaction.challengeWindowEnds.toString()) * 1000).toUTCString(),
new Date(Number(transaction.challengeWindowEnds.toString()) * 1000).toUTCString() +
": " +
generateOOv3UILink(transaction.tx, transaction.ooEventIndex, params.chainId) +
".",
notificationPath: "optimistic-governor",
});
}
+8 -3
View File
@@ -3,13 +3,14 @@ import { ERC20Ethers } from "@uma/contracts-node";
import { delay } from "@uma/financial-templates-lib";
import { utils } from "ethers";
import { getContractInstanceWithProvider } from "../utils/contracts";
import { OptimisticGovernorEthers } from "./common";
import { OptimisticGovernorEthers, OptimisticOracleV3Ethers } from "./common";
import type { Provider } from "@ethersproject/abstract-provider";
export { OptimisticGovernorEthers } from "@uma/contracts-node";
export { OptimisticGovernorEthers, OptimisticOracleV3Ethers } from "@uma/contracts-node";
export { Logger } from "@uma/financial-templates-lib";
export { getContractInstanceWithProvider } from "../utils/contracts";
export { generateOOv3UILink } from "../utils/logger";
export interface BotModes {
transactionsProposedEnabled: boolean;
@@ -135,7 +136,7 @@ export const getCurrencySymbol = async (provider: Provider, currencyAddress: str
};
export const runQueryFilter = async (
contract: OptimisticGovernorEthers,
contract: OptimisticGovernorEthers | OptimisticOracleV3Ethers,
filter: any,
blockRange: BlockRange
): Promise<any> => {
@@ -149,3 +150,7 @@ export const getOg = async (params: MonitoringParams): Promise<OptimisticGoverno
params.ogAddress
);
};
export const getOo = async (params: MonitoringParams): Promise<OptimisticOracleV3Ethers> => {
return await getContractInstanceWithProvider<OptimisticOracleV3Ethers>("OptimisticOracleV3", params.provider);
};
@@ -8,6 +8,7 @@ export async function monitorAssertions(logger: typeof Logger, params: Monitorin
await oo.queryFilter(oo.filters.AssertionMade(), params.blockRange.start, params.blockRange.end)
).map(async (event) => ({
tx: event.transactionHash,
eventIndex: event.logIndex,
assertionId: event.args.assertionId,
claim: event.args.claim,
assertionData: await oo.getAssertion(event.args.assertionId),
@@ -8,6 +8,7 @@ export async function monitorDisputes(logger: typeof Logger, params: MonitoringP
await oo.queryFilter(oo.filters.AssertionDisputed(), params.blockRange.start, params.blockRange.end)
).map(async (event) => ({
tx: event.transactionHash,
eventIndex: event.logIndex,
assertionId: event.args.assertionId,
claim: (await oo.queryFilter(oo.filters.AssertionMade(event.args.assertionId))).map((event) => event.args.claim)[0],
assertionData: await oo.getAssertion(event.args.assertionId),
@@ -1,6 +1,6 @@
import { createEtherscanLinkMarkdown, createFormatFunction } from "@uma/common";
import { utils } from "ethers";
import { Logger, OptimisticOracleV3Ethers } from "./common";
import { generateOOv3UILink, Logger, OptimisticOracleV3Ethers } from "./common";
import type { MonitoringParams } from "./common";
import { getCurrencyDecimals, getCurrencySymbol, tryHexToUtf8String } from "../utils/contracts";
@@ -9,6 +9,7 @@ export async function logAssertion(
logger: typeof Logger,
assertion: {
tx: string;
eventIndex: number;
assertionId: string;
claim: string;
assertionData: Awaited<ReturnType<typeof OptimisticOracleV3Ethers.prototype.getAssertion>>;
@@ -37,7 +38,10 @@ export async function logAssertion(
" " +
currencySymbol +
". The assertion can be disputed till " +
new Date(Number(assertion.assertionData.expirationTime) * 1000).toUTCString(),
new Date(Number(assertion.assertionData.expirationTime) * 1000).toUTCString() +
": " +
generateOOv3UILink(assertion.tx, assertion.eventIndex, params.chainId) +
".",
notificationPath: "optimistic-oracle",
discordPaths: ["oo-fact-checking", "oo-events"],
});
@@ -47,6 +51,7 @@ export async function logDispute(
logger: typeof Logger,
dispute: {
tx: string;
eventIndex: number;
assertionId: string;
claim: string;
assertionData: Awaited<ReturnType<typeof OptimisticOracleV3Ethers.prototype.getAssertion>>;
@@ -65,7 +70,10 @@ export async function logDispute(
". Claim: " +
tryHexToUtf8String(dispute.claim) +
". Identifier: " +
utils.parseBytes32String(dispute.assertionData.identifier),
utils.parseBytes32String(dispute.assertionData.identifier) +
". " +
generateOOv3UILink(dispute.tx, dispute.eventIndex, params.chainId) +
".",
notificationPath: "optimistic-oracle",
discordPaths: ["oo-fact-checking", "oo-events"],
});
@@ -75,6 +83,7 @@ export async function logSettlement(
logger: typeof Logger,
settlement: {
tx: string;
eventIndex: number;
assertionId: string;
claim: string;
assertionData: Awaited<ReturnType<typeof OptimisticOracleV3Ethers.prototype.getAssertion>>;
@@ -94,7 +103,10 @@ export async function logSettlement(
". Identifier: " +
utils.parseBytes32String(settlement.assertionData.identifier) +
". Result: assertion was " +
(settlement.assertionData.settlementResolution ? "true" : "false"),
(settlement.assertionData.settlementResolution ? "true" : "false") +
". " +
generateOOv3UILink(settlement.tx, settlement.eventIndex, params.chainId) +
".",
notificationPath: "optimistic-oracle",
discordPaths: ["oo-fact-checking", "oo-events"],
});
@@ -8,6 +8,7 @@ export async function monitorSettlements(logger: typeof Logger, params: Monitori
await oo.queryFilter(oo.filters.AssertionSettled(), params.blockRange.start, params.blockRange.end)
).map(async (event) => ({
tx: event.transactionHash,
eventIndex: event.logIndex,
assertionId: event.args.assertionId,
claim: (await oo.queryFilter(oo.filters.AssertionMade(event.args.assertionId))).map((event) => event.args.claim)[0],
assertionData: await oo.getAssertion(event.args.assertionId),
@@ -6,6 +6,7 @@ import type { Provider } from "@ethersproject/abstract-provider";
export { OptimisticOracleV3Ethers } from "@uma/contracts-node";
export { Logger } from "@uma/financial-templates-lib";
export { getContractInstanceWithProvider } from "../utils/contracts";
export { generateOOv3UILink } from "../utils/logger";
export interface BotModes {
assertionsEnabled: boolean;
+9
View File
@@ -0,0 +1,9 @@
const optimisticOracleV2UIBaseUrl = "https://oracle.uma.xyz";
const testnetOptimisticOracleV2UIBaseUrl = "https://testnet.oracle.uma.xyz";
// monitor-v2 package is only using Optimistic Oracle V3, so currently there is no need to generalize this.
export const generateOOv3UILink = (transactionHash: string, eventIndex: number, chainId?: number): string => {
// Currently testnet UI supports only goerli, so assume any other chain is production.
const baseUrl = chainId === 5 ? testnetOptimisticOracleV2UIBaseUrl : optimisticOracleV2UIBaseUrl;
return `<${baseUrl}/?transactionHash=${transactionHash}&eventIndex=${eventIndex}|View in UI>`;
};