mirror of
https://github.com/luxfi/uma.git
synced 2026-07-27 05:11:41 +00:00
feat: update oov3 settlement bot (#4534)
Signed-off-by: Pablo Maldonado <pablo@umaproject.org>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user