Skip to content

Commit

Permalink
cloud_functions: don't alarm governed VAAs
Browse files Browse the repository at this point in the history
  • Loading branch information
panoel committed Sep 20, 2023
1 parent 7fce0fc commit 4a360fb
Showing 1 changed file with 86 additions and 2 deletions.
88 changes: 86 additions & 2 deletions cloud_functions/src/alarmMissingVaas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,42 @@ import { CHAIN_ID_TO_NAME, ChainId, ChainName } from '@certusone/wormhole-sdk';
import { MissingVaasByChain, commonGetMissingVaas } from './getMissingVaas';
import { assertEnvironmentVariable, formatAndSendToSlack } from './utils';
import { ObservedMessage } from './types';
import { explorerBlock, explorerTx } from '@wormhole-foundation/wormhole-monitor-common';
import {
GUARDIAN_SET_3,
explorerBlock,
explorerTx,
} from '@wormhole-foundation/wormhole-monitor-common';
import { Firestore } from 'firebase-admin/firestore';

interface EnqueuedVAAResponse {
sequence: string;
releaseTime: number;
notionalValue: string;
txHash: string;
}

interface Emitter {
emitterAddress: string;
enqueuedVaas: EnqueuedVAAResponse[];
totalEnqueuedVaas: string;
}

interface ChainStatus {
availableNotional: string;
chainId: number;
emitters: Emitter[];
}

interface GovernedVAA {
chainId: number;
emitterAddress: string;
sequence: string;
txHash: string;
}

// The key is the vaaKey
type GovernedVAAMap = Map<string, GovernedVAA>;

export async function alarmMissingVaas(req: any, res: any) {
res.set('Access-Control-Allow-Origin', '*');
if (req.method === 'OPTIONS') {
Expand All @@ -26,6 +59,9 @@ export async function alarmMissingVaas(req: any, res: any) {
firestoreVAAs.push(vaa);
});

// Get governed VAAS
const governedVAAs: GovernedVAAMap = await getGovernedVaas();

// attempting to retrieve missing VAAs...
const messages: MissingVaasByChain = await commonGetMissingVaas();
if (messages) {
Expand All @@ -42,7 +78,7 @@ export async function alarmMissingVaas(req: any, res: any) {
const msg: ObservedMessage = msgs.messages[i];
if (msg.timestamp < twoHoursAgo) {
let vaaKey: string = `${msg.chain}/${msg.emitter}/${msg.seq}`;
if (!firestoreMap.has(vaaKey)) {
if (!firestoreMap.has(vaaKey) && !governedVAAs.has(vaaKey)) {
let firestoreMsg: FirestoreVAA = convert(msg);
firestoreMap.set(vaaKey, firestoreMsg);
firestoreVAAs.push(firestoreMsg);
Expand All @@ -64,6 +100,54 @@ export async function alarmMissingVaas(req: any, res: any) {
return;
}

// This function gets all the enqueued VAAs from he governorStatus collection.
async function getGovernedVaas(): Promise<GovernedVAAMap> {
const vaas: GovernedVAAMap = new Map<string, GovernedVAA>();
// Walk all the guardians and retrieve the enqueued VAAs
const firestore = new Firestore();
const collection = firestore.collection(
assertEnvironmentVariable('FIRESTORE_GOVERNOR_STATUS_COLLECTION')
);
GUARDIAN_SET_3.forEach(async (guardian) => {
const gAddr = guardian.name.toLowerCase().substring(2);
const doc = collection.doc(gAddr);
await doc
.get()
.then((doc) => {
if (doc.exists) {
const data = doc.data();
if (data) {
// data should be a ChainStatus[]
const chains: ChainStatus[] = data.chains;
chains.forEach((chain) => {
// chain should be a ChainStatus
const emitters: Emitter[] = chain.emitters;
emitters.forEach((emitter) => {
// emitter should be an Emitter
const enqueuedVaas: EnqueuedVAAResponse[] = emitter.enqueuedVaas;
enqueuedVaas.forEach((vaa) => {
// vaa should be an EnqueuedVAAResponse
const governedVAA: GovernedVAA = {
chainId: chain.chainId,
emitterAddress: emitter.emitterAddress,
sequence: vaa.sequence,
txHash: vaa.txHash,
};
const key = `${chain.chainId}/${emitter.emitterAddress}/${vaa.sequence}`;
vaas.set(key, governedVAA);
});
});
});
}
}
})
.catch((error) => {
console.log('Error getting document:', error);
});
});
return vaas;
}

// This function gets all the VAAs in the firestore table,
// checks the timestamp (keeping any that are less than 2 hours old),
// and returns a map of those VAAs.
Expand Down

0 comments on commit 4a360fb

Please sign in to comment.