Skip to content

Commit 9963c5e

Browse files
authored
Merge pull request #45 from keep-network/keep-inspection-scripts
Keep inspection scripts Gathering scripts from different repos to one single place for inspecting different keep network applications and their behaviour on Ropsten / Mainnet.
2 parents 25190c8 + 0437233 commit 9963c5e

File tree

5 files changed

+248
-0
lines changed

5 files changed

+248
-0
lines changed

inspector/package-lock.json

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
const truffleContract = require("@truffle/contract")
2+
const KeepRandomBeaconOperatorJson = require("@keep-network/keep-core/artifacts/KeepRandomBeaconOperator.json")
3+
4+
const contractHelper = require("./lib/contract-helper")
5+
6+
module.exports = async function() {
7+
try {
8+
const deploymentBlock = await contractHelper.getDeploymentBlockNumber(KeepRandomBeaconOperatorJson, web3)
9+
10+
const KeepRandomBeaconOperator = truffleContract(KeepRandomBeaconOperatorJson)
11+
KeepRandomBeaconOperator.setProvider(web3.currentProvider)
12+
13+
const keepRandomBeaconOperator = await KeepRandomBeaconOperator.deployed()
14+
15+
const numberOfGroups = await keepRandomBeaconOperator.numberOfGroups()
16+
const entryRequestedEvents = await keepRandomBeaconOperator.getPastEvents(
17+
"RelayEntryRequested",
18+
{
19+
fromBlock: deploymentBlock,
20+
toBlock: "latest",
21+
}
22+
)
23+
const entrySubmittedEvents = await keepRandomBeaconOperator.getPastEvents(
24+
"RelayEntrySubmitted",
25+
{
26+
fromBlock: deploymentBlock,
27+
toBlock: "latest",
28+
}
29+
)
30+
const timeoutEvents = await keepRandomBeaconOperator.getPastEvents(
31+
"RelayEntryTimeoutReported",
32+
{
33+
fromBlock: deploymentBlock,
34+
toBlock: "latest",
35+
}
36+
)
37+
38+
console.log(`Number of groups: ${numberOfGroups}`)
39+
console.log(`Relay entries requested: ${entryRequestedEvents.length}`)
40+
console.log(`Relay entries submitted: ${entrySubmittedEvents.length}`)
41+
console.log(`Number of timed-out entries: ${timeoutEvents.length}`)
42+
console.log(``)
43+
44+
const dkgSubmittedEvents = (await keepRandomBeaconOperator.getPastEvents(
45+
"DkgResultSubmittedEvent",
46+
{
47+
fromBlock: deploymentBlock,
48+
toBlock: "latest",
49+
}
50+
))
51+
52+
const allOperators = new Set()
53+
54+
for (i = 0; i < numberOfGroups; i++) {
55+
const groupPubKey = await keepRandomBeaconOperator.getGroupPublicKey(i)
56+
const groupMembers = await keepRandomBeaconOperator.getGroupMembers(groupPubKey)
57+
58+
const uniqueMembers = new Set()
59+
groupMembers.forEach((member) => {
60+
uniqueMembers.add(member)
61+
allOperators.add(member)
62+
})
63+
64+
const dkgSubmittedEvent = dkgSubmittedEvents.find((event) => {
65+
return event.returnValues.groupPubKey == groupPubKey
66+
})
67+
68+
const {memberIndex, misbehaved} = dkgSubmittedEvent.returnValues
69+
70+
console.log(`Group ${groupPubKey}:`)
71+
console.log(` - has index ${i}`)
72+
console.log(` - has ${groupMembers.length} members`)
73+
console.log(` - its DKG result was submitted by member ${memberIndex}`)
74+
console.log(` - misbehaved members bytes: ${misbehaved}`)
75+
console.log(` - has ${uniqueMembers.size} unique members`)
76+
console.log(``)
77+
}
78+
79+
console.log(`There are ${allOperators.size} unique operators in all groups`)
80+
81+
process.exit()
82+
} catch (error) {
83+
console.log(error)
84+
process.exit()
85+
}
86+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
const truffleContract = require("@truffle/contract")
2+
3+
const BondedECDSAKeepFactoryJson = require("@keep-network/keep-ecdsa/artifacts/BondedECDSAKeepFactory.json")
4+
const BondedECDSAKeepJson = require("@keep-network/keep-ecdsa/artifacts/BondedECDSAKeep.json")
5+
6+
module.exports = async function () {
7+
try {
8+
const BondedECDSAKeepFactory = truffleContract(BondedECDSAKeepFactoryJson)
9+
BondedECDSAKeepFactory.setProvider(web3.currentProvider)
10+
const BondedECDSAKeep = truffleContract(BondedECDSAKeepJson)
11+
BondedECDSAKeep.setProvider(web3.currentProvider)
12+
13+
const factory = await BondedECDSAKeepFactory.deployed()
14+
15+
const keepCount = await factory.getKeepCount()
16+
console.log(`created keeps count: ${keepCount}`)
17+
18+
const allOperators = new Set()
19+
const goodOperators = new Set()
20+
21+
for (i = 0; i < keepCount; i++) {
22+
const keepAddress = await callWithRetry(() => factory.getKeepAtIndex(i))
23+
const keep = await BondedECDSAKeep.at(keepAddress)
24+
const keepPublicKey = await callWithRetry(() => keep.publicKey())
25+
const members = await callWithRetry(() => keep.getMembers())
26+
const isActive = await callWithRetry(() => keep.isActive())
27+
const bond = await callWithRetry(()=> keep.checkBondAmount())
28+
29+
console.log(`keep address: ${keepAddress}`)
30+
console.log(`keep index: ${i}`)
31+
console.log(`pubkey: ${keepPublicKey}`)
32+
console.log(`members: ${members}`)
33+
console.log(`isActive: ${isActive}`)
34+
console.log(`bond [wei]: ${bond}`)
35+
console.log(`bond [eth]: ${web3.utils.fromWei(bond)}`)
36+
37+
members.forEach((member) => allOperators.add(member))
38+
if (keepPublicKey) {
39+
members.forEach((member) => goodOperators.add(member))
40+
}
41+
42+
console.log(``)
43+
}
44+
45+
// if the operator is a member of at least one keep and that operator
46+
// is NOT a member of at least one keep which successfully generated
47+
// a public key, this operator is here
48+
let potentiallyBadOperators = new Set(allOperators)
49+
for (let goodOperator of goodOperators) {
50+
potentiallyBadOperators.delete(goodOperator)
51+
}
52+
console.log(`potentially bad operators = ${new Array(...potentiallyBadOperators).join(', ')}`)
53+
54+
process.exit()
55+
} catch (error) {
56+
console.log(error)
57+
}
58+
}
59+
60+
async function callWithRetry(fn) {
61+
try {
62+
return await fn()
63+
} catch (error) {
64+
console.log(`Error ${error} occurred; retrying...`)
65+
return await fn()
66+
}
67+
}

inspector/scripts/inspect-tbtc.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
const DepositJson = require("@keep-network/tbtc/artifacts/Deposit.json")
2+
const DepositFactoryJson = require("@keep-network/tbtc/artifacts/DepositFactory.json")
3+
4+
const truffleContract = require("@truffle/contract")
5+
const contractHelper = require("./lib/contract-helper")
6+
7+
module.exports = async function() {
8+
try {
9+
const factoryDeploymentBlock = await contractHelper.getDeploymentBlockNumber(DepositFactoryJson, web3)
10+
11+
const DepositFactory = truffleContract(DepositFactoryJson)
12+
DepositFactory.setProvider(web3.currentProvider)
13+
const Deposit = truffleContract(DepositJson)
14+
Deposit.setProvider(web3.currentProvider)
15+
16+
const factory = await DepositFactory.deployed()
17+
18+
const depositCreatedEvents = await factory.getPastEvents(
19+
"DepositCloneCreated",
20+
{
21+
fromBlock: factoryDeploymentBlock,
22+
toBlock: "latest",
23+
}
24+
)
25+
26+
console.log(`Number of created deposits: ${depositCreatedEvents.length} \n`)
27+
28+
const depositAddresses = []
29+
depositCreatedEvents.forEach((event) =>
30+
depositAddresses.push(event.args.depositCloneAddress)
31+
)
32+
33+
for (i = 0; i < depositAddresses.length; i++) {
34+
const deposit = await Deposit.at(depositAddresses[i])
35+
const state = await deposit.currentState()
36+
let stateString = ""
37+
switch(state.toString()) {
38+
case "0": stateString = "START"; break
39+
case "1": stateString = "AWAITING_SIGNER_SETUP"; break
40+
case "2": stateString = "AWAITING_BTC_FUNDING_PROOF"; break
41+
case "3": stateString = "FAILED_SETUP"; break
42+
case "4": stateString = "ACTIVE"; break
43+
case "5": stateString = "AWAITING_WITHDRAWAL_SIGNATURE"; break
44+
case "6": stateString = "AWAITING_WITHDRAWAL_PROOF"; break
45+
case "7": stateString = "REDEEMED"; break
46+
case "8": stateString = "COURTESY_CALL"; break
47+
case "9": stateString = "FRAUD_LIQUIDATION_IN_PROGRESS"; break
48+
case "10": stateString = "LIQUIDATION_IN_PROGRESS"; break
49+
case "11": stateString = "LIQUIDATED"; break
50+
default: stateString = "<< UNKNOWN >>"; break
51+
}
52+
const keepAddress = await deposit.keepAddress()
53+
const lotSizeSatoshis = await deposit.lotSizeSatoshis()
54+
const lotSizeTbtc = await deposit.lotSizeTbtc()
55+
56+
console.log(`deposit address: ${depositAddresses[i]}`)
57+
console.log(`deposit index: ${i}`)
58+
console.log(`deposit state: ${stateString}`)
59+
console.log(`keep address: ${keepAddress}`)
60+
console.log(`lot size [sat]: ${lotSizeSatoshis}`)
61+
console.log(`lot size [tbtc]: ${lotSizeTbtc}`)
62+
63+
console.log(``)
64+
}
65+
66+
process.exit()
67+
} catch (error) {
68+
console.log(error)
69+
process.exit()
70+
}
71+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const getDeploymentBlockNumber = async function(contractJSON, web3) {
2+
const networkId = Object.keys(contractJSON.networks)[0]
3+
const transactionHash = contractJSON.networks[networkId].transactionHash
4+
const transaction = await web3.eth.getTransaction(transactionHash)
5+
6+
return transaction.blockNumber
7+
}
8+
9+
module.exports = {
10+
getDeploymentBlockNumber: getDeploymentBlockNumber
11+
}

0 commit comments

Comments
 (0)