Emit TssKeygenMetric event before RotateVault events (Cosmetic)
In Block 5336940 (as an example), the "tss_keygen" event for the new pubkey .3u4l (with the "median_duration_ms") is emitted immediately after a "set_tss_pool" event.
For the last vault in Block 5336943, by contrast, there's a "set_tss_pool", then RotateVault's "InactiveVault" and "ActiveVault" events, then belatedly the "tss_keygen" event for the last of the vaults (pubkey .l0ta) which was needed to carry out the RotateVault.
I thus propose that the two chunks of code in handler_tss.go be swapped, to more intuitively carry out RotateVault only after all "tss_keygen" events for its necessary keygens have been emitted.
if len(initVaults) == len(keygenBlock.Keygens) {
for _, v := range initVaults {
v.UpdateStatus(ActiveVault, common.BlockHeight(ctx))
if err := h.mgr.Keeper().SetVault(ctx, v); err != nil {
return nil, fmt.Errorf("fail to save vault: %w", err)
}
if err := h.mgr.NetworkMgr().RotateVault(ctx, v); err != nil {
return nil, fmt.Errorf("fail to rotate vault: %w", err)
}
}
} else {
ctx.Logger().Info("not enough keygen yet", "expecting", len(keygenBlock.Keygens), "current", len(initVaults))
}
metric, err := h.mgr.Keeper().GetTssKeygenMetric(ctx, msg.PoolPubKey)
if err != nil {
ctx.Logger().Error("fail to get keygen metric", "error", err)
} else {
var total int64
for _, item := range metric.NodeTssTimes {
total += item.TssTime
}
evt := NewEventTssKeygenMetric(metric.PubKey, metric.GetMedianTime())
if err := h.mgr.EventMgr().EmitEvent(ctx, evt); err != nil {
ctx.Logger().Error("fail to emit tss metric event", "error", err)
}
}