@eth-optimism/balance-monitor
Version:
[Optimism] Forta Agent that reports whether certain accounts have fallen below some balance
95 lines • 4.09 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const forta_agent_1 = require("forta-agent");
const ethers_1 = require("ethers");
const chai_1 = require("chai");
const agent_1 = __importStar(require("./agent"));
const utils_1 = require("./utils");
describe('minimum balance agent', () => {
let handleBlock;
let mockEthersProvider;
const blockEvent = (0, forta_agent_1.createBlockEvent)({
block: { hash: '0xa', number: 1 },
});
const mockEthersProviderByCase = (severity) => {
switch (severity) {
case 'safe':
return {
getBalance: async (addr) => {
if (addr === '0xabba') {
return ethers_1.utils.parseEther('101');
}
if (addr === '0xacdc') {
return ethers_1.utils.parseEther('2001');
}
},
};
case 'danger':
return {
getBalance: async (addr) => {
if (addr === '0xabba') {
return ethers_1.utils.parseEther('99');
}
if (addr === '0xacdc') {
return ethers_1.utils.parseEther('2001');
}
},
};
default:
break;
}
};
before(() => {
handleBlock = agent_1.default.provideHandleBlock(mockEthersProvider);
});
describe('handleBlock', () => {
it('returns empty findings if balance is above threshold', async () => {
mockEthersProvider = mockEthersProviderByCase('safe');
handleBlock = agent_1.default.provideHandleBlock(mockEthersProvider);
const findings = await handleBlock(blockEvent);
(0, chai_1.expect)(findings).to.deep.equal([]);
});
it('returns high severity finding if balance is below danger threshold', async () => {
mockEthersProvider = mockEthersProviderByCase('danger');
handleBlock = agent_1.default.provideHandleBlock(mockEthersProvider);
const balance = await mockEthersProvider.getBalance('0xabba');
const findings = await handleBlock(blockEvent);
(0, chai_1.expect)(findings).to.deep.equal([
forta_agent_1.Finding.fromObject({
name: 'Minimum Account Balance',
description: (0, utils_1.describeFinding)(agent_1.accounts[0].address, balance, agent_1.accounts[0].thresholds.danger),
alertId: 'OPTIMISM-BALANCE-DANGER-Sequencer',
severity: forta_agent_1.FindingSeverity.High,
type: forta_agent_1.FindingType.Info,
metadata: {
balance: balance.toString(),
},
}),
]);
});
});
});
//# sourceMappingURL=agent.spec.js.map