Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
e8ea75be
Unverified
Commit
e8ea75be
authored
Dec 23, 2022
by
mergify[bot]
Committed by
GitHub
Dec 23, 2022
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #4556 from ethereum-optimism/jm/monitoring/split-1
bmon: Add basic alerting logic
parents
d8b6ca8d
459a4801
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
192 additions
and
14 deletions
+192
-14
great-cherries-bake.md
.changeset/great-cherries-bake.md
+5
-0
config.yml
.circleci/config.yml
+6
-0
release.yml
.github/workflows/release.yml
+27
-0
Dockerfile.packages
ops/docker/Dockerfile.packages
+5
-1
package.json
package.json
+2
-1
.env.example
packages/balance-monitor/.env.example
+7
-9
package.json
packages/balance-monitor/package.json
+19
-3
test.sh
packages/balance-monitor/scripts/test.sh
+10
-0
agent.spec.ts
packages/balance-monitor/src/agent.spec.ts
+47
-0
agent.ts
packages/balance-monitor/src/agent.ts
+64
-0
No files found.
.changeset/great-cherries-bake.md
0 → 100644
View file @
e8ea75be
---
'
minimum-balance-agent'
:
patch
---
Added basic balance monitoring
.circleci/config.yml
View file @
e8ea75be
...
...
@@ -866,6 +866,12 @@ workflows:
dependencies
:
"
(contracts|core-utils)"
requires
:
-
yarn-monorepo
-
js-lint-test
:
name
:
balance-monitor-tests
coverage_flag
:
balance-monitor-tests
package_name
:
balance-monitor
requires
:
-
yarn-monorepo
-
depcheck
:
requires
:
-
yarn-monorepo
...
...
.github/workflows/release.yml
View file @
e8ea75be
...
...
@@ -482,6 +482,33 @@ jobs:
push
:
true
tags
:
ethereumoptimism/deployer-bedrock:${{ needs.release.outputs.contracts-bedrock }},ethereumoptimism/deployer-bedrock:latest
balance-monitor
:
name
:
Publish balance-monitor Version ${{ needs.release.outputs.balance-monitor }}
needs
:
release
if
:
needs.release.outputs.balance-monitor != ''
runs-on
:
ubuntu-latest
steps
:
-
name
:
Checkout
uses
:
actions/checkout@v2
-
name
:
Set up Docker Buildx
uses
:
docker/setup-buildx-action@v1
-
name
:
Login to Docker Hub
uses
:
docker/login-action@v1
with
:
username
:
${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
password
:
${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
-
name
:
Build and push
uses
:
docker/build-push-action@v2
with
:
context
:
.
file
:
./ops/docker/Dockerfile.packages
target
:
balance-monitor
push
:
true
tags
:
ethereumoptimism/balance-monitor:${{ needs.release.outputs.balance-monitor }},ethereumoptimism/balance-monitor:latest
integration_tests
:
name
:
Publish Integration tests ${{ needs.release.outputs.integration-tests }}
needs
:
release
...
...
ops/docker/Dockerfile.packages
View file @
e8ea75be
...
...
@@ -47,6 +47,7 @@ COPY packages/message-relayer/package.json ./packages/message-relayer/package.js
COPY packages/fault-detector/package.json ./packages/fault-detector/package.json
COPY packages/replica-healthcheck/package.json ./packages/replica-healthcheck/package.json
COPY packages/drippie-mon/package.json ./packages/drippie-mon/package.json
COPY packages/balance-monitor/package.json ./packages/balance-monitor/package.json
COPY integration-tests/package.json ./integration-tests/package.json
RUN yarn install --frozen-lockfile && yarn cache clean
...
...
@@ -81,7 +82,6 @@ WORKDIR /opt/optimism/packages/data-transport-layer
COPY ./ops/scripts/dtl.sh .
CMD ["node", "dist/src/services/run.js"]
FROM base as integration-tests
WORKDIR /opt/optimism/integration-tests
COPY ./ops/scripts/integration-tests.sh ./
...
...
@@ -107,3 +107,7 @@ ENTRYPOINT ["npm", "run", "start"]
FROM base as drippie-mon
WORKDIR /opt/optimism/packages/drippie-mon
ENTRYPOINT ["npm", "run", "start"]
FROM base as drippie-mon
WORKDIR /opt/optimism/packages/balance-monitor
ENTRYPOINT ["yarn", "run", "start:prod"]
package.json
View file @
e8ea75be
...
...
@@ -31,7 +31,8 @@
"**/@openzeppelin/*"
,
"@eth-optimism/contracts-periphery/ds-test"
,
"@eth-optimism/contracts-periphery/forge-std"
,
"@eth-optimism/contracts-periphery/@rari-capital/solmate"
"@eth-optimism/contracts-periphery/@rari-capital/solmate"
,
"forta-agent"
]
},
"private"
:
true
,
...
...
packages/balance-monitor/.env.example
View file @
e8ea75be
CHAINID=
L1_RPC_URL=
export L1_RPC_URL=
SEQUENCER_ADDRESS=
SEQUENCER_WARNING_THRESHOLD=
SEQUENCER_DANGER_THRESHOLD=
PROPOSER_ADDRESS=
PROPOSER_WARNING_THRESHOLD=
PROPOSER_DANGER_THRESHOLD=
export SEQUENCER_ADDRESS=
export SEQUENCER_WARNING_THRESHOLD=
export SEQUENCER_DANGER_THRESHOLD=
export PROPOSER_ADDRESS=
export PROPOSER_WARNING_THRESHOLD=
export PROPOSER_DANGER_THRESHOLD=
packages/balance-monitor/package.json
View file @
e8ea75be
{
"name"
:
"minimum-balance-agent"
,
"name"
:
"
@eth-optimism/
minimum-balance-agent"
,
"version"
:
"0.0.1"
,
"description"
:
"Forta Agent that reports whether certain accounts have fallen below some balance"
,
"homepage"
:
"https://github.com/ethereum-optimism/optimism/tree/develop/packages/balance-monitor#readme"
,
"license"
:
"MIT"
,
"author"
:
"Optimism PBC"
,
"repository"
:
{
"type"
:
"git"
,
"url"
:
"https://github.com/ethereum-optimism/optimism.git"
},
"scripts"
:
{
"build"
:
"echo 'todo'"
,
"build"
:
"tsc -p tsconfig.json"
,
"clean"
:
"rimraf dist/ ./tsconfig.tsbuildinfo"
,
"start"
:
"yarn run start:dev"
,
"start:dev"
:
"nodemon --watch src --watch forta.config.json -e js,ts,json --exec 'yarn run build && forta-agent run'"
,
"start:prod"
:
"forta-agent run --prod"
,
"tx"
:
"yarn run build && forta-agent run --tx"
,
"block"
:
"yarn run build && forta-agent run --block"
,
"range"
:
"yarn run build && forta-agent run --range"
,
"test"
:
"echo 'todo'"
"test"
:
"./scripts/test.sh"
,
"test:coverage"
:
"echo 'todo: configure test coverage' && yarn test"
,
"lint:check"
:
"eslint . --max-warnings=0"
,
"lint:fix"
:
"yarn lint:check --fix"
,
"lint"
:
"yarn lint:fix && yarn lint:check"
},
"dependencies"
:
{
"ethers"
:
"^5.7.2"
,
"forta-agent"
:
"^0.1.1"
},
"devDependencies"
:
{
"@types/chai"
:
"^4.2.18"
,
"@types/mocha"
:
"^8.2.2"
,
"@types/nodemon"
:
"^1.19.0"
,
"chai"
:
"^4.3.4"
,
"nodemon"
:
"^2.0.8"
,
"ts-mocha"
:
"^10.0.0"
,
"typescript"
:
"^4.3.4"
}
}
packages/balance-monitor/scripts/test.sh
0 → 100755
View file @
e8ea75be
#!/bin/bash
export
SEQUENCER_ADDRESS
=
0xabba
export
SEQUENCER_WARNING_THRESHOLD
=
1000
export
SEQUENCER_DANGER_THRESHOLD
=
100
export
PROPOSER_ADDRESS
=
0xacdc
export
PROPOSER_WARNING_THRESHOLD
=
2000
export
PROPOSER_DANGER_THRESHOLD
=
200
yarn ts-mocha src/
*
.spec.ts
packages/balance-monitor/src/agent.spec.ts
0 → 100644
View file @
e8ea75be
import
{
HandleBlock
,
createBlockEvent
}
from
'
forta-agent
'
import
{
BigNumber
,
utils
}
from
'
ethers
'
import
{
expect
}
from
'
chai
'
import
agent
from
'
./agent
'
describe
(
'
minimum balance agent
'
,
async
()
=>
{
let
handleBlock
:
HandleBlock
let
mockEthersProvider
const
blockEvent
=
createBlockEvent
({
block
:
{
hash
:
'
0xa
'
,
number
:
1
}
as
any
,
})
// A function which returns a mock provider to give us values based on the case we want
// to test.
const
mockEthersProviderByCase
=
(
severity
:
string
)
=>
{
switch
(
severity
)
{
case
'
safe
'
:
return
{
getBalance
:
async
(
addr
:
string
):
Promise
<
BigNumber
>
=>
{
if
(
addr
===
'
0xabba
'
)
{
return
utils
.
parseEther
(
'
1001
'
)
}
if
(
addr
===
'
0xacdc
'
)
{
return
utils
.
parseEther
(
'
2001
'
)
}
},
}
as
any
default
:
break
}
}
before
(()
=>
{
handleBlock
=
agent
.
provideHandleBlock
(
mockEthersProvider
)
})
describe
(
'
handleBlock
'
,
async
()
=>
{
it
(
'
returns empty findings if balance is above threshold
'
,
async
()
=>
{
mockEthersProvider
=
mockEthersProviderByCase
(
'
safe
'
)
handleBlock
=
agent
.
provideHandleBlock
(
mockEthersProvider
)
const
findings
=
await
handleBlock
(
blockEvent
)
expect
(
findings
).
to
.
deep
.
equal
([])
})
})
})
packages/balance-monitor/src/agent.ts
0 → 100644
View file @
e8ea75be
import
{
BlockEvent
,
Finding
,
HandleBlock
}
from
'
forta-agent
'
import
{
BigNumber
,
providers
}
from
'
ethers
'
type
AccountAlert
=
{
name
:
string
address
:
string
thresholds
:
{
warning
:
BigNumber
danger
:
BigNumber
}
}
export
const
accounts
:
AccountAlert
[]
=
[
{
name
:
'
Sequencer
'
,
address
:
process
.
env
.
SEQUENCER_ADDRESS
,
thresholds
:
{
warning
:
BigNumber
.
from
(
process
.
env
.
SEQUENCER_WARNING_THRESHOLD
),
danger
:
BigNumber
.
from
(
process
.
env
.
SEQUENCER_DANGER_THRESHOLD
),
},
},
{
name
:
'
Proposer
'
,
address
:
process
.
env
.
PROPOSER_ADDRESS
,
thresholds
:
{
warning
:
BigNumber
.
from
(
process
.
env
.
PROPOSER_WARNING_THRESHOLD
),
danger
:
BigNumber
.
from
(
process
.
env
.
PROPOSER_DANGER_THRESHOLD
),
},
},
]
const
provideHandleBlock
=
(
provider
:
providers
.
JsonRpcProvider
):
HandleBlock
=>
{
return
async
(
blockEvent
:
BlockEvent
)
=>
{
// report finding if specified account balance falls below threshold
const
findings
:
Finding
[]
=
[]
// iterate over accounts with the index
for
(
const
[
idx
,
account
]
of
accounts
.
entries
())
{
const
accountBalance
=
BigNumber
.
from
(
(
await
provider
.
getBalance
(
account
.
address
,
blockEvent
.
blockNumber
)
).
toString
()
)
if
(
accountBalance
.
gte
(
account
.
thresholds
.
warning
))
{
// todo: add to the findings array when balances are below the threshold
// return if this is the last account
if
(
idx
===
accounts
.
length
-
1
)
{
return
findings
}
}
}
return
findings
}
}
const
l1Provider
=
new
providers
.
JsonRpcProvider
(
process
.
env
.
L1_RPC_URL
)
export
default
{
provideHandleBlock
,
handleBlock
:
provideHandleBlock
(
l1Provider
),
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment