Skip to content

Commit 26b236f

Browse files
authored
Merge pull request ethereum#2586 from bnb-chain/master_2_develop
Draft release v1.4.12
2 parents 75d1629 + 900cf26 commit 26b236f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+911
-1022
lines changed

.nancy-ignore

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
CVE-2024-34478 # "CWE-754: Improper Check for Unusual or Exceptional Conditions." This vulnerability is BTC only, BSC does not have the issue.
2+
CVE-2024-6104 # "CWE-532: Information Exposure Through Log Files" This is caused by the vulnerabilities [email protected], it is only used in cmd devp2p, impact is limited. will upgrade to v0.7.7 later

CHANGELOG.md

+29
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
11
# Changelog
22

3+
## v1.4.12
4+
5+
### BUGFIX
6+
* [\#2557](https://github.com/bnb-chain/bsc/pull/2557) fix: fix state inspect error after pruned state
7+
* [\#2562](https://github.com/bnb-chain/bsc/pull/2562) fix: delete unexpected block
8+
* [\#2566](https://github.com/bnb-chain/bsc/pull/2566) core: avoid to cache block before wroten into db
9+
* [\#2567](https://github.com/bnb-chain/bsc/pull/2567) fix: fix statedb copy
10+
* [\#2574](https://github.com/bnb-chain/bsc/pull/2574) core: adapt highestVerifiedHeader to FastFinality
11+
* [\#2542](https://github.com/bnb-chain/bsc/pull/2542) fix: pruneancient freeze from the previous position when the first time
12+
* [\#2564](https://github.com/bnb-chain/bsc/pull/2564) fix: the bug of blobsidecars and downloader with multi-database
13+
* [\#2582](https://github.com/bnb-chain/bsc/pull/2582) fix: remove delete and dangling side chains in prunefreezer
14+
15+
### FEATURE
16+
* [\#2513](https://github.com/bnb-chain/bsc/pull/2513) cmd/jsutils: add a tool to get performance between a range of blocks
17+
* [\#2569](https://github.com/bnb-chain/bsc/pull/2569) cmd/jsutils: add a tool to get slash count
18+
* [\#2583](https://github.com/bnb-chain/bsc/pull/2583) cmd/jsutill: add log about validator name
19+
20+
### IMPROVEMENT
21+
* [\#2546](https://github.com/bnb-chain/bsc/pull/2546) go.mod: update missing dependency
22+
* [\#2559](https://github.com/bnb-chain/bsc/pull/2559) nancy: ignore [email protected] in .nancy-ignore
23+
* [\#2556](https://github.com/bnb-chain/bsc/pull/2556) chore: update greenfield cometbft version
24+
* [\#2561](https://github.com/bnb-chain/bsc/pull/2561) tests: fix unstable test
25+
* [\#2572](https://github.com/bnb-chain/bsc/pull/2572) core: clearup testflag for Cancun and Haber
26+
* [\#2573](https://github.com/bnb-chain/bsc/pull/2573) cmd/utils: support use NetworkId to distinguish chapel when do syncing
27+
* [\#2538](https://github.com/bnb-chain/bsc/pull/2538) feat: enhance bid comparison and reply bidding results && detail logs
28+
* [\#2568](https://github.com/bnb-chain/bsc/pull/2568) core/vote: not vote if too late for next in turn validator
29+
* [\#2576](https://github.com/bnb-chain/bsc/pull/2576) miner/worker: broadcast block immediately once sealed
30+
* [\#2580](https://github.com/bnb-chain/bsc/pull/2580) freezer: Opt freezer env checking
31+
332
## v1.4.11
433

534
### BUGFIX

README.md

-2
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,6 @@ unzip testnet.zip
149149
#### 3. Download snapshot
150150
Download latest chaindata snapshot from [here](https://github.com/bnb-chain/bsc-snapshots). Follow the guide to structure your files.
151151

152-
Note: If you encounter difficulties downloading the chaindata snapshot and prefer to synchronize from the genesis block on the Chapel testnet, remember to include the additional flag `--chapel` when initially launching Geth.
153-
154152
#### 4. Start a full node
155153
```shell
156154
./geth --config ./config.toml --datadir ./node --cache 8000 --rpc.allow-unprotected-txs --history.transactions 0

cmd/faucet/faucet.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ func (f *faucet) loop() {
642642
f.lock.RUnlock()
643643
}
644644
}()
645-
// Wait for various events and assing to the appropriate background threads
645+
// Wait for various events and assign to the appropriate background threads
646646
for {
647647
select {
648648
case head := <-heads:

cmd/geth/chaincmd.go

+2-11
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,9 @@ var (
6262
ArgsUsage: "<genesisPath>",
6363
Flags: flags.Merge([]cli.Flag{
6464
utils.CachePreimagesFlag,
65-
utils.OverrideCancun,
66-
utils.OverrideHaber,
6765
utils.OverrideBohr,
6866
utils.OverrideVerkle,
67+
utils.MultiDataBaseFlag,
6968
}, utils.DatabaseFlags),
7069
Description: `
7170
The init command initializes a new genesis block and definition for the network.
@@ -254,14 +253,6 @@ func initGenesis(ctx *cli.Context) error {
254253
defer stack.Close()
255254

256255
var overrides core.ChainOverrides
257-
if ctx.IsSet(utils.OverrideCancun.Name) {
258-
v := ctx.Uint64(utils.OverrideCancun.Name)
259-
overrides.OverrideCancun = &v
260-
}
261-
if ctx.IsSet(utils.OverrideHaber.Name) {
262-
v := ctx.Uint64(utils.OverrideHaber.Name)
263-
overrides.OverrideHaber = &v
264-
}
265256
if ctx.IsSet(utils.OverrideBohr.Name) {
266257
v := ctx.Uint64(utils.OverrideBohr.Name)
267258
overrides.OverrideBohr = &v
@@ -769,7 +760,7 @@ func parseDumpConfig(ctx *cli.Context, stack *node.Node) (*state.DumpConfig, eth
769760
arg := ctx.Args().First()
770761
if hashish(arg) {
771762
hash := common.HexToHash(arg)
772-
if number := rawdb.ReadHeaderNumber(db.BlockStore(), hash); number != nil {
763+
if number := rawdb.ReadHeaderNumber(db, hash); number != nil {
773764
header = rawdb.ReadHeader(db, hash, *number)
774765
} else {
775766
return nil, nil, common.Hash{}, fmt.Errorf("block %x not found", hash)

cmd/geth/config.go

-8
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,6 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) {
185185
params.RialtoGenesisHash = common.HexToHash(v)
186186
}
187187

188-
if ctx.IsSet(utils.OverrideCancun.Name) {
189-
v := ctx.Uint64(utils.OverrideCancun.Name)
190-
cfg.Eth.OverrideCancun = &v
191-
}
192-
if ctx.IsSet(utils.OverrideHaber.Name) {
193-
v := ctx.Uint64(utils.OverrideHaber.Name)
194-
cfg.Eth.OverrideHaber = &v
195-
}
196188
if ctx.IsSet(utils.OverrideBohr.Name) {
197189
v := ctx.Uint64(utils.OverrideBohr.Name)
198190
cfg.Eth.OverrideBohr = &v

cmd/geth/dbcmd.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,8 @@ func inspectTrie(ctx *cli.Context) error {
397397
var headerBlockHash common.Hash
398398
if ctx.NArg() >= 1 {
399399
if ctx.Args().Get(0) == "latest" {
400-
headerHash := rawdb.ReadHeadHeaderHash(db.BlockStore())
401-
blockNumber = *(rawdb.ReadHeaderNumber(db.BlockStore(), headerHash))
400+
headerHash := rawdb.ReadHeadHeaderHash(db)
401+
blockNumber = *(rawdb.ReadHeaderNumber(db, headerHash))
402402
} else if ctx.Args().Get(0) == "snapshot" {
403403
trieRootHash = rawdb.ReadSnapshotRoot(db)
404404
blockNumber = math.MaxUint64
@@ -1212,7 +1212,7 @@ func showMetaData(ctx *cli.Context) error {
12121212
if err != nil {
12131213
fmt.Fprintf(os.Stderr, "Error accessing ancients: %v", err)
12141214
}
1215-
data := rawdb.ReadChainMetadataFromMultiDatabase(db)
1215+
data := rawdb.ReadChainMetadata(db)
12161216
data = append(data, []string{"frozen", fmt.Sprintf("%d items", ancients)})
12171217
data = append(data, []string{"snapshotGenerator", snapshot.ParseGeneratorStatus(rawdb.ReadSnapshotGenerator(db))})
12181218
if b := rawdb.ReadHeadBlock(db); b != nil {
@@ -1255,7 +1255,7 @@ func hbss2pbss(ctx *cli.Context) error {
12551255
defer stack.Close()
12561256

12571257
db := utils.MakeChainDatabase(ctx, stack, false, false)
1258-
db.Sync()
1258+
db.BlockStore().Sync()
12591259
stateDiskDb := db.StateStore()
12601260
defer db.Close()
12611261

@@ -1273,8 +1273,8 @@ func hbss2pbss(ctx *cli.Context) error {
12731273
log.Info("hbss2pbss triedb", "scheme", triedb.Scheme())
12741274
defer triedb.Close()
12751275

1276-
headerHash := rawdb.ReadHeadHeaderHash(db.BlockStore())
1277-
blockNumber := rawdb.ReadHeaderNumber(db.BlockStore(), headerHash)
1276+
headerHash := rawdb.ReadHeadHeaderHash(db)
1277+
blockNumber := rawdb.ReadHeaderNumber(db, headerHash)
12781278
if blockNumber == nil {
12791279
log.Error("read header number failed.")
12801280
return fmt.Errorf("read header number failed")

cmd/geth/main.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ var (
7272
utils.USBFlag,
7373
utils.SmartCardDaemonPathFlag,
7474
utils.RialtoHash,
75-
utils.OverrideCancun,
76-
utils.OverrideHaber,
7775
utils.OverrideBohr,
7876
utils.OverrideVerkle,
7977
utils.OverrideFullImmutabilityThreshold,
@@ -127,6 +125,7 @@ var (
127125
utils.CacheSnapshotFlag,
128126
// utils.CacheNoPrefetchFlag,
129127
utils.CachePreimagesFlag,
128+
utils.MultiDataBaseFlag,
130129
utils.PersistDiffFlag,
131130
utils.DiffBlockFlag,
132131
utils.PruneAncientDataFlag,
@@ -336,9 +335,6 @@ func prepare(ctx *cli.Context) {
336335
5. Networking is disabled; there is no listen-address, the maximum number of peers is set
337336
to 0, and discovery is disabled.
338337
`)
339-
340-
case !ctx.IsSet(utils.NetworkIdFlag.Name):
341-
log.Info("Starting Geth on BSC mainnet...")
342338
}
343339
// If we're a full node on mainnet without --cache specified, bump default cache allowance
344340
if !ctx.IsSet(utils.CacheFlag.Name) && !ctx.IsSet(utils.NetworkIdFlag.Name) {

cmd/geth/pruneblock_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,12 @@ func BlockchainCreator(t *testing.T, chaindbPath, AncientPath string, blockRemai
155155
triedb := triedb.NewDatabase(db, nil)
156156
defer triedb.Close()
157157

158+
if err = db.SetupFreezerEnv(&ethdb.FreezerEnv{
159+
ChainCfg: gspec.Config,
160+
BlobExtraReserve: params.DefaultExtraReserveForBlobRequests,
161+
}); err != nil {
162+
t.Fatalf("Failed to create chain: %v", err)
163+
}
158164
genesis := gspec.MustCommit(db, triedb)
159165
// Initialize a fresh chain with only a genesis block
160166
blockchain, err := core.NewBlockChain(db, config, gspec, nil, engine, vm.Config{}, nil, nil)

cmd/jsutils/README.md

+21-1
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,24 @@ testnet validators version
2424
### 2.Get Transaction Count
2525
```bash
2626
node gettxcount.js --rpc ${url} --startNum ${start} --endNum ${end} --miner ${miner} (optional)
27-
```
27+
```
28+
29+
### 3. Get Performance
30+
```bash
31+
node get_perf.js --rpc ${url} --startNum ${start} --endNum ${end}
32+
```
33+
output as following
34+
```bash
35+
Get the performance between [ 19470 , 19670 )
36+
txCountPerBlock = 3142.81 txCountTotal = 628562 BlockCount = 200 avgBlockTime = 3.005 inturnBlocksRatio = 0.975
37+
txCountPerSecond = 1045.8602329450914 avgGasUsedPerBlock = 250.02062627 avgGasUsedPerSecond = 83.20153952412646
38+
```
39+
40+
### 4. Get validators slash count
41+
```bash
42+
use the latest block
43+
node getslashcount.js --Rpc ${ArchiveRpc}
44+
use a block number
45+
node getslashcount.js --Rpc ${ArchiveRpc} --Num ${blockNum}
46+
```
47+

cmd/jsutils/get_perf.js

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { ethers } from "ethers";
2+
import program from "commander";
3+
4+
program.option("--rpc <rpc>", "Rpc");
5+
program.option("--startNum <startNum>", "start num")
6+
program.option("--endNum <endNum>", "end num")
7+
program.parse(process.argv);
8+
9+
const provider = new ethers.JsonRpcProvider(program.rpc)
10+
11+
const main = async () => {
12+
let txCountTotal = 0;
13+
let gasUsedTotal = 0;
14+
let inturnBlocks = 0;
15+
for (let i = program.startNum; i < program.endNum; i++) {
16+
let txCount = await provider.send("eth_getBlockTransactionCountByNumber", [
17+
ethers.toQuantity(i)]);
18+
txCountTotal += ethers.toNumber(txCount)
19+
20+
let header = await provider.send("eth_getHeaderByNumber", [
21+
ethers.toQuantity(i)]);
22+
let gasUsed = eval(eval(header.gasUsed).toString(10))
23+
gasUsedTotal += gasUsed
24+
let difficulty = eval(eval(header.difficulty).toString(10))
25+
if (difficulty == 2) {
26+
inturnBlocks += 1
27+
}
28+
let timestamp = eval(eval(header.timestamp).toString(10))
29+
console.log("BlockNumber =", i, "mod =", i%4, "miner =", header.miner , "difficulty =", difficulty, "txCount =", ethers.toNumber(txCount), "gasUsed", gasUsed, "timestamp", timestamp)
30+
}
31+
32+
let blockCount = program.endNum - program.startNum
33+
let txCountPerBlock = txCountTotal/blockCount
34+
35+
let startHeader = await provider.send("eth_getHeaderByNumber", [
36+
ethers.toQuantity(program.startNum)]);
37+
let startTime = eval(eval(startHeader.timestamp).toString(10))
38+
let endHeader = await provider.send("eth_getHeaderByNumber", [
39+
ethers.toQuantity(program.endNum)]);
40+
let endTime = eval(eval(endHeader.timestamp).toString(10))
41+
let timeCost = endTime - startTime
42+
let avgBlockTime = timeCost/blockCount
43+
let inturnBlocksRatio = inturnBlocks/blockCount
44+
let tps = txCountTotal/timeCost
45+
let M = 1000000
46+
let avgGasUsedPerBlock = gasUsedTotal/blockCount/M
47+
let avgGasUsedPerSecond = gasUsedTotal/timeCost/M
48+
49+
console.log("Get the performance between [", program.startNum, ",", program.endNum, ")");
50+
console.log("txCountPerBlock =", txCountPerBlock, "txCountTotal =", txCountTotal, "BlockCount =", blockCount, "avgBlockTime =", avgBlockTime, "inturnBlocksRatio =", inturnBlocksRatio);
51+
console.log("txCountPerSecond =", tps, "avgGasUsedPerBlock =", avgGasUsedPerBlock, "avgGasUsedPerSecond =", avgGasUsedPerSecond);
52+
};
53+
54+
main().then(() => process.exit(0))
55+
.catch((error) => {
56+
console.error(error);
57+
process.exit(1);
58+
});

cmd/jsutils/getslashcount.js

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import { ethers } from "ethers";
2+
import program from "commander";
3+
4+
program.option("--Rpc <Rpc>", "Rpc");
5+
program.option("--Num <Num>", "num", 0)
6+
program.parse(process.argv);
7+
8+
const provider = new ethers.JsonRpcProvider(program.Rpc);
9+
10+
const slashAbi = [
11+
"function getSlashIndicator(address validatorAddr) external view returns (uint256, uint256)"
12+
]
13+
const validatorSetAbi = [
14+
"function getLivingValidators() external view returns (address[], bytes[])"
15+
]
16+
const stakeHubAbi = [
17+
"function getValidatorDescription(address validatorAddr) external view returns (tuple(string, string, string, string))",
18+
"function consensusToOperator(address consensusAddr) public view returns (address)"
19+
]
20+
const addrValidatorSet = '0x0000000000000000000000000000000000001000';
21+
const validatorSet = new ethers.Contract(addrValidatorSet, validatorSetAbi, provider);
22+
23+
const addrSlash = '0x0000000000000000000000000000000000001001';
24+
const slashIndicator = new ethers.Contract(addrSlash, slashAbi, provider)
25+
26+
const addrStakeHub = '0x0000000000000000000000000000000000002002';
27+
const stakeHub = new ethers.Contract(addrStakeHub, stakeHubAbi, provider)
28+
29+
const validatorMap = new Map([
30+
//BSC
31+
["0x37e9627A91DD13e453246856D58797Ad6583D762", "LegendII"],
32+
["0xB4647b856CB9C3856d559C885Bed8B43e0846a47", "CertiK"],
33+
["0x75B851a27D7101438F45fce31816501193239A83", "Figment"],
34+
["0x502aECFE253E6AA0e8D2A06E12438FFeD0Fe16a0", "BscScan"],
35+
["0xCa503a7eD99eca485da2E875aedf7758472c378C", "InfStones"],
36+
["0x5009317FD4F6F8FeEa9dAe41E5F0a4737BB7A7D5", "NodeReal"],
37+
["0x1cFDBd2dFf70C6e2e30df5012726F87731F38164", "Tranchess"],
38+
["0xF8de5e61322302b2c6e0a525cC842F10332811bf", "Namelix"],
39+
["0xCcB42A9b8d6C46468900527Bc741938E78AB4577", "Turing"],
40+
["0x9f1b7FAE54BE07F4FEE34Eb1aaCb39A1F7B6FC92", "TWStaking"],
41+
["0x7E1FdF03Eb3aC35BF0256694D7fBe6B6d7b3E0c8","LegendIII"],
42+
["0x7b501c7944185130DD4aD73293e8Aa84eFfDcee7","MathW"],
43+
["0x58567F7A51a58708C8B40ec592A38bA64C0697De","Legend"],
44+
["0x460A252B4fEEFA821d3351731220627D7B7d1F3d","Defibit"],
45+
["0x8A239732871AdC8829EA2f47e94087C5FBad47b6","The48Club"],
46+
["0xD3b0d838cCCEAe7ebF1781D11D1bB741DB7Fe1A7","BNBEve"],
47+
["0xF8B99643fAfC79d9404DE68E48C4D49a3936f787","Avengers"],
48+
["0x4e5acf9684652BEa56F2f01b7101a225Ee33d23f","HashKey"],
49+
["0x9bb56C2B4DBE5a06d79911C9899B6f817696ACFc","Feynman"],
50+
["0xbdcc079BBb23C1D9a6F36AA31309676C258aBAC7","Fuji"],
51+
["0x38944092685a336CB6B9ea58836436709a2adC89","Shannon"],
52+
["0xfC1004C0f296Ec3Df4F6762E9EabfcF20EB304a2","Aoraki"],
53+
["0xa0884bb00E5F23fE2427f0E5eC9E51F812848563","Coda"],
54+
["0xe7776De78740f28a96412eE5cbbB8f90896b11A5","Ankr"],
55+
["0xA2D969E82524001Cb6a2357dBF5922B04aD2FCD8","Pexmons"],
56+
["0x5cf810AB8C718ac065b45f892A5BAdAB2B2946B9","Zen"],
57+
["0x4d15D9BCd0c2f33E7510c0de8b42697CA558234a","LegendVII"],
58+
["0x1579ca96EBd49A0B173f86C372436ab1AD393380","LegendV"],
59+
["0xd1F72d433f362922f6565FC77c25e095B29141c8","LegendVI"],
60+
["0xf9814D93b4d904AaA855cBD4266D6Eb0Ec1Aa478","Legend8"],
61+
["0x025a4e09Ea947b8d695f53ddFDD48ddB8F9B06b7","Ciscox"],
62+
["0xE9436F6F30b4B01b57F2780B2898f3820EbD7B98","LegendIV"],
63+
["0xC2d534F079444E6E7Ff9DabB3FD8a26c607932c8","Axion"],
64+
["0x9F7110Ba7EdFda83Fc71BeA6BA3c0591117b440D","LegendIX"],
65+
["0xB997Bf1E3b96919fBA592c1F61CE507E165Ec030","Seoraksan"],
66+
["0x286C1b674d48cFF67b4096b6c1dc22e769581E91","Sigm8"],
67+
["0x73A26778ef9509a6E94b55310eE7233795a9EB25","Coinlix"],
68+
["0x18c44f4FBEde9826C7f257d500A65a3D5A8edebc","Nozti"],
69+
["0xA100FCd08cE722Dc68Ddc3b54237070Cb186f118","Tiollo"],
70+
["0x0F28847cfdbf7508B13Ebb9cEb94B2f1B32E9503","Raptas"],
71+
["0xfD85346c8C991baC16b9c9157e6bdfDACE1cD7d7","Glorin"],
72+
["0x978F05CED39A4EaFa6E8FD045Fe2dd6Da836c7DF","NovaX"],
73+
["0xd849d1dF66bFF1c2739B4399425755C2E0fAbbAb","Nexa"],
74+
["0xA015d9e9206859c13201BB3D6B324d6634276534","Star"],
75+
["0x5ADde0151BfAB27f329e5112c1AeDeed7f0D3692","Veri"],
76+
//Chapel
77+
["0x08265dA01E1A65d62b903c7B34c08cB389bF3D99","Ararat"],
78+
["0x7f5f2cF1aec83bF0c74DF566a41aa7ed65EA84Ea","Kita"],
79+
["0x53387F3321FD69d1E030BB921230dFb188826AFF","Fuji"],
80+
["0x76D76ee8823dE52A1A431884c2ca930C5e72bff3","Seoraksan"],
81+
["0xd447b49CD040D20BC21e49ffEa6487F5638e4346","Everest"],
82+
["0x1a3d9D7A717D64e6088aC937d5aAcDD3E20ca963","Elbrus"],
83+
["0x40D3256EB0BaBE89f0ea54EDAa398513136612f5","Bloxroute"],
84+
["0xF9a1Db0d6f22Bd78ffAECCbc8F47c83Df9FBdbCf","Test"]
85+
]);
86+
87+
88+
const main = async () => {
89+
let blockNum = ethers.getNumber(program.Num)
90+
if (blockNum === 0) {
91+
blockNum = await provider.getBlockNumber()
92+
}
93+
let block = await provider.getBlock(blockNum)
94+
console.log("At block", blockNum, "time", block.date)
95+
const data = await validatorSet.getLivingValidators({blockTag:blockNum})
96+
let totalSlash = 0
97+
for (let i = 0; i < data[0].length; i++) {
98+
let addr = data[0][i];
99+
var val
100+
if (!validatorMap.has(addr)) {
101+
let opAddr = await stakeHub.consensusToOperator(addr, {blockTag:blockNum})
102+
let value = await stakeHub.getValidatorDescription(opAddr, {blockTag:blockNum})
103+
val = value[0]
104+
console.log(addr, val)
105+
} else {
106+
val = validatorMap.get(addr)
107+
}
108+
let info = await slashIndicator.getSlashIndicator(addr, {blockTag:blockNum})
109+
let count = ethers.toNumber(info[1])
110+
totalSlash += count
111+
console.log("Slash:", count, addr, val)
112+
}
113+
console.log("Total slash count", totalSlash)
114+
};
115+
main().then(() => process.exit(0))
116+
.catch((error) => {
117+
console.error(error);
118+
process.exit(1);
119+
});

0 commit comments

Comments
 (0)