feat: update oov3 settlement bot (#4534)

Signed-off-by: Pablo Maldonado <pablo@umaproject.org>
This commit is contained in:
Pablo Maldonado
2023-04-18 18:34:39 +01:00
committed by GitHub
parent d45b9c6a24
commit 9f69e2407b
5 changed files with 30 additions and 44 deletions
+1 -2
View File
@@ -15,6 +15,7 @@ All the configuration should be provided with following environment variables:
- `NODE_URL_X` is a single RPC node URL replacing `X` in variable name with network number from `CHAIN_ID`. This is
considered only if matching `NODE_URLS_X` is not provided.
- `MNEMONIC` is a mnemonic for a wallet that has enough funds to pay for transactions.
- `GCKMS_WALLET` is a GCKMS wallet that has enough funds to pay for transactions. If this is provided, `MNEMONIC` is ignored.
- `NODE_RETRIES` is the number of retries to make when a node request fails (defaults to `2`).
- `NODE_RETRY_DELAY` is the delay in seconds between retries (defaults to `1`).
- `NODE_TIMEOUT` is the timeout in seconds for node requests (defaults to `60`).
@@ -22,8 +23,6 @@ All the configuration should be provided with following environment variables:
- `SETTLEMENTS_ENABLED` is boolean enabling/disabling settlement of assertions (`false` by default).
- `BOT_IDENTIFIER` identifies the application name in the logs.
- `SLACK_CONFIG` is a JSON object containing `defaultWebHookUrl` for the default Slack webhook URL.
- `WARMING_UP_BLOCK_LOOKBACK`(Optional) is the number of blocks to look back from the current block to warm up the bot's event state.
See default values in blockDefaults in index.ts
- `BLOCK_LOOKBACK`(Optional) is the number of blocks to look back from the current block to look for past events.
See default values in blockDefaults in index.ts
- `MAX_BLOCK_LOOKBACK`(Optional) is the maximum number of blocks to look back per query.
@@ -11,7 +11,7 @@ export async function settleAssertions(logger: typeof Logger, params: Monitoring
const currentBlockNumber = await params.provider.getBlockNumber();
const loopBack = params.firstRun ? params.warmingUpBlockLookback : params.blockLookback;
const loopBack = params.blockLookback;
const searchConfig = {
fromBlock: currentBlockNumber - loopBack < 0 ? 0 : currentBlockNumber - loopBack,
toBlock: currentBlockNumber,
+22 -31
View File
@@ -1,5 +1,5 @@
import { getMnemonicSigner, getRetryProvider } from "@uma/common";
import { Signer } from "ethers";
import { getGckmsSigner, getMnemonicSigner, getRetryProvider } from "@uma/common";
import { Signer, Wallet } from "ethers";
import type { Provider } from "@ethersproject/abstract-provider";
@@ -19,49 +19,41 @@ export interface BlockRange {
export interface MonitoringParams {
provider: Provider;
chainId: number;
runFrequency: number;
botModes: BotModes;
signer: Signer;
warmingUpBlockLookback: number;
blockLookback: number;
maxBlockLookBack: number;
firstRun?: boolean;
pollingDelay: number;
}
const blockDefaults = {
"1": {
// Mainnet
hour: 300, // 12 seconds per block
day: 7200,
oneHour: 300, // 12 seconds per block
maxBlockLookBack: 20000,
},
"137": {
// Polygon
hour: 1800, // 2 seconds per block
day: 43200,
oneHour: 1800, // 2 seconds per block
maxBlockLookBack: 3499,
},
"10": {
// Optimism
hour: 1800, // 2 seconds per block
day: 43200,
oneHour: 1800, // 2 seconds per block
maxBlockLookBack: 10000,
},
"42161": {
// Arbitrum
hour: 240, // 15 seconds per block
day: 5760,
oneHour: 240, // 15 seconds per block
maxBlockLookBack: 10000,
},
"43114": {
// Avalanche
hour: 1800, // 2 seconds per block
day: 43200,
oneHour: 1800, // 2 seconds per block
maxBlockLookBack: 2000,
},
other: {
hour: 240, // 15 seconds per block
day: 5760,
oneHour: 240, // 15 seconds per block
maxBlockLookBack: 1000,
},
};
@@ -73,25 +65,25 @@ export const initMonitoringParams = async (env: NodeJS.ProcessEnv): Promise<Moni
// Creating provider will check for other chainId specific env variables.
const provider = getRetryProvider(chainId) as Provider;
// Throws if MNEMONIC env var is not defined.
const signer = (getMnemonicSigner() as Signer).connect(provider);
// Default to 1 minute polling delay.
const pollingDelay = env.POLLING_DELAY ? Number(env.POLLING_DELAY) : 60;
// Default to 1 minute run frequency.
const runFrequency = env.RUN_FREQUENCY ? Number(env.RUN_FREQUENCY) : 60;
let signer;
if (process.env.GCKMS_WALLET) {
signer = ((await getGckmsSigner()) as Wallet).connect(provider);
} else {
// Throws if MNEMONIC env var is not defined.
signer = (getMnemonicSigner() as Signer).connect(provider);
}
const botModes = {
settleAssertionsEnabled: env.SETTLEMENTS_ENABLED === "true",
};
const blockLookback =
Number(env.WARMING_UP_BLOCK_LOOKBACK) ||
blockDefaults[chainId.toString() as keyof typeof blockDefaults]?.hour ||
blockDefaults.other.hour;
const warmingUpBlockLookback =
Number(env.BLOCK_LOOKBACK) ||
blockDefaults[chainId.toString() as keyof typeof blockDefaults]?.day ||
blockDefaults.other.day;
blockDefaults[chainId.toString() as keyof typeof blockDefaults]?.oneHour ||
blockDefaults.other.oneHour;
const maxBlockLookBack =
Number(env.MAX_BLOCK_LOOKBACK) ||
@@ -101,15 +93,14 @@ export const initMonitoringParams = async (env: NodeJS.ProcessEnv): Promise<Moni
return {
provider,
chainId,
runFrequency,
botModes,
signer,
warmingUpBlockLookback,
blockLookback,
maxBlockLookBack,
pollingDelay,
};
};
export const startupLogLevel = (params: MonitoringParams): "debug" | "info" => {
return params.runFrequency === 0 ? "debug" : "info";
return params.pollingDelay === 0 ? "debug" : "info";
};
+4 -6
View File
@@ -21,18 +21,16 @@ async function main() {
const cmds = {
settleAssertionsEnabled: settleAssertions,
};
let firstRun = true;
for (;;) {
const runCmds = Object.entries(cmds)
.filter(([mode]) => params.botModes[mode as keyof BotModes])
.map(([, cmd]) => cmd(logger, { ...params, firstRun }));
.map(([, cmd]) => cmd(logger, { ...params }));
await Promise.all(runCmds);
firstRun = false;
if (params.runFrequency !== 0) {
await delay(params.runFrequency);
if (params.pollingDelay !== 0) {
await delay(params.pollingDelay);
} else {
await delay(5); // Set a delay to let the transports flush fully.
break;
@@ -9,7 +9,7 @@ import { defaultLiveness } from "./constants";
import { optimisticOracleV3Fixture } from "./fixtures/OptimisticOracleV3.Fixture";
import { umaEcosystemFixture } from "./fixtures/UmaEcosystem.Fixture";
import { getBlockNumberFromTx, hardhatTime, hre, Signer, toUtf8Bytes, toUtf8String } from "./utils";
import "@nomiclabs/hardhat-ethers";
const ethers = hre.ethers;
// Create monitoring params for single block to pass to monitor modules.
@@ -23,13 +23,11 @@ const createMonitoringParams = async (): Promise<MonitoringParams> => {
return {
provider: ethers.provider as Provider,
chainId: (await ethers.provider.getNetwork()).chainId,
runFrequency: 60,
botModes,
signer,
warmingUpBlockLookback: 2000,
blockLookback: 2000,
maxBlockLookBack: 1000,
firstRun: true,
pollingDelay: 0,
};
};