Commit 1fbcb714 authored by felipe's avatar felipe Committed by GitHub

feat(multisig-mon): monitor optimismportal paused state (#8896)

parent 8ba19b94
This diff is collapsed.
...@@ -11,6 +11,7 @@ import { Provider } from '@ethersproject/abstract-provider' ...@@ -11,6 +11,7 @@ import { Provider } from '@ethersproject/abstract-provider'
import { ethers } from 'ethers' import { ethers } from 'ethers'
import Safe from '../abi/IGnosisSafe.0.8.19.json' import Safe from '../abi/IGnosisSafe.0.8.19.json'
import OptimismPortal from '../abi/OptimismPortal.json'
import { version } from '../../package.json' import { version } from '../../package.json'
type MultisigMonOptions = { type MultisigMonOptions = {
...@@ -22,11 +23,17 @@ type MultisigMonOptions = { ...@@ -22,11 +23,17 @@ type MultisigMonOptions = {
type MultisigMonMetrics = { type MultisigMonMetrics = {
safeNonce: Gauge safeNonce: Gauge
latestPreSignedPauseNonce: Gauge latestPreSignedPauseNonce: Gauge
pausedState: Gauge
unexpectedRpcErrors: Counter unexpectedRpcErrors: Counter
} }
type MultisigMonState = { type MultisigMonState = {
accounts: Array<{ address: string; nickname: string; vault: string }> accounts: Array<{
nickname: string
safeAddress: string
optimismPortalAddress: string
vault: string
}>
} }
export class MultisigMonService extends BaseServiceV2< export class MultisigMonService extends BaseServiceV2<
...@@ -50,7 +57,7 @@ export class MultisigMonService extends BaseServiceV2< ...@@ -50,7 +57,7 @@ export class MultisigMonService extends BaseServiceV2<
}, },
accounts: { accounts: {
validator: validators.str, validator: validators.str,
desc: 'JSON array of [{ address, nickname, vault }] to monitor balances and nonces of', desc: 'JSON array of [{ nickname, safeAddress, optimismPortalAddress, vault }] to monitor',
public: true, public: true,
}, },
onePassServiceToken: { onePassServiceToken: {
...@@ -69,6 +76,11 @@ export class MultisigMonService extends BaseServiceV2< ...@@ -69,6 +76,11 @@ export class MultisigMonService extends BaseServiceV2<
desc: 'Latest pre-signed pause nonce', desc: 'Latest pre-signed pause nonce',
labels: ['address', 'nickname'], labels: ['address', 'nickname'],
}, },
pausedState: {
type: Gauge,
desc: 'OptimismPortal paused state',
labels: ['address', 'nickname'],
},
unexpectedRpcErrors: { unexpectedRpcErrors: {
type: Counter, type: Counter,
desc: 'Number of unexpected RPC errors', desc: 'Number of unexpected RPC errors',
...@@ -90,48 +102,57 @@ export class MultisigMonService extends BaseServiceV2< ...@@ -90,48 +102,57 @@ export class MultisigMonService extends BaseServiceV2<
} }
// get the nonce from deployed safe // get the nonce from deployed safe
await this.getSafeNonce(account) if (account.safeAddress) {
await this.getSafeNonce(account)
}
// get the paused state of the OptimismPortal
if (account.optimismPortalAddress) {
await this.getPausedState(account)
}
} }
} }
private async getSafeNonce(account: { private async getPausedState(account: {
address: string
nickname: string nickname: string
safeAddress: string
optimismPortalAddress: string
vault: string vault: string
}) { }) {
try { try {
const safeContract = new ethers.Contract( const optimismPortal = new ethers.Contract(
account.address, account.optimismPortalAddress,
Safe.abi, OptimismPortal.abi,
this.options.rpc this.options.rpc
) )
const safeNonce = await safeContract.nonce() const paused = await optimismPortal.paused()
this.logger.info(`got nonce`, { this.logger.info(`got paused state`, {
address: account.address, optimismPortalAddress: account.optimismPortalAddress,
nickname: account.nickname, nickname: account.nickname,
nonce: safeNonce.toString(), paused,
}) })
this.metrics.safeNonce.set( this.metrics.pausedState.set(
{ address: account.address, nickname: account.nickname }, { address: account.optimismPortalAddress, nickname: account.nickname },
parseInt(safeNonce.toString(), 10) parseInt(paused.toString(), 10)
) )
} catch (err) { } catch (err) {
this.logger.error(`got unexpected RPC error`, { this.logger.error(`got unexpected RPC error`, {
section: 'safeNonce', section: 'pausedState',
name: 'getSafeNonce', name: 'getPausedState',
err, err,
}) })
this.metrics.unexpectedRpcErrors.inc({ this.metrics.unexpectedRpcErrors.inc({
section: 'safeNonce', section: 'pausedState',
name: 'getSafeNonce', name: 'getPausedState',
}) })
} }
} }
private async getOnePassNonce(account: { private async getOnePassNonce(account: {
address: string
nickname: string nickname: string
safeAddress: string
optimismPortalAddress: string
vault: string vault: string
}) { }) {
try { try {
...@@ -167,7 +188,7 @@ export class MultisigMonService extends BaseServiceV2< ...@@ -167,7 +188,7 @@ export class MultisigMonService extends BaseServiceV2<
} }
} }
this.metrics.latestPreSignedPauseNonce.set( this.metrics.latestPreSignedPauseNonce.set(
{ address: account.address, nickname: account.nickname }, { address: account.safeAddress, nickname: account.nickname },
latestNonce latestNonce
) )
this.logger.debug(`latestNonce: ${latestNonce}`) this.logger.debug(`latestNonce: ${latestNonce}`)
...@@ -185,6 +206,42 @@ export class MultisigMonService extends BaseServiceV2< ...@@ -185,6 +206,42 @@ export class MultisigMonService extends BaseServiceV2<
}) })
} }
} }
private async getSafeNonce(account: {
nickname: string
safeAddress: string
optimismPortalAddress: string
vault: string
}) {
try {
const safeContract = new ethers.Contract(
account.safeAddress,
Safe.abi,
this.options.rpc
)
const safeNonce = await safeContract.nonce()
this.logger.info(`got nonce`, {
address: account.safeAddress,
nickname: account.nickname,
nonce: safeNonce.toString(),
})
this.metrics.safeNonce.set(
{ address: account.safeAddress, nickname: account.nickname },
parseInt(safeNonce.toString(), 10)
)
} catch (err) {
this.logger.error(`got unexpected RPC error`, {
section: 'safeNonce',
name: 'getSafeNonce',
err,
})
this.metrics.unexpectedRpcErrors.inc({
section: 'safeNonce',
name: 'getSafeNonce',
})
}
}
} }
if (require.main === module) { if (require.main === module) {
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
"include": [ "include": [
"package.json", "package.json",
"src/abi/IGnosisSafe.0.8.19.json", "src/abi/IGnosisSafe.0.8.19.json",
"src/abi/OptimismPortal.json",
"src/**/*" "src/**/*"
] ]
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment