Repository: iotaledger/iota-core
Pull request #666 (2024-01-16 10:10:06)

Re-elected committee member retains its SeatIndex


Patch:
diff --git a/components/protocol/component.go b/components/protocol/component.go
index 0944b9d1..b2f771ad 100644
--- a/components/protocol/component.go
+++ b/components/protocol/component.go
@@ -277,7 +277,7 @@ func configure() error {
 		Component.LogDebugf("SlotCommitmentReceived: %s", commitment.ID())
 	})
 
-	deps.Protocol.Events.Engine.SybilProtection.CommitteeSelected.Hook(func(committee *account.Accounts, epoch iotago.EpochIndex) {
+	deps.Protocol.Events.Engine.SybilProtection.CommitteeSelected.Hook(func(committee *account.SeatedAccounts, epoch iotago.EpochIndex) {
 		Component.LogInfof("CommitteeSelected, epoch: %d, committeeIDs: %s, reused: %t", epoch, committee.IDs(), committee.IsReused())
 	})
 
diff --git a/out.log b/out.log
new file mode 100644
index 00000000..0ab84b80
--- /dev/null
+++ b/out.log
@@ -0,0 +1,1 @@
+?   	github.com/iotaledger/iota-core	[no test files]
diff --git a/pkg/core/account/accounts.go b/pkg/core/account/accounts.go
index e5237f6d..45658a54 100644
--- a/pkg/core/account/accounts.go
+++ b/pkg/core/account/accounts.go
@@ -1,10 +1,12 @@
 package account
 
 import (
+	"bytes"
 	"io"
-	"sync/atomic"
+	"sort"
 
 	"github.com/iotaledger/hive.go/core/safemath"
+	"github.com/iotaledger/hive.go/ds"
 	"github.com/iotaledger/hive.go/ds/shrinkingmap"
 	"github.com/iotaledger/hive.go/ierrors"
 	"github.com/iotaledger/hive.go/runtime/syncutils"
@@ -19,7 +21,6 @@ type Accounts struct {
 
 	totalStake          iotago.BaseToken
 	totalValidatorStake iotago.BaseToken
-	reused              atomic.Bool
 
 	mutex syncutils.RWMutex
 }
@@ -52,14 +53,6 @@ func (a *Accounts) IDs() []iotago.AccountID {
 	return ids
 }
 
-func (a *Accounts) IsReused() bool {
-	return a.reused.Load()
-}
-
-func (a *Accounts) SetReused() {
-	a.reused.Store(true)
-}
-
 // Get returns the weight of the given identity.
 func (a *Accounts) Get(id iotago.AccountID) (pool *Pool, exists bool) {
 	return a.accountPools.Get(id)
@@ -125,9 +118,54 @@ func (a *Accounts) ForEach(callback func(id iotago.AccountID, pool *Pool) bool)
 	a.accountPools.ForEach(callback)
 }
 
-// SeatedAccounts creates a new SeatedAccounts instance, that maintains the seats of the given members.
-func (a *Accounts) SeatedAccounts(members ...iotago.AccountID) *SeatedAccounts {
-	return NewSeatedAccounts(a, members...)
+// SeatedAccounts creates a new SeatedAccounts instance,
+// that maintains the seat indices of re-elected members from the previous committee, if provided.
+func (a *Accounts) SeatedAccounts(optPrevCommittee ...*SeatedAccounts) *SeatedAccounts {
+	// If optPrevCommittee not given, use empty SeatedAccounts instance as default to skip the behavior to handle re-elected members.
+	prevCommittee := NewSeatedAccounts(NewAccounts())
+	if len(optPrevCommittee) > 0 {
+		prevCommittee = optPrevCommittee[0]
+	}
+
+	newCommittee := NewSeatedAccounts(a)
+
+	// If previous committee exists the seats need to be assigned and re-elected committee members must retain their SeatIndex.
+	// Keep track of re-elected members' seat indices.
+	takenSeatIndices := ds.NewSet[SeatIndex]()
+
+	// Assign re-elected members' SeatIndex.
+	a.ForEach(func(id iotago.AccountID, _ *Pool) bool {
+		if seatIndex, seatExists := prevCommittee.GetSeat(id); seatExists {
+			newCommittee.Set(seatIndex, id)
+			takenSeatIndices.Add(seatIndex)
+		}
+
+		return true
+	})
+
+	// Sort members lexicographically.
+	committeeAccountIDs := a.IDs()
+	sort.Slice(committeeAccountIDs, func(i int, j int) bool {
+		return bytes.Compare(committeeAccountIDs[i][:], committeeAccountIDs[j][:]) < 0
+	})
+
+	// Assign SeatIndex to new committee members.
+	currentSeatIndex := SeatIndex(0)
+	for _, memberID := range committeeAccountIDs {
+		// If SeatIndex is taken by re-elected member, then increment it.
+		for takenSeatIndices.Has(currentSeatIndex) {
+			currentSeatIndex++
+		}
+
+		// Assign SeatIndex of a fresh committee member.
+		if _, seatExists := prevCommittee.GetSeat(memberID); !seatExists {
+			newCommittee.Set(currentSeatIndex, memberID)
+
+			currentSeatIndex++
+		}
+	}
+
+	return newCommittee
 }
 
 func AccountsFromBytes(b []byte) (*Accounts, int, error) {
@@ -164,13 +202,6 @@ func AccountsFromReader(reader io.Reader) (*Accounts, error) {
 		return nil, ierrors.Wrap(err, "failed to read account data")
 	}
 
-	reused, err := stream.Read[bool](reader)
-	if err != nil {
-		return nil, ierrors.Wrap(err, "failed to read reused flag")
-	}
-
-	a.reused.Store(reused)
-
 	return a, nil
 }
 
@@ -202,9 +233,5 @@ func (a *Accounts) Bytes() ([]byte, error) {
 		return nil, ierrors.Wrap(err, "failed to write accounts")
 	}
 
-	if err := stream.Write(byteBuffer, a.reused.Load()); err != nil {
-		return nil, ierrors.Wrap(err, "failed to write reused flag")
-	}
-
 	return byteBuffer.Bytes()
 }
diff --git a/pkg/core/account/seated_accounts.go b/pkg/core/account/seated_accounts.go
index 6d04e5d1..855e4f64 100644
--- a/pkg/core/account/seated_accounts.go
+++ b/pkg/core/account/seated_accounts.go
@@ -3,10 +3,14 @@ package account
 import (
 	"bytes"
 	"fmt"
+	"io"
 	"sort"
+	"sync/atomic"
 
 	"github.com/iotaledger/hive.go/ds/shrinkingmap"
 	"github.com/iotaledger/hive.go/ierrors"
+	"github.com/iotaledger/hive.go/serializer/v2"
+	"github.com/iotaledger/hive.go/serializer/v2/stream"
 	"github.com/iotaledger/hive.go/stringify"
 	iotago "github.com/iotaledger/iota.go/v4"
 )
@@ -28,6 +32,7 @@ func SeatIndexFromBytes(b []byte) (SeatIndex, int, error) {
 type SeatedAccounts struct {
 	accounts       *Accounts
 	seatsByAccount *shrinkingmap.ShrinkingMap[iotago.AccountID, SeatIndex]
+	reused         atomic.Bool
 }
 
 func NewSeatedAccounts(accounts *Accounts, optMembers ...iotago.AccountID) *SeatedAccounts {
@@ -35,6 +40,7 @@ func NewSeatedAccounts(accounts *Accounts, optMembers ...iotago.AccountID) *Seat
 		accounts:       accounts,
 		seatsByAccount: shrinkingmap.New[iotago.AccountID, SeatIndex](),
 	}
+
 	sort.Slice(optMembers, func(i int, j int) bool {
 		return bytes.Compare(optMembers[i][:], optMembers[j][:]) < 0
 	})
@@ -46,6 +52,14 @@ func NewSeatedAccounts(accounts *Accounts, optMembers ...iotago.AccountID) *Seat
 	return s
 }
 
+func (s *SeatedAccounts) IsReused() bool {
+	return s.reused.Load()
+}
+
+func (s *SeatedAccounts) SetReused() {
+	s.reused.Store(true)
+}
+
 func (s *SeatedAccounts) Set(seat SeatIndex, id iotago.AccountID) bool {
 	// Check if the account exists.
 	if _, exists := s.accounts.Get(id); !exists {
@@ -70,6 +84,10 @@ func (s *SeatedAccounts) GetSeat(id iotago.AccountID) (seat SeatIndex, exists bo
 	return s.seatsByAccount.Get(id)
 }
 
+func (s *SeatedAccounts) IDs() []iotago.AccountID {
+	return s.accounts.IDs()
+}
+
 func (s *SeatedAccounts) HasAccount(id iotago.AccountID) (has bool) {
 	return s.seatsByAccount.Has(id)
 }
@@ -96,6 +114,24 @@ func (s *SeatedAccounts) Accounts() (*Accounts, error) {
 	return accounts, err
 }
 
+func (s *SeatedAccounts) Reuse() (*SeatedAccounts, error) {
+	committeeAccounts, err := s.Accounts()
+	if err != nil {
+		return nil, err
+	}
+
+	newCommittee := NewSeatedAccounts(committeeAccounts)
+	newCommittee.SetReused()
+
+	s.seatsByAccount.ForEach(func(id iotago.AccountID, index SeatIndex) bool {
+		newCommittee.Set(index, id)
+
+		return true
+	})
+
+	return newCommittee, nil
+}
+
 func (s *SeatedAccounts) String() string {
 	builder := stringify.NewStructBuilder("SeatedAccounts")
 
@@ -105,3 +141,93 @@ func (s *SeatedAccounts) String() string {
 
 	return builder.String()
 }
+
+func SeatedAccountsFromBytes(b []byte) (*SeatedAccounts, int, error) {
+	reader := stream.NewByteReader(b)
+
+	s, err := SeatedAccountsFromReader(reader)
+	if err != nil {
+		return nil, 0, ierrors.Wrap(err, "unable to read accounts from bytes")
+	}
+
+	return s, reader.BytesRead(), nil
+}
+
+func SeatedAccountsFromReader(reader io.Reader) (*SeatedAccounts, error) {
+	accounts, err := AccountsFromReader(reader)
+	if err != nil {
+		return nil, ierrors.Wrap(err, "unable to read accounts from bytes")
+	}
+
+	seatsByAccount := shrinkingmap.New[iotago.AccountID, SeatIndex]()
+
+	if err := stream.ReadCollection(reader, serializer.SeriLengthPrefixTypeAsUint32, func(i int) error {
+		accountID, err := stream.Read[iotago.AccountID](reader)
+		if err != nil {
+			return ierrors.Wrapf(err, "unable to read accountID at index %d", i)
+		}
+
+		seatIndex, err := stream.Read[SeatIndex](reader)
+		if err != nil {
+			return ierrors.Wrapf(err, "unable to read seatIndex at index %d", i)
+		}
+
+		seatsByAccount.Set(accountID, seatIndex)
+
+		return nil
+	}); err != nil {
+		return nil, ierrors.Wrap(err, "failed to read account data")
+	}
+
+	reused, err := stream.Read[bool](reader)
+	if err != nil {
+		return nil, ierrors.Wrap(err, "failed to read reused flag")
+	}
+
+	committee := &SeatedAccounts{accounts: accounts, seatsByAccount: seatsByAccount}
+
+	committee.reused.Store(reused)
+
+	return committee, nil
+}
+
+func (s *SeatedAccounts) Bytes() ([]byte, error) {
+	byteBuffer := stream.NewByteBuffer()
+
+	accountsBytes, err := s.accounts.Bytes()
+	if err != nil {
+		return nil, ierrors.Wrap(err, "failed to serialize committee accounts")
+	}
+
+	if err := stream.WriteBytes(byteBuffer, accountsBytes); err != nil {
+		return nil, ierrors.Wrap(err, "failed to write account bytes")
+	}
+
+	if err := stream.WriteCollection(byteBuffer, serializer.SeriLengthPrefixTypeAsUint32, func() (elementsCount int, err error) {
+		var innerErr error
+		s.seatsByAccount.ForEach(func(id iotago.AccountID, seatIndex SeatIndex) bool {
+			if innerErr = stream.Write(byteBuffer, id); innerErr != nil {
+				return false
+			}
+
+			if innerErr = stream.Write(byteBuffer, seatIndex); innerErr != nil {
+				return false
+			}
+
+			return true
+		})
+		if innerErr != nil {
+			return 0, innerErr
+		}
+
+		return s.seatsByAccount.Size(), nil
+	}); err != nil {
+		return nil, ierrors.Wrap(err, "failed to write seats by account map")
+	}
+
+	if err := stream.Write(byteBuffer, s.reused.Load()); err != nil {
+		return nil, ierrors.Wrap(err, "failed to write reused flag")
+	}
+
+	return byteBuffer.Bytes()
+}
diff --git a/pkg/protocol/engine/mempool/v1/mempool.go b/pkg/protocol/engine/mempool/v1/mempool.go
index c54c1ac6..7adbf911 100644
--- a/pkg/protocol/engine/mempool/v1/mempool.go
+++ b/pkg/protocol/engine/mempool/v1/mempool.go
@@ -461,6 +461,9 @@ func (m *MemPool[VoteRank]) updateStateDiffs(transaction *TransactionMetadata, p
 func (m *MemPool[VoteRank]) setup() {
 	m.spendDAG.Events().SpenderAccepted.Hook(func(id iotago.TransactionID) {
 		if transaction, exists := m.cachedTransactions.Get(id); exists {
+			m.evictionMutex.RLock()
+			defer m.evictionMutex.RUnlock()
+
 			transaction.setConflictAccepted()
 		}
 	})
diff --git a/pkg/protocol/sybilprotection/events.go b/pkg/protocol/sybilprotection/events.go
index 18e22380..ecc10ca5 100644
--- a/pkg/protocol/sybilprotection/events.go
+++ b/pkg/protocol/sybilprotection/events.go
@@ -7,7 +7,7 @@ import (
 )
 
 type Events struct {
-	CommitteeSelected *event.Event2[*account.Accounts, iotago.EpochIndex]
+	CommitteeSelected *event.Event2[*account.SeatedAccounts, iotago.EpochIndex]
 	RewardsCommitted  *event.Event1[iotago.EpochIndex]
 
 	event.Group[Events, *Events]
@@ -16,7 +16,7 @@ type Events struct {
 // NewEvents contains the constructor of the Events object (it is generated by a generic factory).
 var NewEvents = event.CreateGroupConstructor(func() (newEvents *Events) {
 	return &Events{
-		CommitteeSelected: event.New2[*account.Accounts, iotago.EpochIndex](),
+		CommitteeSelected: event.New2[*account.SeatedAccounts, iotago.EpochIndex](),
 		RewardsCommitted:  event.New1[iotago.EpochIndex](),
 	}
 })
diff --git a/pkg/protocol/sybilprotection/seatmanager/mock/mockseatmanager.go b/pkg/protocol/sybilprotection/seatmanager/mock/mockseatmanager.go
index edd0832b..a0aadf88 100644
--- a/pkg/protocol/sybilprotection/seatmanager/mock/mockseatmanager.go
+++ b/pkg/protocol/sybilprotection/seatmanager/mock/mockseatmanager.go
@@ -21,7 +21,7 @@ import (
 type ManualPOA struct {
 	events         *seatmanager.Events
 	apiProvider    iotago.APIProvider
-	committeeStore *epochstore.Store[*account.Accounts]
+	committeeStore *epochstore.Store[*account.SeatedAccounts]
 
 	accounts  *account.Accounts
 	committee *account.SeatedAccounts
@@ -31,7 +31,7 @@ type ManualPOA struct {
 	module.Module
 }
 
-func NewManualPOA(e iotago.APIProvider, committeeStore *epochstore.Store[*account.Accounts]) *ManualPOA {
+func NewManualPOA(e iotago.APIProvider, committeeStore *epochstore.Store[*account.SeatedAccounts]) *ManualPOA {
 	m := &ManualPOA{
 		events:         seatmanager.NewEvents(),
 		apiProvider:    e,
@@ -71,9 +71,9 @@ func (m *ManualPOA) AddRandomAccount(alias string) iotago.AccountID {
 
 	m.aliases.Set(alias, id)
 
-	m.committee = m.accounts.SeatedAccounts(m.accounts.IDs()...)
+	m.committee = m.accounts.SeatedAccounts()
 
-	if err := m.committeeStore.Store(0, m.accounts); err != nil {
+	if err := m.committeeStore.Store(0, m.committee); err != nil {
 		panic(err)
 	}
 
@@ -90,9 +90,9 @@ func (m *ManualPOA) AddAccount(id iotago.AccountID, alias string) iotago.Account
 	}
 	m.aliases.Set(alias, id)
 
-	m.committee = m.accounts.SeatedAccounts(m.accounts.IDs()...)
+	m.committee = m.accounts.SeatedAccounts()
 
-	if err := m.committeeStore.Store(0, m.accounts); err != nil {
+	if err := m.committeeStore.Store(0, m.committee); err != nil {
 		panic(err)
 	}
 
@@ -152,7 +152,7 @@ func (m *ManualPOA) committeeInEpoch(epoch iotago.EpochIndex) (*account.SeatedAc
 		return nil, false
 	}
 
-	return c.SeatedAccounts(c.IDs()...), true
+	return c, true
 }
 
 func (m *ManualPOA) OnlineCommittee() ds.Set[account.SeatIndex] {
@@ -179,27 +179,47 @@ func (m *ManualPOA) RotateCommittee(epoch iotago.EpochIndex, validators accounts
 				return nil, ierrors.Wrapf(err, "error while setting pool for epoch %d for validator %s", epoch, validatorData.ID.String())
 			}
 		}
-		m.committee = m.accounts.SeatedAccounts(m.accounts.IDs()...)
+		m.committee = m.accounts.SeatedAccounts()
 	}
 
-	if err := m.committeeStore.Store(epoch, m.accounts); err != nil {
+	if err := m.committeeStore.Store(epoch, m.committee); err != nil {
 		panic(err)
 	}
 
 	return m.committee, nil
 }
 
-func (m *ManualPOA) ReuseCommittee(epoch iotago.EpochIndex, validators *account.Accounts) error {
+func (m *ManualPOA) ReuseCommittee(currentEpoch iotago.EpochIndex, targetEpoch iotago.EpochIndex) (*account.SeatedAccounts, error) {
+	currentCommittee, exists := m.committeeInEpoch(currentEpoch)
+	if !exists {
+		// that should never happen as it is already the fallback strategy
+		panic(fmt.Sprintf("committee for current epoch %d not found", currentEpoch))
+	}
+
+	if currentCommittee.SeatCount() == 0 {
+		return nil, ierrors.New("committee must not be empty")
+	}
+
+	committee, err := currentCommittee.Reuse()
+	if err != nil {
+		return nil, ierrors.Wrapf(err, "failed to reuse committee from epoch %d", currentEpoch)
+	}
+
 	if m.committee == nil || m.accounts.Size() == 0 {
-		m.accounts = validators
-		m.committee = m.accounts.SeatedAccounts(validators.IDs()...)
+		committeeAccounts, err := committee.Accounts()
+		if err != nil {
+			return nil, ierrors.Wrapf(err, "failed to set manual PoA committee for epoch %d", targetEpoch)
+		}
+
+		m.accounts = committeeAccounts
+		m.committee = committee
 	}
 
-	if err := m.committeeStore.Store(epoch, validators); err != nil {
+	if err := m.committeeStore.Store(targetEpoch, committee); err != nil {
 		panic(err)
 	}
 
-	return nil
+	return committee, nil
 }
 
 func (m *ManualPOA) InitializeCommittee(_ iotago.EpochIndex, _ time.Time) error {
diff --git a/pkg/protocol/sybilprotection/seatmanager/poa/poa.go b/pkg/protocol/sybilprotection/seatmanager/poa/poa.go
index ba9d1de8..bd07eb0e 100644
--- a/pkg/protocol/sybilprotection/seatmanager/poa/poa.go
+++ b/pkg/protocol/sybilprotection/seatmanager/poa/poa.go
@@ -25,7 +25,7 @@ type SeatManager struct {
 	apiProvider iotago.APIProvider
 
 	committee       *account.SeatedAccounts
-	committeeStore  *epochstore.Store[*account.Accounts]
+	committeeStore  *epochstore.Store[*account.SeatedAccounts]
 	activityTracker activitytracker.ActivityTracker
 
 	committeeMutex syncutils.RWMutex
@@ -77,11 +77,13 @@ func NewProvider(opts ...options.Option[SeatManager]) module.Provider[*engine.En
 
 var _ seatmanager.SeatManager = &SeatManager{}
 
+// RotateCommittee sets a Proof-of-Authority committee for a given epoch.
+// Given validators are only used if the committee has not been set before, otherwise it's ignored.
 func (s *SeatManager) RotateCommittee(epoch iotago.EpochIndex, validators accounts.AccountsData) (*account.SeatedAccounts, error) {
 	s.committeeMutex.RLock()
 	defer s.committeeMutex.RUnlock()
 
-	// if committee is not set, then set it according to passed validators (used for creating a snapshot)
+	// If the committee is not set, then set it according to passed validators (used for creating a snapshot).
 	if s.committee == nil {
 		committeeAccounts := account.NewAccounts()
 
@@ -94,15 +96,11 @@ func (s *SeatManager) RotateCommittee(epoch iotago.EpochIndex, validators accoun
 				return nil, ierrors.Wrapf(err, "error while setting committee for epoch %d for validator %s", epoch, validatorData.ID.String())
 			}
 		}
-		s.committee = committeeAccounts.SeatedAccounts(committeeAccounts.IDs()...)
-	}
 
-	accounts, err := s.committee.Accounts()
-	if err != nil {
-		return nil, ierrors.Wrapf(err, "error while getting accounts from committee for epoch %d", epoch)
+		s.committee = committeeAccounts.SeatedAccounts()
 	}
 
-	if err := s.committeeStore.Store(epoch, accounts); err != nil {
+	if err := s.committeeStore.Store(epoch, s.committee); err != nil {
 		return nil, ierrors.Wrapf(err, "error while storing committee for epoch %d", epoch)
 	}
 
@@ -135,7 +133,7 @@ func (s *SeatManager) committeeInEpoch(epoch iotago.EpochIndex) (*account.Seated
 		return nil, false
 	}
 
-	return c.SeatedAccounts(c.IDs()...), true
+	return c, true
 }
 
 // OnlineCommittee returns the set of validators selected to be part of the committee that has been seen recently.
@@ -165,16 +163,21 @@ func (s *SeatManager) InitializeCommittee(epoch iotago.EpochIndex, activityTime
 	s.committeeMutex.Lock()
 	defer s.committeeMutex.Unlock()
 
-	committeeAccounts, err := s.committeeStore.Load(epoch)
+	committee, err := s.committeeStore.Load(epoch)
 	if err != nil {
 		return ierrors.Wrapf(err, "failed to load PoA committee for epoch %d", epoch)
 	}
 
-	committeeAccountsIDs := committeeAccounts.IDs()
-	s.committee = committeeAccounts.SeatedAccounts(committeeAccountsIDs...)
+	s.committee = committee
 
 	// Set validators that are part of the committee as active.
-	onlineValidators := committeeAccountsIDs
+	committeeAccounts, err := committee.Accounts()
+	if err != nil {
+		return ierrors.Wrapf(err, "failed to load PoA committee for epoch %d", epoch)
+	}
+
+	onlineValidators := committeeAccounts.IDs()
+
 	if len(s.optsOnlineCommitteeStartup) > 0 {
 		onlineValidators = s.optsOnlineCommitteeStartup
 	}
@@ -192,20 +195,30 @@ func (s *SeatManager) InitializeCommittee(epoch iotago.EpochIndex, activityTime
 	return nil
 }
 
-func (s *SeatManager) ReuseCommittee(epoch iotago.EpochIndex, validators *account.Accounts) error {
+func (s *SeatManager) ReuseCommittee(currentEpoch iotago.EpochIndex, targetEpoch iotago.EpochIndex) (*account.SeatedAccounts, error) {
 	s.committeeMutex.Lock()
 	defer s.committeeMutex.Unlock()
 
-	s.committee = validators.SeatedAccounts(validators.IDs()...)
+	currentCommittee, exists := s.committeeInEpoch(currentEpoch)
+	if !exists {
+		// that should never happen as it is already the fallback strategy
+		panic(ierrors.Errorf("committee for current epoch %d not found", currentEpoch))
+	}
+
+	if currentCommittee.SeatCount() == 0 {
+		return nil, ierrors.New("committee must not be empty")
+	}
 
-	accounts, err := s.committee.Accounts()
+	newCommittee, err := currentCommittee.Reuse()
 	if err != nil {
-		return ierrors.Wrapf(err, "failed to get accounts from committee for epoch %d", epoch)
+		return nil, ierrors.Wrapf(err, "failed to reuse committee from epoch %d", currentEpoch)
 	}
 
-	if err := s.committeeStore.Store(epoch, accounts); err != nil {
-		return ierrors.Wrapf(err, "failed to set committee for epoch %d", epoch)
+	s.committee = newCommittee
+
+	if err := s.committeeStore.Store(targetEpoch, s.committee); err != nil {
+		return nil, ierrors.Wrapf(err, "failed to set committee for epoch %d", targetEpoch)
 	}
 
-	return nil
+	return s.committee, nil
 }
diff --git a/pkg/protocol/sybilprotection/seatmanager/seatmanager.go b/pkg/protocol/sybilprotection/seatmanager/seatmanager.go
index 85e87ffd..e6c8ea05 100644
--- a/pkg/protocol/sybilprotection/seatmanager/seatmanager.go
+++ b/pkg/protocol/sybilprotection/seatmanager/seatmanager.go
@@ -16,7 +16,7 @@ type SeatManager interface {
 	RotateCommittee(epoch iotago.EpochIndex, candidates accounts.AccountsData) (*account.SeatedAccounts, error)
 
 	// ReuseCommittee reuses the committee from a previous epoch.
-	ReuseCommittee(epoch iotago.EpochIndex, committee *account.Accounts) error
+	ReuseCommittee(prevEpoch iotago.EpochIndex, targetEpoch iotago.EpochIndex) (*account.SeatedAccounts, error)
 
 	// InitializeCommittee initializes the committee for the current slot by marking whole or a subset of the committee as active.
 	// This is used when initializing committee after node startup (loaded from snapshot or database).
diff --git a/pkg/protocol/sybilprotection/seatmanager/topstakers/topstakers.go b/pkg/protocol/sybilprotection/seatmanager/topstakers/topstakers.go
index 000bec5f..fd1380f7 100644
--- a/pkg/protocol/sybilprotection/seatmanager/topstakers/topstakers.go
+++ b/pkg/protocol/sybilprotection/seatmanager/topstakers/topstakers.go
@@ -27,7 +27,7 @@ type SeatManager struct {
 	apiProvider iotago.APIProvider
 	events      *seatmanager.Events
 
-	committeeStore  *epochstore.Store[*account.Accounts]
+	committeeStore  *epochstore.Store[*account.SeatedAccounts]
 	committeeMutex  syncutils.RWMutex
 	activityTracker activitytracker.ActivityTracker
 
@@ -86,21 +86,38 @@ func (s *SeatManager) RotateCommittee(epoch iotago.EpochIndex, candidates accoun
 		return nil, ierrors.New("candidates must not be empty")
 	}
 
-	committee, err := s.selectNewCommittee(epoch, candidates)
+	committeeAccounts, err := s.selectNewCommitteeAccounts(epoch, candidates)
 	if err != nil {
 		return nil, ierrors.Wrap(err, "error while selecting new committee")
 	}
 
-	committeeAccounts, err := committee.Accounts()
-	if err != nil {
-		return nil, ierrors.Wrapf(err, "error while getting committeeAccounts for newly selected committee for epoch %d", epoch)
+	// Load previous committee only if target epoch is not zero.
+	var prevCommittee *account.SeatedAccounts
+	if epoch > 0 {
+		prevCommittee, err = s.committeeStore.Load(epoch - 1)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	// If there is no previous committee , then we can assign seats by default.
+	if prevCommittee == nil {
+		newCommittee := committeeAccounts.SeatedAccounts()
+
+		if err := s.committeeStore.Store(epoch, newCommittee); err != nil {
+			return nil, ierrors.Wrapf(err, "error while storing committee for epoch %d", epoch)
+		}
+
+		return newCommittee, nil
 	}
 
-	if err := s.committeeStore.Store(epoch, committeeAccounts); err != nil {
+	newCommittee := committeeAccounts.SeatedAccounts(prevCommittee)
+
+	if err := s.committeeStore.Store(epoch, newCommittee); err != nil {
 		return nil, ierrors.Wrapf(err, "error while storing committee for epoch %d", epoch)
 	}
 
-	return committee, nil
+	return newCommittee, nil
 }
 
 // CommitteeInSlot returns the set of validators selected to be part of the committee in the given slot.
@@ -129,7 +146,7 @@ func (s *SeatManager) committeeInEpoch(epoch iotago.EpochIndex) (*account.Seated
 		return nil, false
 	}
 
-	return c.SeatedAccounts(c.IDs()...), true
+	return c, true
 }
 
 // OnlineCommittee returns the set of validators selected to be part of the committee that has been seen recently.
@@ -163,14 +180,18 @@ func (s *SeatManager) InitializeCommittee(epoch iotago.EpochIndex, activityTime
 	s.committeeMutex.Lock()
 	defer s.committeeMutex.Unlock()
 
-	committeeAccounts, err := s.committeeStore.Load(epoch)
+	committee, err := s.committeeStore.Load(epoch)
 	if err != nil {
 		return ierrors.Wrapf(err, "failed to load PoA committee for epoch %d", epoch)
 	}
 
-	committee := committeeAccounts.SeatedAccounts(committeeAccounts.IDs()...)
+	committeeAccounts, err := committee.Accounts()
+	if err != nil {
+		return ierrors.Wrapf(err, "failed to retrieve accounts of the committee for epoch %d", epoch)
+	}
 
 	onlineValidators := committeeAccounts.IDs()
+
 	if len(s.optsOnlineCommitteeStartup) > 0 {
 		onlineValidators = s.optsOnlineCommitteeStartup
 	}
@@ -188,23 +209,34 @@ func (s *SeatManager) InitializeCommittee(epoch iotago.EpochIndex, activityTime
 	return nil
 }
 
-func (s *SeatManager) ReuseCommittee(epoch iotago.EpochIndex, validators *account.Accounts) error {
+func (s *SeatManager) ReuseCommittee(currentEpoch iotago.EpochIndex, targetEpoch iotago.EpochIndex) (*account.SeatedAccounts, error) {
 	s.committeeMutex.Lock()
 	defer s.committeeMutex.Unlock()
 
-	if validators.Size() == 0 {
-		return ierrors.New("committee must not be empty")
+	currentCommittee, exists := s.committeeInEpoch(currentEpoch)
+	if !exists {
+		// that should never happen as it is already the fallback strategy
+		panic(ierrors.Errorf("committee for current epoch %d not found", currentEpoch))
+	}
+
+	if currentCommittee.SeatCount() == 0 {
+		return nil, ierrors.New("committee must not be empty")
 	}
 
-	err := s.committeeStore.Store(epoch, validators)
+	newCommittee, err := currentCommittee.Reuse()
 	if err != nil {
-		return ierrors.Wrapf(err, "failed to set committee for epoch %d", epoch)
+		return nil, ierrors.Wrapf(err, "failed to reuse committee from epoch %d", currentEpoch)
 	}
 
-	return nil
+	err = s.committeeStore.Store(targetEpoch, newCommittee)
+	if err != nil {
+		return nil, ierrors.Wrapf(err, "failed to set committee for epoch %d", targetEpoch)
+	}
+
+	return newCommittee, nil
 }
 
-func (s *SeatManager) selectNewCommittee(epoch iotago.EpochIndex, candidates accounts.AccountsData) (*account.SeatedAccounts, error) {
+func (s *SeatManager) selectNewCommitteeAccounts(epoch iotago.EpochIndex, candidates accounts.AccountsData) (*account.Accounts, error) {
 	sort.Slice(candidates, func(i int, j int) bool {
 		// Prioritize the candidate that has a larger pool stake.
 		if candidates[i].ValidatorStake+candidates[i].DelegationStake != candidates[j].ValidatorStake+candidates[j].DelegationStake {
@@ -246,7 +278,6 @@ func (s *SeatManager) selectNewCommittee(epoch iotago.EpochIndex, candidates acc
 			return nil, ierrors.Wrapf(err, "error while setting pool for committee candidate %s", candidateData.ID.String())
 		}
 	}
-	committee := newCommitteeAccounts.SeatedAccounts(newCommitteeAccounts.IDs()...)
 
-	return committee, nil
+	return newCommitteeAccounts, nil
 }
diff --git a/pkg/protocol/sybilprotection/sybilprotectionv1/performance/performance.go b/pkg/protocol/sybilprotection/sybilprotectionv1/performance/performance.go
index b72ed2f3..1c53dc46 100644
--- a/pkg/protocol/sybilprotection/sybilprotectionv1/performance/performance.go
+++ b/pkg/protocol/sybilprotection/sybilprotectionv1/performance/performance.go
@@ -21,7 +21,7 @@ import (
 type Tracker struct {
 	rewardsStorePerEpochFunc       func(epoch iotago.EpochIndex) (kvstore.KVStore, error)
 	poolStatsStore                 *epochstore.Store[*model.PoolsStats]
-	committeeStore                 *epochstore.Store[*account.Accounts]
+	committeeStore                 *epochstore.Store[*account.SeatedAccounts]
 	committeeCandidatesInEpochFunc func(epoch iotago.EpochIndex) (*kvstore.TypedStore[iotago.AccountID, iotago.SlotIndex], error)
 	nextEpochCommitteeCandidates   *shrinkingmap.ShrinkingMap[iotago.AccountID, iotago.SlotIndex]
 	validatorPerformancesFunc      func(slot iotago.SlotIndex) (*slotstore.Store[iotago.AccountID, *model.ValidatorPerformance], error)
@@ -40,7 +40,7 @@ type Tracker struct {
 func NewTracker(
 	rewardsStorePerEpochFunc func(epoch iotago.EpochIndex) (kvstore.KVStore, error),
 	poolStatsStore *epochstore.Store[*model.PoolsStats],
-	committeeStore *epochstore.Store[*account.Accounts],
+	committeeStore *epochstore.Store[*account.SeatedAccounts],
 	committeeCandidatesInEpochFunc func(epoch iotago.EpochIndex) (*kvstore.TypedStore[iotago.AccountID, iotago.SlotIndex], error),
 	validatorPerformancesFunc func(slot iotago.SlotIndex) (*slotstore.Store[iotago.AccountID, *model.ValidatorPerformance], error),
 	latestAppliedEpoch iotago.EpochIndex,
@@ -174,7 +174,7 @@ func (t *Tracker) getValidatorCandidates(epoch iotago.EpochIndex) (ds.Set[iotago
 	return candidates, nil
 }
 
-func (t *Tracker) LoadCommitteeForEpoch(epoch iotago.EpochIndex) (committee *account.Accounts, exists bool) {
+func (t *Tracker) LoadCommitteeForEpoch(epoch iotago.EpochIndex) (committee *account.SeatedAccounts, exists bool) {
 	c, err := t.committeeStore.Load(epoch)
 	if err != nil {
 		panic(ierrors.Wrapf(err, "failed to load committee for epoch %d", epoch))
@@ -188,7 +188,7 @@ func (t *Tracker) LoadCommitteeForEpoch(epoch iotago.EpochIndex) (committee *acc
 }
 
 // ApplyEpoch calculates and stores pool stats and rewards for the given epoch.
-func (t *Tracker) ApplyEpoch(epoch iotago.EpochIndex, committee *account.Accounts) error {
+func (t *Tracker) ApplyEpoch(epoch iotago.EpochIndex, committee *account.SeatedAccounts) error {
 	t.mutex.Lock()
 	defer t.mutex.Unlock()
 
@@ -196,14 +196,19 @@ func (t *Tracker) ApplyEpoch(epoch iotago.EpochIndex, committee *account.Account
 	epochStartSlot := timeProvider.EpochStart(epoch)
 	epochEndSlot := timeProvider.EpochEnd(epoch)
 
-	profitMargin, err := t.calculateProfitMargin(committee.TotalValidatorStake(), committee.TotalStake(), epoch)
+	committeeAccounts, err := committee.Accounts()
+	if err != nil {
+		return ierrors.Wrapf(err, "failed to retrieve accounts from committee for epoch %d", epoch)
+	}
+
+	profitMargin, err := t.calculateProfitMargin(committeeAccounts.TotalValidatorStake(), committeeAccounts.TotalStake(), epoch)
 	if err != nil {
 		return ierrors.Wrapf(err, "failed to calculate profit margin for epoch %d", epoch)
 	}
 
 	poolsStats := &model.PoolsStats{
-		TotalStake:          committee.TotalStake(),
-		TotalValidatorStake: committee.TotalValidatorStake(),
+		TotalStake:          committeeAccounts.TotalStake(),
+		TotalValidatorStake: committeeAccounts.TotalValidatorStake(),
 		ProfitMargin:        profitMargin,
 	}
 
@@ -216,7 +221,7 @@ func (t *Tracker) ApplyEpoch(epoch iotago.EpochIndex, committee *account.Account
 		panic(ierrors.Wrapf(err, "failed to create rewards tree for epoch %d", epoch))
 	}
 
-	committee.ForEach(func(accountID iotago.AccountID, pool *account.Pool) bool {
+	committeeAccounts.ForEach(func(accountID iotago.AccountID, pool *account.Pool) bool {
 		validatorPerformances := make([]*model.ValidatorPerformance, 0, timeProvider.EpochDurationSlots())
 
 		for slot := epochStartSlot; slot <= epochEndSlot; slot++ {
@@ -251,8 +256,8 @@ func (t *Tracker) ApplyEpoch(epoch iotago.EpochIndex, committee *account.Account
 
 		poolReward, err := t.poolReward(
 			epochEndSlot,
-			committee.TotalValidatorStake(),
-			committee.TotalStake(),
+			committeeAccounts.TotalValidatorStake(),
+			committeeAccounts.TotalStake(),
 			pool.PoolStake,
 			pool.ValidatorStake,
 			epochPerformanceFactor,
@@ -321,7 +326,7 @@ func (t *Tracker) isCommitteeMember(slot iotago.SlotIndex, accountID iotago.Acco
 		return false, ierrors.Errorf("committee for epoch %d not found", epoch)
 	}
 
-	return committee.Has(accountID), nil
+	return committee.HasAccount(accountID), nil
 }
 
 func (t *Tracker) trackCommitteeMemberPerformance(validationBlock *iotago.ValidationBlockBody, block *blocks.Block) {
diff --git a/pkg/protocol/sybilprotection/sybilprotectionv1/performance/snapshot.go b/pkg/protocol/sybilprotection/sybilprotectionv1/performance/snapshot.go
index c4990478..d4b19e2a 100644
--- a/pkg/protocol/sybilprotection/sybilprotectionv1/performance/snapshot.go
+++ b/pkg/protocol/sybilprotection/sybilprotectionv1/performance/snapshot.go
@@ -184,11 +184,29 @@ func (t *Tracker) importCommittees(reader io.ReadSeeker) error {
 			return ierrors.Wrap(err, "unable to read epoch index")
 		}
 
-		committee, err := account.AccountsFromReader(reader)
+		// A snapshot contains only the list of committee members.
+		// The committee for each epoch gets SeatIndices assigned.
+		// When the node is running, and a committee member is re-elected,
+		// the SeatIndex must be maintained across the two epochs
+		// to prevent a single Account from incorrectly inflating the number of active
+		// seats in the committee - active on seat X from the previous epoch, and on seat Y in the new epoch.
+		// However, when loading past committees from the snapshot, this SeatIndex continuity is not necessary, that's why
+		// SeatIndices are assigned for each epoch individually, without looking at committees from other epochs.
+		committeeAccounts, err := account.AccountsFromReader(reader)
 		if err != nil {
 			return ierrors.Wrapf(err, "unable to read committee for the epoch %d", epoch)
 		}
 
+		isReused, err := stream.Read[bool](reader)
+		if err != nil {
+			return ierrors.Wrapf(err, "unable to read reused flag for the epoch %d", epoch)
+		}
+
+		committee := committeeAccounts.SeatedAccounts()
+		if isReused {
+			committee.SetReused()
+		}
+
 		if err = t.committeeStore.Store(epoch, committee); err != nil {
 			return ierrors.Wrap(err, "unable to store committee")
 		}
@@ -360,30 +378,47 @@ func (t *Tracker) exportCommittees(writer io.WriteSeeker, targetSlot iotago.Slot
 		if err := t.committeeStore.StreamBytes(func(epochBytes []byte, committeeBytes []byte) error {
 			epoch, _, err := iotago.EpochIndexFromBytes(epochBytes)
 			if err != nil {
-				return err
+				return ierrors.Wrapf(err, "failed to parse epoch bytes")
+			}
+
+			committee, _, err := account.SeatedAccountsFromBytes(committeeBytes)
+			if err != nil {
+				return ierrors.Wrapf(err, "failed to parse committee bytes for epoch %d", epoch)
 			}
 
 			// We have a committee for an epoch higher than the targetSlot
-			// 1. we trust the point of no return, we export the committee for the next epoch
-			// 2. if we don't trust the point-of-no-return
+			// 1. We trust the point of no return, we export the committee for the next epoch
+			// 2. If we don't trust the point-of-no-return
 			// - we were able to rotate a committee, then we export it
 			// - we were not able to rotate a committee (reused), then we don't export it
-			if epoch > epochFromTargetSlot && targetSlot < pointOfNoReturn {
-				committee, _, err := account.AccountsFromBytes(committeeBytes)
-				if err != nil {
-					return ierrors.Wrapf(err, "failed to parse committee bytes for epoch %d", epoch)
-				}
-				if committee.IsReused() {
-					return nil
-				}
+			if epoch > epochFromTargetSlot && targetSlot < pointOfNoReturn && committee.IsReused() {
+				return nil
+			}
+
+			// Save only the list of committee accounts in the snapshot, so that snapshots generated on different nodes
+			// that assigned SeatIndices differently can still be compared and generate equal hashes.
+			// When reading the snapshot,
+			// nodes will assign SeatIndex to each committee member individually
+			// as this perception is completely subjective.
+			committeeAccounts, err := committee.Accounts()
+			if err != nil {
+				return ierrors.Wrapf(err, "failed to extract accounts from committee for epoch %d", epoch)
+			}
+
+			committeeAccountsBytes, err := committeeAccounts.Bytes()
+			if err != nil {
+				return ierrors.Wrapf(err, "failed to serialize committee accounts for epoch %d", epoch)
 			}
 
 			if err := stream.WriteBytes(writer, epochBytes); err != nil {
 				return ierrors.Wrapf(err, "unable to write epoch index %d", epoch)
 			}
-			if err := stream.WriteBytes(writer, committeeBytes); err != nil {
+			if err := stream.WriteBytes(writer, committeeAccountsBytes); err != nil {
 				return ierrors.Wrapf(err, "unable to write committee for epoch %d", epoch)
 			}
+			if err := stream.Write[bool](writer, committee.IsReused()); err != nil {
+				return ierrors.Wrapf(err, "unable to write reused flag for epoch %d", epoch)
+			}
 
 			epochCount++
 
diff --git a/pkg/protocol/sybilprotection/sybilprotectionv1/sybilprotection.go b/pkg/protocol/sybilprotection/sybilprotectionv1/sybilprotection.go
index 24bfc9d0..b78003ed 100644
--- a/pkg/protocol/sybilprotection/sybilprotectionv1/sybilprotection.go
+++ b/pkg/protocol/sybilprotection/sybilprotectionv1/sybilprotection.go
@@ -1,7 +1,6 @@
 package sybilprotectionv1
 
 import (
-	"fmt"
 	"io"
 	"sort"
 
@@ -226,17 +225,10 @@ func (o *SybilProtection) committeeRoot(targetCommitteeEpoch iotago.EpochIndex)
 		iotago.AccountIDFromBytes,
 	)
 
-	var innerErr error
-	committee.ForEach(func(accountID iotago.AccountID, _ *account.Pool) bool {
-		if err := committeeTree.Add(accountID); err != nil {
-			innerErr = ierrors.Wrapf(err, "failed to add account %s to committee tree", accountID)
-			return false
+	for _, accountID := range committee.IDs() {
+		if err = committeeTree.Add(accountID); err != nil {
+			return iotago.Identifier{}, ierrors.Wrapf(err, "failed to add account %s to committee tree", accountID)
 		}
-
-		return true
-	})
-	if innerErr != nil {
-		return iotago.Identifier{}, innerErr
 	}
 
 	return committeeTree.Root(), nil
@@ -387,29 +379,18 @@ func (o *SybilProtection) OrderedRegisteredCandidateValidatorsList(epoch iotago.
 	return validatorResp, nil
 }
 
-func (o *SybilProtection) reuseCommittee(currentEpoch iotago.EpochIndex, targetEpoch iotago.EpochIndex) (*account.Accounts, error) {
-	committee, exists := o.seatManager.CommitteeInEpoch(currentEpoch)
-	if !exists {
-		// that should never happen as it is already the fallback strategy
-		panic(fmt.Sprintf("committee for current epoch %d not found", currentEpoch))
-	}
-
-	committeeAccounts, err := committee.Accounts()
+func (o *SybilProtection) reuseCommittee(currentEpoch iotago.EpochIndex, targetEpoch iotago.EpochIndex) (*account.SeatedAccounts, error) {
+	committee, err := o.seatManager.ReuseCommittee(currentEpoch, targetEpoch)
 	if err != nil {
-		return nil, ierrors.Wrapf(err, "failed to get accounts from committee for epoch %d", currentEpoch)
-	}
-
-	committeeAccounts.SetReused()
-	if err = o.seatManager.ReuseCommittee(targetEpoch, committeeAccounts); err != nil {
 		return nil, ierrors.Wrapf(err, "failed to set committee for epoch %d", targetEpoch)
 	}
 
 	o.performanceTracker.ClearCandidates()
 
-	return committeeAccounts, nil
+	return committee, nil
 }
 
-func (o *SybilProtection) selectNewCommittee(slot iotago.SlotIndex) (*account.Accounts, error) {
+func (o *SybilProtection) selectNewCommittee(slot iotago.SlotIndex) (*account.SeatedAccounts, error) {
 	timeProvider := o.apiProvider.APIForSlot(slot).TimeProvider()
 	currentEpoch := timeProvider.EpochFromSlot(slot)
 	nextEpoch := currentEpoch + 1
@@ -422,12 +403,12 @@ func (o *SybilProtection) selectNewCommittee(slot iotago.SlotIndex) (*account.Ac
 
 	// If there's no candidate, reuse the current committee.
 	if candidates.Size() == 0 {
-		committeeAccounts, err := o.reuseCommittee(currentEpoch, nextEpoch)
+		committee, err := o.reuseCommittee(currentEpoch, nextEpoch)
 		if err != nil {
 			return nil, ierrors.Wrapf(err, "failed to reuse committee (due to no candidates) for epoch %d", nextEpoch)
 		}
 
-		return committeeAccounts, nil
+		return committee, nil
 	}
 
 	candidateAccounts := make(accounts.AccountsData, 0)
@@ -454,7 +435,7 @@ func (o *SybilProtection) selectNewCommittee(slot iotago.SlotIndex) (*account.Ac
 
 	o.performanceTracker.ClearCandidates()
 
-	return newCommittee.Accounts()
+	return newCommittee, nil
 }
 
 // WithInitialCommittee registers the passed committee on a given slot.
diff --git a/pkg/storage/prunable/prunable.go b/pkg/storage/prunable/prunable.go
index dcce933d..fda61788 100644
--- a/pkg/storage/prunable/prunable.go
+++ b/pkg/storage/prunable/prunable.go
@@ -26,7 +26,7 @@ type Prunable struct {
 	decidedUpgradeSignals *epochstore.Store[model.VersionAndHash]
 	poolRewards           *epochstore.EpochKVStore
 	poolStats             *epochstore.Store[*model.PoolsStats]
-	committee             *epochstore.Store[*account.Accounts]
+	committee             *epochstore.Store[*account.SeatedAccounts]
 }
 
 func New(dbConfig database.Config, apiProvider iotago.APIProvider, errorHandler func(error), opts ...options.Option[BucketManager]) *Prunable {
@@ -69,8 +69,8 @@ func New(dbConfig database.Config, apiProvider iotago.APIProvider, errorHandler
 			kvstore.Realm{epochPrefixCommittee},
 			semiPermanentDB.KVStore(),
 			rewardPruningDelayFunc,
-			(*account.Accounts).Bytes,
-			account.AccountsFromBytes,
+			(*account.SeatedAccounts).Bytes,
+			account.SeatedAccountsFromBytes,
 		),
 	}
 }
diff --git a/pkg/storage/prunable/prunable_epoch.go b/pkg/storage/prunable/prunable_epoch.go
index f0e2d695..4d041237 100644
--- a/pkg/storage/prunable/prunable_epoch.go
+++ b/pkg/storage/prunable/prunable_epoch.go
@@ -35,6 +35,6 @@ func (p *Prunable) DecidedUpgradeSignals() *epochstore.Store[model.VersionAndHas
 	return p.decidedUpgradeSignals
 }
 
-func (p *Prunable) Committee() *epochstore.Store[*account.Accounts] {
+func (p *Prunable) Committee() *epochstore.Store[*account.SeatedAccounts] {
 	return p.committee
 }
diff --git a/pkg/storage/storage_prunable.go b/pkg/storage/storage_prunable.go
index 08c749c8..9bd2662d 100644
--- a/pkg/storage/storage_prunable.go
+++ b/pkg/storage/storage_prunable.go
@@ -26,7 +26,7 @@ func (s *Storage) DecidedUpgradeSignals() *epochstore.Store[model.VersionAndHash
 	return s.prunable.DecidedUpgradeSignals()
 }
 
-func (s *Storage) Committee() *epochstore.Store[*account.Accounts] {
+func (s *Storage) Committee() *epochstore.Store[*account.SeatedAccounts] {
 	return s.prunable.Committee()
 }
 


Test patch:
diff --git a/pkg/core/account/accounts_test.go b/pkg/core/account/accounts_test.go
index ad420a58..9a3e8381 100644
--- a/pkg/core/account/accounts_test.go
+++ b/pkg/core/account/accounts_test.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/stretchr/testify/require"
 
+	"github.com/iotaledger/hive.go/lo"
 	"github.com/iotaledger/iota-core/pkg/core/account"
 	iotago "github.com/iotaledger/iota.go/v4"
 	"github.com/iotaledger/iota.go/v4/tpkg"
@@ -20,13 +21,11 @@ func TestAccounts(t *testing.T) {
 
 	// check "Set"
 	for id, stake := range issuers {
-		if err := accounts.Set(id, &account.Pool{
-			PoolStake:      iotago.BaseToken(stake),
+		require.NoError(t, accounts.Set(id, &account.Pool{
+			PoolStake:      stake,
 			ValidatorStake: iotago.BaseToken(stake) * 2,
 			FixedCost:      iotago.Mana(stake) * 3,
-		}); err != nil {
-			t.Fatal(err)
-		}
+		}))
 	}
 
 	// check "Size"
@@ -57,13 +56,13 @@ func TestAccounts(t *testing.T) {
 		require.True(t, accounts.Has(id))
 
 		// check "Get"
-		account, exists := accounts.Get(id)
+		member, exists := accounts.Get(id)
 		require.True(t, exists)
 
 		// check the account itself
-		require.Equal(t, stake, account.PoolStake)
-		require.Equal(t, stake*2, account.ValidatorStake)
-		require.Equal(t, iotago.Mana(stake)*3, account.FixedCost)
+		require.Equal(t, stake, member.PoolStake)
+		require.Equal(t, stake*2, member.ValidatorStake)
+		require.Equal(t, iotago.Mana(stake)*3, member.FixedCost)
 	}
 
 	// check total stakes
@@ -74,11 +73,11 @@ func TestAccounts(t *testing.T) {
 	account1, exists := accounts.Get(accountIDs[0])
 	require.True(t, exists)
 
-	accounts.Set(accountIDs[0], &account.Pool{
+	require.NoError(t, accounts.Set(accountIDs[0], &account.Pool{
 		PoolStake:      10 * account1.PoolStake,
 		ValidatorStake: 10 * account1.ValidatorStake,
 		FixedCost:      10 * account1.FixedCost,
-	})
+	}))
 
 	// check if the updated total stakes are correct
 	require.Equal(t, (totalStake-account1.PoolStake)+(account1.PoolStake*10), accounts.TotalStake())
@@ -107,12 +106,8 @@ func TestAccounts(t *testing.T) {
 
 	// check "SelectCommittee"
 
-	// get 1 issuer
-	seated := accounts.SeatedAccounts(accountIDs[0])
-	require.Equal(t, 1, seated.SeatCount())
-
 	// get all issuers
-	seated = accounts.SeatedAccounts(accountIDs...)
+	seated := accounts.SeatedAccounts()
 	require.Equal(t, len(accountIDs), seated.SeatCount())
 
 	/*
@@ -124,6 +119,74 @@ func TestAccounts(t *testing.T) {
 	*/
 }
 
+func TestAccounts_SeatedAccounts(t *testing.T) {
+	committeeSize := 20
+
+	prevCommitteeIssuers, _ := generateAccounts(committeeSize)
+	newCommitteeIssuers, _ := generateAccounts(committeeSize/2 - 1)
+
+	newCommitteeAccounts := account.NewAccounts()
+	prevCommitteeAccounts := account.NewAccounts()
+
+	idx := 0
+	for id, stake := range prevCommitteeIssuers {
+		// half of the accounts from the previous committee should also be added to the new committee
+		if idx%2 == 0 || idx == 1 {
+			require.NoError(t, newCommitteeAccounts.Set(id, &account.Pool{
+				PoolStake:      stake,
+				ValidatorStake: iotago.BaseToken(stake) * 2,
+				FixedCost:      iotago.Mana(stake) * 3,
+			}))
+		}
+
+		require.NoError(t, prevCommitteeAccounts.Set(id, &account.Pool{
+			PoolStake:      stake,
+			ValidatorStake: iotago.BaseToken(stake) * 2,
+			FixedCost:      iotago.Mana(stake) * 3,
+		}))
+
+		idx++
+	}
+
+	// Add remaining accounts to new committee accounts.
+	for id, stake := range newCommitteeIssuers {
+		// half of the accounts from the previous committee should also be added to the new committee
+		require.NoError(t, newCommitteeAccounts.Set(id, &account.Pool{
+			PoolStake:      stake,
+			ValidatorStake: iotago.BaseToken(stake) * 2,
+			FixedCost:      iotago.Mana(stake) * 3,
+		}))
+	}
+
+	// Get prev committee and assign seats by default.
+	prevCommittee := prevCommitteeAccounts.SeatedAccounts()
+
+	// New committee seats should be assigned taking previous committee into account.
+	newCommittee := newCommitteeAccounts.SeatedAccounts(prevCommittee)
+
+	prevCommitteeAccounts.ForEach(func(id iotago.AccountID, _ *account.Pool) bool {
+		if seatIndex, exists := newCommittee.GetSeat(id); exists {
+			require.Equal(t, lo.Return1(prevCommittee.GetSeat(id)), seatIndex)
+		}
+
+		return true
+	})
+
+	// Make sure that the size of the committee and SeatIndex values are sane.
+	require.Equal(t, newCommittee.SeatCount(), committeeSize)
+
+	// Check that SeatIndices are within <0; committeeSize) range.
+	newCommitteeAccounts.ForEach(func(id iotago.AccountID, _ *account.Pool) bool {
+		// SeatIndex must be smaller than CommitteeSize.
+		require.Less(t, int(lo.Return1(newCommittee.GetSeat(id))), committeeSize)
+
+		// SeatIndex must be bigger or equal to 0.
+		require.GreaterOrEqual(t, int(lo.Return1(newCommittee.GetSeat(id))), 0)
+
+		return true
+	})
+}
+
 func generateAccounts(count int) (map[iotago.AccountID]iotago.BaseToken, iotago.BaseToken) {
 	seenIDs := make(map[iotago.AccountID]bool)
 	issuers := make(map[iotago.AccountID]iotago.BaseToken)
@@ -131,7 +194,7 @@ func generateAccounts(count int) (map[iotago.AccountID]iotago.BaseToken, iotago.
 	var totalStake iotago.BaseToken
 
 	for i := 0; i < count; i++ {
-		id := iotago.AccountID([32]byte{tpkg.RandByte()})
+		id := iotago.AccountID(tpkg.Rand32ByteArray())
 		if _, exist := seenIDs[id]; exist {
 			i--
 			continue
diff --git a/pkg/protocol/engine/attestation/slotattestation/testframework_test.go b/pkg/protocol/engine/attestation/slotattestation/testframework_test.go
index 3bd3b193..517afad9 100644
--- a/pkg/protocol/engine/attestation/slotattestation/testframework_test.go
+++ b/pkg/protocol/engine/attestation/slotattestation/testframework_test.go
@@ -58,15 +58,13 @@ func NewTestFramework(test *testing.T) *TestFramework {
 
 	committeeFunc := func(index iotago.SlotIndex) (*account.SeatedAccounts, bool) {
 		accounts := account.NewAccounts()
-		var members []iotago.AccountID
 		t.issuerByAlias.ForEach(func(alias string, issuer *issuer) bool {
 			if err := accounts.Set(issuer.accountID, &account.Pool{}); err != nil { // we don't care about pools with PoA
 				test.Fatal(err)
 			}
-			members = append(members, issuer.accountID)
 			return true
 		})
-		return accounts.SeatedAccounts(members...), true
+		return accounts.SeatedAccounts(), true
 	}
 
 	t.testAPI = iotago.V3API(
diff --git a/pkg/protocol/engine/consensus/blockgadget/testframework_test.go b/pkg/protocol/engine/consensus/blockgadget/testframework_test.go
index b2ddb517..338c8a87 100644
--- a/pkg/protocol/engine/consensus/blockgadget/testframework_test.go
+++ b/pkg/protocol/engine/consensus/blockgadget/testframework_test.go
@@ -45,7 +45,7 @@ func NewTestFramework(test *testing.T) *TestFramework {
 		T:      test,
 		blocks: shrinkingmap.New[string, *blocks.Block](),
 
-		SeatManager: mock.NewManualPOA(iotago.SingleVersionProvider(tpkg.ZeroCostTestAPI), epochstore.NewStore(kvstore.Realm{}, mapdb.NewMapDB(), func(_ iotago.EpochIndex) iotago.EpochIndex { return 0 }, (*account.Accounts).Bytes, account.AccountsFromBytes)),
+		SeatManager: mock.NewManualPOA(iotago.SingleVersionProvider(tpkg.ZeroCostTestAPI), epochstore.NewStore(kvstore.Realm{}, mapdb.NewMapDB(), func(_ iotago.EpochIndex) iotago.EpochIndex { return 0 }, (*account.SeatedAccounts).Bytes, account.SeatedAccountsFromBytes)),
 	}
 
 	prunableStorage := prunable.New(database.Config{
diff --git a/pkg/protocol/sybilprotection/seatmanager/topstakers/topstakers_test.go b/pkg/protocol/sybilprotection/seatmanager/topstakers/topstakers_test.go
index b4caa4d1..81ae8094 100644
--- a/pkg/protocol/sybilprotection/seatmanager/topstakers/topstakers_test.go
+++ b/pkg/protocol/sybilprotection/seatmanager/topstakers/topstakers_test.go
@@ -31,7 +31,7 @@ func TestTopStakers_InitializeCommittee(t *testing.T) {
 
 	committeeStore := epochstore.NewStore(kvstore.Realm{}, mapdb.NewMapDB(),
 		func(_ iotago.EpochIndex) iotago.EpochIndex { return 0 },
-		(*account.Accounts).Bytes, account.AccountsFromBytes)
+		(*account.SeatedAccounts).Bytes, account.SeatedAccountsFromBytes)
 
 	topStakersSeatManager := &SeatManager{
 		apiProvider:     testAPIProvider,
@@ -41,27 +41,25 @@ func TestTopStakers_InitializeCommittee(t *testing.T) {
 	}
 
 	// Try setting an empty committee.
-	err := topStakersSeatManager.ReuseCommittee(0, account.NewAccounts())
+	_, err := topStakersSeatManager.RotateCommittee(0, accounts.AccountsData{})
 	require.Error(t, err)
 
-	// Create committee for epoch 0
-	initialCommittee := account.NewAccounts()
+	accountsData := accounts.AccountsData{}
+	var initialCommitteeAccountIDs []iotago.AccountID
 	for i := 0; i < 3; i++ {
-		if err := initialCommittee.Set(tpkg.RandAccountID(), &account.Pool{
-			PoolStake:      1900,
-			ValidatorStake: 900,
-			FixedCost:      11,
-		}); err != nil {
-			t.Fatal(err)
-		}
+		accountID := tpkg.RandAccountID()
+		initialCommitteeAccountIDs = append(initialCommitteeAccountIDs, accountID)
+
+		accountsData = append(accountsData, accounts.NewAccountData(accountID, accounts.WithValidatorStake(900), accounts.WithDelegationStake(1000), accounts.WithFixedCost(11)))
+
 	}
 
 	// Set committee for epoch 0.
-	err = topStakersSeatManager.ReuseCommittee(0, initialCommittee)
+
+	_, err = topStakersSeatManager.RotateCommittee(0, accountsData)
 	require.NoError(t, err)
 	weightedSeats, exists := topStakersSeatManager.CommitteeInEpoch(0)
 	require.True(t, exists)
-	initialCommitteeAccountIDs := initialCommittee.IDs()
 
 	// Online committee should be empty.
 	require.True(t, topStakersSeatManager.OnlineCommittee().IsEmpty())
@@ -86,7 +84,7 @@ func TestTopStakers_RotateCommittee(t *testing.T) {
 
 	committeeStore := epochstore.NewStore(kvstore.Realm{}, mapdb.NewMapDB(),
 		func(_ iotago.EpochIndex) iotago.EpochIndex { return 0 },
-		(*account.Accounts).Bytes, account.AccountsFromBytes)
+		(*account.SeatedAccounts).Bytes, account.SeatedAccountsFromBytes)
 
 	s := &SeatManager{
 		apiProvider:     testAPIProvider,
@@ -105,15 +103,20 @@ func TestTopStakers_RotateCommittee(t *testing.T) {
 	var committeeInEpoch0 *account.SeatedAccounts
 	var committeeInEpoch0IDs []iotago.AccountID
 	expectedCommitteeInEpoch0 := account.NewAccounts()
-
+	accountsData := accounts.AccountsData{}
 	// Create committee for epoch 0
 	{
-		addCommitteeMember(t, expectedCommitteeInEpoch0, &account.Pool{PoolStake: 1900, ValidatorStake: 900, FixedCost: 11})
-		addCommitteeMember(t, expectedCommitteeInEpoch0, &account.Pool{PoolStake: 1900, ValidatorStake: 900, FixedCost: 11})
-		addCommitteeMember(t, expectedCommitteeInEpoch0, &account.Pool{PoolStake: 1900, ValidatorStake: 900, FixedCost: 11})
+		accountID := addCommitteeMember(t, expectedCommitteeInEpoch0, &account.Pool{PoolStake: 1900, ValidatorStake: 900, FixedCost: 11})
+		accountsData = append(accountsData, accounts.NewAccountData(accountID, accounts.WithValidatorStake(900), accounts.WithDelegationStake(1000), accounts.WithFixedCost(11)))
+
+		accountID = addCommitteeMember(t, expectedCommitteeInEpoch0, &account.Pool{PoolStake: 1900, ValidatorStake: 900, FixedCost: 11})
+		accountsData = append(accountsData, accounts.NewAccountData(accountID, accounts.WithValidatorStake(900), accounts.WithDelegationStake(1000), accounts.WithFixedCost(11)))
+
+		accountID = addCommitteeMember(t, expectedCommitteeInEpoch0, &account.Pool{PoolStake: 1900, ValidatorStake: 900, FixedCost: 11})
+		accountsData = append(accountsData, accounts.NewAccountData(accountID, accounts.WithValidatorStake(900), accounts.WithDelegationStake(1000), accounts.WithFixedCost(11)))
 
 		// We should be able to set a committee with only 3 members for epoch 0 (this could be set e.g. via the snapshot).
-		err := s.ReuseCommittee(0, expectedCommitteeInEpoch0)
+		_, err := s.RotateCommittee(0, accountsData)
 		require.NoError(t, err)
 
 		// Make sure that the online committee is handled correctly.
@@ -271,9 +274,8 @@ func TestTopStakers_RotateCommittee(t *testing.T) {
 		_, err := s.RotateCommittee(epoch, accountsData)
 		require.Error(t, err)
 
-		// Set reuse of committee manually.
-		expectedCommitteeInEpoch2.SetReused()
-		err = s.ReuseCommittee(epoch, expectedCommitteeInEpoch2)
+		// Reuse committee.
+		_, err = s.ReuseCommittee(epoch-1, epoch)
 		require.NoError(t, err)
 
 		assertCommitteeInEpoch(t, s, testAPI, 3, expectedCommitteeInEpoch2)
@@ -285,8 +287,9 @@ func TestTopStakers_RotateCommittee(t *testing.T) {
 		// Make sure that the committee retrieved from the committee store matches the expected (with reused flag set).
 		loadedCommittee, err := s.committeeStore.Load(epoch)
 		require.NoError(t, err)
+
 		require.True(t, loadedCommittee.IsReused())
-		assertCommittee(t, expectedCommitteeInEpoch2, loadedCommittee.SeatedAccounts(loadedCommittee.IDs()...))
+		assertCommittee(t, expectedCommitteeInEpoch2, loadedCommittee)
 	}
 }
 
diff --git a/pkg/protocol/sybilprotection/sybilprotectionv1/performance/testsuite_test.go b/pkg/protocol/sybilprotection/sybilprotectionv1/performance/testsuite_test.go
index 8ba8c1c8..5175bb08 100644
--- a/pkg/protocol/sybilprotection/sybilprotectionv1/performance/testsuite_test.go
+++ b/pkg/protocol/sybilprotection/sybilprotectionv1/performance/testsuite_test.go
@@ -74,7 +74,7 @@ func (t *TestSuite) InitPerformanceTracker() {
 
 	rewardsStore := epochstore.NewEpochKVStore(kvstore.Realm{}, mapdb.NewMapDB(), pruningDelayFunc)
 	poolStatsStore := epochstore.NewStore(kvstore.Realm{}, mapdb.NewMapDB(), pruningDelayFunc, (*model.PoolsStats).Bytes, model.PoolsStatsFromBytes)
-	committeeStore := epochstore.NewStore(kvstore.Realm{}, mapdb.NewMapDB(), pruningDelayFunc, (*account.Accounts).Bytes, account.AccountsFromBytes)
+	committeeStore := epochstore.NewStore(kvstore.Realm{}, mapdb.NewMapDB(), pruningDelayFunc, (*account.SeatedAccounts).Bytes, account.SeatedAccountsFromBytes)
 	committeeCandidatesStore := epochstore.NewEpochKVStore(kvstore.Realm{}, mapdb.NewMapDB(), pruningDelayFunc)
 
 	t.Instance = NewTracker(
@@ -111,12 +111,12 @@ func (t *TestSuite) Account(alias string, createIfNotExists bool) iotago.Account
 }
 
 func (t *TestSuite) ApplyEpochActions(epoch iotago.EpochIndex, actions map[string]*EpochActions) {
-	committee := account.NewAccounts()
+	committeeAccounts := account.NewAccounts()
 	for alias, action := range actions {
 		action.validate(t.T, t.api)
 
 		accountID := t.Account(alias, true)
-		if err := committee.Set(accountID, &account.Pool{
+		if err := committeeAccounts.Set(accountID, &account.Pool{
 			PoolStake:      action.PoolStake,
 			ValidatorStake: action.ValidatorStake,
 			FixedCost:      action.FixedCost,
@@ -124,8 +124,8 @@ func (t *TestSuite) ApplyEpochActions(epoch iotago.EpochIndex, actions map[strin
 			t.T.Fatal(err)
 		}
 	}
-
-	// Store directly on the committee store, because in actual code the SeatManager is responsible for adding the storage entry.
+	committee := committeeAccounts.SeatedAccounts()
+	// Store directly on the committeeAccounts store, because in actual code the SeatManager is responsible for adding the storage entry.
 	err := t.Instance.committeeStore.Store(epoch, committee)
 	require.NoError(t.T, err)
 	for accIDAlias, action := range actions {
diff --git a/pkg/storage/testframework_test.go b/pkg/storage/testframework_test.go
index 8495409b..89d7aa34 100644
--- a/pkg/storage/testframework_test.go
+++ b/pkg/storage/testframework_test.go
@@ -155,7 +155,7 @@ func (t *TestFramework) GenerateSemiPermanentData(epoch iotago.EpochIndex) {
 	if err := accounts.Set(tpkg.RandAccountID(), &account.Pool{}); err != nil {
 		t.t.Fatal(err)
 	}
-	err = committeeStore.Store(epoch, accounts)
+	err = committeeStore.Store(epoch, accounts.SeatedAccounts())
 	require.NoError(t.t, err)
 	createdBytes += int64(len(lo.PanicOnErr(accounts.Bytes()))) + 8 // for epoch key
 
diff --git a/pkg/tests/committee_rotation_test.go b/pkg/tests/committee_rotation_test.go
index 8317c26d..9a17fe63 100644
--- a/pkg/tests/committee_rotation_test.go
+++ b/pkg/tests/committee_rotation_test.go
@@ -111,6 +111,8 @@ func Test_TopStakersRotation(t *testing.T) {
 			ts.Node("node4").Validator.AccountID,
 			ts.Node("node5").Validator.AccountID,
 		}, ts.Nodes()...)
+
+		ts.AssertReelectedCommitteeSeatIndices(0, 1, ts.Nodes()...)
 	}
 
 	// Do not announce new candidacies for epoch 2 but finalize slots. The committee should be the reused.
@@ -125,6 +127,8 @@ func Test_TopStakersRotation(t *testing.T) {
 			ts.Node("node4").Validator.AccountID,
 			ts.Node("node5").Validator.AccountID,
 		}, ts.Nodes()...)
+
+		ts.AssertReelectedCommitteeSeatIndices(1, 2, ts.Nodes()...)
 	}
 
 	// Do not finalize slots in time for epoch 3. The committee should be the reused. Even though there are candidates.
@@ -149,9 +153,12 @@ func Test_TopStakersRotation(t *testing.T) {
 			ts.Node("node4").Validator.AccountID,
 			ts.Node("node5").Validator.AccountID,
 		}, ts.Nodes()...)
+
+		ts.AssertReelectedCommitteeSeatIndices(2, 3, ts.Nodes()...)
 	}
 
 	// Rotate committee to smaller committee due to too few candidates available.
+	// node3 - SeatIndex(0) as it's the only one
 	{
 		ts.IssueBlocksAtSlots("wave-8:", []iotago.SlotIndex{46, 47, 48, 49, 50, 51, 52, 53, 54, 55}, 4, "wave-7:45.3", ts.Nodes(), true, false)
 
@@ -168,5 +175,51 @@ func Test_TopStakersRotation(t *testing.T) {
 		ts.AssertSybilProtectionCommittee(4, []iotago.AccountID{
 			ts.Node("node3").Validator.AccountID,
 		}, ts.Nodes()...)
+		ts.AssertReelectedCommitteeSeatIndices(3, 4, ts.Nodes()...)
+	}
+
+	// Rotate committee to bigger committee.
+	// node3 - SeatIndex(0) - seat should be retained
+	// node5 - SeatIndex(1)
+	{
+		ts.IssueBlocksAtSlots("wave-9:", []iotago.SlotIndex{62, 63, 64, 65, 66, 67, 68, 69, 70}, 4, "wave-8:61.3", ts.Nodes(), true, false)
+
+		ts.IssueCandidacyAnnouncementInSlot("node3-candidacy:3", 71, "wave-9:70.3", ts.Wallet("node3"))
+		ts.IssueCandidacyAnnouncementInSlot("node5-candidacy:3", 71, "node3-candidacy:3", ts.Wallet("node5"))
+
+		ts.IssueBlocksAtSlots("wave-9:", []iotago.SlotIndex{71, 72, 73, 74, 75, 76, 77, 78, 80}, 4, "node5-candidacy:3", ts.Nodes(), true, false)
+
+		ts.AssertLatestCommitmentSlotIndex(78, ts.Nodes()...)
+		ts.AssertLatestFinalizedSlot(76, ts.Nodes()...)
+		// We finalized at epochEnd-epochNearingThreshold, so the committee should be rotated even if there is just one candidate.
+		ts.AssertSybilProtectionCandidates(4, []iotago.AccountID{
+			ts.Node("node3").Validator.AccountID,
+			ts.Node("node5").Validator.AccountID,
+		}, ts.Nodes()...)
+		ts.AssertSybilProtectionCommittee(5, []iotago.AccountID{
+			ts.Node("node3").Validator.AccountID,
+			ts.Node("node5").Validator.AccountID,
+		}, ts.Nodes()...)
+		ts.AssertReelectedCommitteeSeatIndices(4, 5, ts.Nodes()...)
+	}
+
+	// Rotate committee to smaller committee, where the committee member is re-selected to make sure that the SeatIndex is retained.
+	// Node5 - SeatIndex(1) - it's the only committee member and needs to retain its seat index.
+	{
+		ts.IssueBlocksAtSlots("wave-10:", []iotago.SlotIndex{81, 82, 83, 84, 85, 86, 87}, 4, "wave-9:80.3", ts.Nodes(), true, false)
+
+		ts.IssueCandidacyAnnouncementInSlot("node5-candidacy:4", 88, "wave-10:87.3", ts.Wallet("node5"))
+
+		ts.IssueBlocksAtSlots("wave-10:", []iotago.SlotIndex{88, 89, 90, 91, 92, 93, 94}, 4, "node5-candidacy:4", ts.Nodes(), true, false)
+		ts.AssertLatestCommitmentSlotIndex(92, ts.Nodes()...)
+		ts.AssertLatestFinalizedSlot(91, ts.Nodes()...)
+		// We finalized at epochEnd-epochNearingThreshold, so the committee should be rotated even if there is just one candidate.
+		ts.AssertSybilProtectionCandidates(5, []iotago.AccountID{
+			ts.Node("node5").Validator.AccountID,
+		}, ts.Nodes()...)
+		ts.AssertSybilProtectionCommittee(6, []iotago.AccountID{
+			ts.Node("node5").Validator.AccountID,
+		}, ts.Nodes()...)
+		ts.AssertReelectedCommitteeSeatIndices(5, 6, ts.Nodes()...)
 	}
 }
diff --git a/pkg/tests/out.log b/pkg/tests/out.log
new file mode 100644
index 00000000..46156807
--- /dev/null
+++ b/pkg/tests/out.log
@@ -0,0 +1,689 @@
+Setup TestSuite - Test_TransitionAndDestroyAccount  @  2024-01-17 15:49:35.582732 +0800 +08 m=+0.028464167
+2024-01-17 15:49:35	INFO   	node1.Chains	Main (set=0)
+h.registerCommitment SlotIndex(0) CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0)
+h.registerCommitment SlotIndex(0) CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0) done
+h.registerCommitment SlotIndex(0) CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0)
+h.registerCommitment SlotIndex(0) CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0) done
+h.registerCommitment SlotIndex(0) CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0)
+h.registerCommitment SlotIndex(0) CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0) done
+trackHeaviestCandidates CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments	Root (set=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot0.0	Chain (set=0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot0.0	IsRoot (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot0.0	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot0.0	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot0.0	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0           	ForkingPoint (set=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0           	LatestCommitment (set=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0           	LatestAttestedCommitment (set=Slot0.0)
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0           	LatestProducedCommitment (set=Slot0.0)
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0           	StartEngine (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0           	Engine (set=Engine0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	RootCommitment (set=Commitment {
+    ID: CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 0,
+      "previousCommitmentId": "0x000000000000000000000000000000000000000000000000000000000000000000000000",
+      "rootsId": "0x0000000000000000000000000000000000000000000000000000000000000000",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 0,
+      "previousCommitmentId": "0x000000000000000000000000000000000000000000000000000000000000000000000000",
+      "rootsId": "0x0000000000000000000000000000000000000000000000000000000000000000",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1                    	issued block (blockID=BlockID(block1:1) slot=SlotIndex(1) commitment=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0) latestFinalizedSlot=SlotIndex(0) version=3)
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PreSolidFilter.BlockPreAllowed (block=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockProcessed (block=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	received block (blockID=BlockID(block1:1) commitment=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	block attached (blockID=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(block1:1) parents=[BlockID(Genesis:0)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	waiting for parent (parent=BlockID(Genesis:0) blockID=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	parent solid (parent=BlockID(Genesis:0) blockID=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(block1:1) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG   	block solid (blockID=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Ledger.TransactionAttached (tx=TransactionID(TX1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	MemPool.TransactionSolid (tx=TransactionID(TX1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	SeatManager.BlockProcessed (block=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PostSolidFilter.BlockAllowed (block=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	MemPool.TransactionExecuted (tx=TransactionID(TX1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	SpendDAG.SpenderCreated (conflictID=TransactionID(TX1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	MemPool.TransactionConflicting (tx=TransactionID(TX1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	MemPool.TransactionBooked (tx=TransactionID(TX1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockEnqueued (block=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Booker.BlockBooked (block=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockScheduled (block=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	sent (blockID=BlockID(block1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	issued validation block (blockID=BlockID(chain-block1-0-node1:10) slot=SlotIndex(10) commitment=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0) latestFinalizedSlot=SlotIndex(0) version=3 highestSupportedVersion=3 hash=0xf2ecda2db5ebd5dc131cd7de03fca3ae75532ee39ec5d153b958001cae74ff55)
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PreSolidFilter.BlockPreAllowed (block=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockProcessed (block=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	received block (blockID=BlockID(chain-block1-0-node1:10) commitment=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	block attached (blockID=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(chain-block1-0-node1:10) parents=[BlockID(block1:1)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	waiting for parent (parent=BlockID(block1:1) blockID=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	parent solid (parent=BlockID(block1:1) blockID=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(chain-block1-0-node1:10) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG   	block solid (blockID=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockEnqueued (block=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Booker.BlockBooked (block=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	SeatManager.BlockProcessed (block=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PostSolidFilter.BlockAllowed (block=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockScheduled (block=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreAccepted (block=BlockID(block1:1) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	sent (blockID=BlockID(chain-block1-0-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	SpendDAG.SpenderAccepted (conflictID=TransactionID(TX1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreAccepted (block=BlockID(chain-block1-0-node1:10) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreConfirmed (block=BlockID(block1:1) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreConfirmed (block=BlockID(chain-block1-0-node1:10) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockAccepted (block=BlockID(block1:1) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Clock.AcceptedTimeUpdated (time=2024-01-17 07:16:10.000000001 +0000 UTC slot=SlotIndex(1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	MemPool.TransactionAccepted (tx=TransactionID(TX1:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	issued validation block (blockID=BlockID(chain-block1-1-node1:10) slot=SlotIndex(10) commitment=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0) latestFinalizedSlot=SlotIndex(0) version=3 highestSupportedVersion=3 hash=0xf2ecda2db5ebd5dc131cd7de03fca3ae75532ee39ec5d153b958001cae74ff55)
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PreSolidFilter.BlockPreAllowed (block=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockProcessed (block=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	received block (blockID=BlockID(chain-block1-1-node1:10) commitment=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	block attached (blockID=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(chain-block1-1-node1:10) parents=[BlockID(chain-block1-0-node1:10)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	waiting for parent (parent=BlockID(chain-block1-0-node1:10) blockID=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	parent solid (parent=BlockID(chain-block1-0-node1:10) blockID=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(chain-block1-1-node1:10) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG   	block solid (blockID=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockEnqueued (block=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Booker.BlockBooked (block=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	SeatManager.BlockProcessed (block=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockScheduled (block=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PostSolidFilter.BlockAllowed (block=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	sent (blockID=BlockID(chain-block1-1-node1:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreAccepted (block=BlockID(chain-block1-1-node1:10) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreConfirmed (block=BlockID(chain-block1-1-node1:10) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockAccepted (block=BlockID(chain-block1-0-node1:10) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockConfirmed (block=BlockID(chain-block1-0-node1:10) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Clock.AcceptedTimeUpdated (time=2024-01-17 07:17:40.000000002 +0000 UTC slot=SlotIndex(10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Clock.ConfirmedTimeUpdated (time=2024-01-17 07:17:40.000000002 +0000 UTC slot=SlotIndex(10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	issued validation block (blockID=BlockID(chain-block1-2-node1:11) slot=SlotIndex(11) commitment=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0) latestFinalizedSlot=SlotIndex(0) version=3 highestSupportedVersion=3 hash=0xf2ecda2db5ebd5dc131cd7de03fca3ae75532ee39ec5d153b958001cae74ff55)
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PreSolidFilter.BlockPreAllowed (block=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockProcessed (block=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	received block (blockID=BlockID(chain-block1-2-node1:11) commitment=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	block attached (blockID=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(chain-block1-2-node1:11) parents=[BlockID(chain-block1-1-node1:10)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	waiting for parent (parent=BlockID(chain-block1-1-node1:10) blockID=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	parent solid (parent=BlockID(chain-block1-1-node1:10) blockID=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(chain-block1-2-node1:11) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG   	block solid (blockID=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockEnqueued (block=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Booker.BlockBooked (block=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	SeatManager.BlockProcessed (block=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PostSolidFilter.BlockAllowed (block=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockScheduled (block=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreAccepted (block=BlockID(chain-block1-2-node1:11) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreConfirmed (block=BlockID(chain-block1-2-node1:11) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	sent (blockID=BlockID(chain-block1-2-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockAccepted (block=BlockID(chain-block1-1-node1:10) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockConfirmed (block=BlockID(chain-block1-1-node1:10) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Clock.AcceptedTimeUpdated (time=2024-01-17 07:17:40.000000003 +0000 UTC slot=SlotIndex(10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Clock.ConfirmedTimeUpdated (time=2024-01-17 07:17:40.000000003 +0000 UTC slot=SlotIndex(10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	issued validation block (blockID=BlockID(chain-block1-3-node1:11) slot=SlotIndex(11) commitment=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0) latestFinalizedSlot=SlotIndex(0) version=3 highestSupportedVersion=3 hash=0xf2ecda2db5ebd5dc131cd7de03fca3ae75532ee39ec5d153b958001cae74ff55)
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PreSolidFilter.BlockPreAllowed (block=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockProcessed (block=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	received block (blockID=BlockID(chain-block1-3-node1:11) commitment=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	block attached (blockID=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(chain-block1-3-node1:11) parents=[BlockID(chain-block1-2-node1:11)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	waiting for parent (parent=BlockID(chain-block1-2-node1:11) blockID=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	parent solid (parent=BlockID(chain-block1-2-node1:11) blockID=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG   	unsolid parents (blockID=BlockID(chain-block1-3-node1:11) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG   	block solid (blockID=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockEnqueued (block=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Booker.BlockBooked (block=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	SeatManager.BlockProcessed (block=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	PostSolidFilter.BlockAllowed (block=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreAccepted (block=BlockID(chain-block1-3-node1:11) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockPreConfirmed (block=BlockID(chain-block1-3-node1:11) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Scheduler.BlockScheduled (block=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Blocks             	sent (blockID=BlockID(chain-block1-3-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockAccepted (block=BlockID(chain-block1-2-node1:11) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	BlockGadget.BlockConfirmed (block=BlockID(chain-block1-2-node1:11) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Clock.AcceptedTimeUpdated (time=2024-01-17 07:17:50.000000004 +0000 UTC slot=SlotIndex(11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	Clock.ConfirmedTimeUpdated (time=2024-01-17 07:17:50.000000004 +0000 UTC slot=SlotIndex(11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0            	MemPool.TransactionCommittedSlotUpdated (tx=TransactionID(TX1:1) slot=SlotIndex(1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 1
+	PrevID: CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0)
+	RootsID: 0x634643f34846fb7351219ca8dcf220e9d23f604f74ab2f1200db822a97592aa0
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0x634643f34846fb7351219ca8dcf220e9d23f604f74ab2f1200db822a97592aa0): TangleRoot: 0x126f0eef1fcd59b4984df5fdd91559883d8a6989e1dd5a94c26d4b2b3e8a90db, StateMutationRoot: 0x68febbdc8b052b0277989a2f87a0acb0d52f84930237a9bd29e25395c92f8ce7, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1) acceptedBlocks=[BlockID(block1:1)] roots=Roots(0x634643f34846fb7351219ca8dcf220e9d23f604f74ab2f1200db822a97592aa0): TangleRoot: 0x126f0eef1fcd59b4984df5fdd91559883d8a6989e1dd5a94c26d4b2b3e8a90db, StateMutationRoot: 0x68febbdc8b052b0277989a2f87a0acb0d52f84930237a9bd29e25395c92f8ce7, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot1.0        	created (id=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot1.0        	Parent (set=Slot0.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot0.0        	MainChild (set=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot1.0        	Chain (set=0)
+h.registerCommitment SlotIndex(1) CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1)
+h.registerCommitment SlotIndex(1) CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1) done
+h.registerCommitment SlotIndex(1) CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1)
+h.registerCommitment SlotIndex(1) CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1) done
+h.registerCommitment SlotIndex(1) CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1)
+h.registerCommitment SlotIndex(1) CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1) done
+trackHeaviestCandidates CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot1.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot1.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot1.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot1.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(1))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot1.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 1,
+      "previousCommitmentId": "0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000",
+      "rootsId": "0x634643f34846fb7351219ca8dcf220e9d23f604f74ab2f1200db822a97592aa0",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+new expiry slot SlotIndex(21)
+updateMeasuredSlot SlotIndex(0)
+updateMeasuredSlot SlotIndex(0) done
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	issued validation block (blockID=BlockID(chain-chain-block1-3-node1-0-node1:11) slot=SlotIndex(11) commitment=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1) latestFinalizedSlot=SlotIndex(0) version=3 highestSupportedVersion=3 hash=0xf2ecda2db5ebd5dc131cd7de03fca3ae75532ee39ec5d153b958001cae74ff55)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	PreSolidFilter.BlockPreAllowed (block=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockProcessed (block=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Blocks                     	received block (blockID=BlockID(chain-chain-block1-3-node1-0-node1:11) commitment=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	block attached (blockID=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	unsolid parents (blockID=BlockID(chain-chain-block1-3-node1-0-node1:11) parents=[BlockID(chain-block1-3-node1:11)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	waiting for parent (parent=BlockID(chain-block1-3-node1:11) blockID=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	parent solid (parent=BlockID(chain-block1-3-node1:11) blockID=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	unsolid parents (blockID=BlockID(chain-chain-block1-3-node1-0-node1:11) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG           	block solid (blockID=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Scheduler.BlockEnqueued (block=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Booker.BlockBooked (block=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	SeatManager.BlockProcessed (block=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	PostSolidFilter.BlockAllowed (block=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Scheduler.BlockScheduled (block=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockPreAccepted (block=BlockID(chain-chain-block1-3-node1-0-node1:11) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Blocks                     	sent (blockID=BlockID(chain-chain-block1-3-node1-0-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockPreConfirmed (block=BlockID(chain-chain-block1-3-node1-0-node1:11) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockAccepted (block=BlockID(chain-block1-3-node1:11) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockConfirmed (block=BlockID(chain-block1-3-node1:11) slotCommitmentID=CommitmentID(0x7dedea299f519d970b0a8ba6af46f330bccf15dea7afe2d6ab901fa3df08b7fd00000000:0))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Clock.AcceptedTimeUpdated (time=2024-01-17 07:17:50.000000005 +0000 UTC slot=SlotIndex(11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Clock.ConfirmedTimeUpdated (time=2024-01-17 07:17:50.000000005 +0000 UTC slot=SlotIndex(11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	issued validation block (blockID=BlockID(chain-chain-block1-3-node1-1-node1:11) slot=SlotIndex(11) commitment=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1) latestFinalizedSlot=SlotIndex(0) version=3 highestSupportedVersion=3 hash=0xf2ecda2db5ebd5dc131cd7de03fca3ae75532ee39ec5d153b958001cae74ff55)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	PreSolidFilter.BlockPreAllowed (block=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockProcessed (block=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Blocks                     	received block (blockID=BlockID(chain-chain-block1-3-node1-1-node1:11) commitment=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	block attached (blockID=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	unsolid parents (blockID=BlockID(chain-chain-block1-3-node1-1-node1:11) parents=[BlockID(chain-chain-block1-3-node1-0-node1:11)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	waiting for parent (parent=BlockID(chain-chain-block1-3-node1-0-node1:11) blockID=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	parent solid (parent=BlockID(chain-chain-block1-3-node1-0-node1:11) blockID=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	unsolid parents (blockID=BlockID(chain-chain-block1-3-node1-1-node1:11) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG           	block solid (blockID=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Scheduler.BlockEnqueued (block=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Booker.BlockBooked (block=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	SeatManager.BlockProcessed (block=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	PostSolidFilter.BlockAllowed (block=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Scheduler.BlockScheduled (block=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Blocks                     	sent (blockID=BlockID(chain-chain-block1-3-node1-1-node1:11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockPreAccepted (block=BlockID(chain-chain-block1-3-node1-1-node1:11) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockPreConfirmed (block=BlockID(chain-chain-block1-3-node1-1-node1:11) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockAccepted (block=BlockID(chain-chain-block1-3-node1-0-node1:11) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Clock.AcceptedTimeUpdated (time=2024-01-17 07:17:50.000000006 +0000 UTC slot=SlotIndex(11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Clock.ConfirmedTimeUpdated (time=2024-01-17 07:17:50.000000006 +0000 UTC slot=SlotIndex(11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	SlotGadget.SlotFinalized (slot=SlotIndex(1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockConfirmed (block=BlockID(chain-chain-block1-3-node1-0-node1:11) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	issued validation block (blockID=BlockID(chain-chain-block1-3-node1-2-node1:21) slot=SlotIndex(21) commitment=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1) latestFinalizedSlot=SlotIndex(1) version=3 highestSupportedVersion=3 hash=0xf2ecda2db5ebd5dc131cd7de03fca3ae75532ee39ec5d153b958001cae74ff55)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	PreSolidFilter.BlockPreAllowed (block=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockProcessed (block=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Blocks                     	received block (blockID=BlockID(chain-chain-block1-3-node1-2-node1:21) commitment=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	block attached (blockID=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	unsolid parents (blockID=BlockID(chain-chain-block1-3-node1-2-node1:21) parents=[BlockID(chain-chain-block1-3-node1-1-node1:11)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	waiting for parent (parent=BlockID(chain-chain-block1-3-node1-1-node1:11) blockID=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	parent solid (parent=BlockID(chain-chain-block1-3-node1-1-node1:11) blockID=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	unsolid parents (blockID=BlockID(chain-chain-block1-3-node1-2-node1:21) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG           	block solid (blockID=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Scheduler.BlockEnqueued (block=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Booker.BlockBooked (block=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	SeatManager.BlockProcessed (block=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	PostSolidFilter.BlockAllowed (block=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Scheduler.BlockScheduled (block=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Blocks                     	sent (blockID=BlockID(chain-chain-block1-3-node1-2-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockPreAccepted (block=BlockID(chain-chain-block1-3-node1-2-node1:21) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockPreConfirmed (block=BlockID(chain-chain-block1-3-node1-2-node1:21) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockAccepted (block=BlockID(chain-chain-block1-3-node1-1-node1:11) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Clock.AcceptedTimeUpdated (time=2024-01-17 07:17:50.000000007 +0000 UTC slot=SlotIndex(11))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	issued validation block (blockID=BlockID(chain-chain-block1-3-node1-3-node1:21) slot=SlotIndex(21) commitment=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1) latestFinalizedSlot=SlotIndex(1) version=3 highestSupportedVersion=3 hash=0xf2ecda2db5ebd5dc131cd7de03fca3ae75532ee39ec5d153b958001cae74ff55)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	PreSolidFilter.BlockPreAllowed (block=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockProcessed (block=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Blocks                     	received block (blockID=BlockID(chain-chain-block1-3-node1-3-node1:21) commitment=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	block attached (blockID=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	unsolid parents (blockID=BlockID(chain-chain-block1-3-node1-3-node1:21) parents=[BlockID(chain-chain-block1-3-node1-2-node1:21)])
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	waiting for parent (parent=BlockID(chain-chain-block1-3-node1-2-node1:21) blockID=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	parent solid (parent=BlockID(chain-chain-block1-3-node1-2-node1:21) blockID=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.BlockDAG           	unsolid parents (blockID=BlockID(chain-chain-block1-3-node1-3-node1:21) parents=[])
+2024-01-17 15:49:36	ERROR  	node1.Engine0.BlockDAG           	block solid (blockID=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Scheduler.BlockEnqueued (block=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Booker.BlockBooked (block=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	SeatManager.BlockProcessed (block=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	PostSolidFilter.BlockAllowed (block=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Scheduler.BlockScheduled (block=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Blocks                     	sent (blockID=BlockID(chain-chain-block1-3-node1-3-node1:21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockPreAccepted (block=BlockID(chain-chain-block1-3-node1-3-node1:21) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockPreConfirmed (block=BlockID(chain-chain-block1-3-node1-3-node1:21) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockAccepted (block=BlockID(chain-chain-block1-3-node1-2-node1:21) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	BlockGadget.BlockConfirmed (block=BlockID(chain-chain-block1-3-node1-2-node1:21) slotCommitmentID=CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Clock.AcceptedTimeUpdated (time=2024-01-17 07:19:30.000000008 +0000 UTC slot=SlotIndex(21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	Clock.ConfirmedTimeUpdated (time=2024-01-17 07:19:30.000000008 +0000 UTC slot=SlotIndex(21))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 2
+	PrevID: CommitmentID(0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000:1)
+	RootsID: 0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2) acceptedBlocks=[] roots=Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot2.0        	created (id=CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot2.0        	Parent (set=Slot1.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot1.0        	MainChild (set=Slot2.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot2.0        	Chain (set=0)
+h.registerCommitment SlotIndex(2) CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2)
+h.registerCommitment SlotIndex(2) CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2) done
+h.registerCommitment SlotIndex(2) CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2)
+h.registerCommitment SlotIndex(2) CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2) done
+h.registerCommitment SlotIndex(2) CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2)
+h.registerCommitment SlotIndex(2) CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2) done
+trackHeaviestCandidates CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot2.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot2.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot2.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot2.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot2.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot2.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(2))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot2.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot2.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 2,
+      "previousCommitmentId": "0x3e8c5887309a073da14aeef21d4a0b88ddd05da6cb7ded7e4def28de5821a56e01000000",
+      "rootsId": "0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 3
+	PrevID: CommitmentID(0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000:2)
+	RootsID: 0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3) acceptedBlocks=[] roots=Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot3.0        	created (id=CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot3.0        	Parent (set=Slot2.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot2.0        	MainChild (set=Slot3.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot3.0        	Chain (set=0)
+h.registerCommitment SlotIndex(3) CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3)
+h.registerCommitment SlotIndex(3) CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3) done
+h.registerCommitment SlotIndex(3) CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3)
+h.registerCommitment SlotIndex(3) CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3) done
+h.registerCommitment SlotIndex(3) CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3)
+h.registerCommitment SlotIndex(3) CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3) done
+trackHeaviestCandidates CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot3.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot3.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot3.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot3.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot3.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot3.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(3))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot3.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot3.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 3,
+      "previousCommitmentId": "0xfa3095fa8b903498afd785c0c62033b1faa081dcb70368dd5caa8fcf315216ad02000000",
+      "rootsId": "0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 4
+	PrevID: CommitmentID(0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000:3)
+	RootsID: 0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4) acceptedBlocks=[] roots=Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot4.0        	created (id=CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot4.0        	Parent (set=Slot3.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot3.0        	MainChild (set=Slot4.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot4.0        	Chain (set=0)
+h.registerCommitment SlotIndex(4) CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4)
+h.registerCommitment SlotIndex(4) CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4) done
+h.registerCommitment SlotIndex(4) CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4)
+h.registerCommitment SlotIndex(4) CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4) done
+h.registerCommitment SlotIndex(4) CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4)
+h.registerCommitment SlotIndex(4) CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4) done
+trackHeaviestCandidates CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot4.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot4.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot4.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot4.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot4.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot4.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(4))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot4.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot4.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 4,
+      "previousCommitmentId": "0xc2528a0bd1d5d5d25676379af31a781dfe6eea568db21c70c592ed93b0614f9f03000000",
+      "rootsId": "0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 5
+	PrevID: CommitmentID(0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000:4)
+	RootsID: 0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5) acceptedBlocks=[] roots=Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot5.0        	created (id=CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot5.0        	Parent (set=Slot4.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot4.0        	MainChild (set=Slot5.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot5.0        	Chain (set=0)
+h.registerCommitment SlotIndex(5) CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5)
+h.registerCommitment SlotIndex(5) CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5) done
+h.registerCommitment SlotIndex(5) CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5)
+h.registerCommitment SlotIndex(5) CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5) done
+h.registerCommitment SlotIndex(5) CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5)
+h.registerCommitment SlotIndex(5) CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5) done
+trackHeaviestCandidates CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot5.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot5.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot5.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot5.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot5.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot5.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(5))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot5.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot5.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 5,
+      "previousCommitmentId": "0xf90d2302df4117aa842aa76acffb3dfefd3278527ccc80727e1a638982c18ceb04000000",
+      "rootsId": "0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 6
+	PrevID: CommitmentID(0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000:5)
+	RootsID: 0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6) acceptedBlocks=[] roots=Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot6.0        	created (id=CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot6.0        	Parent (set=Slot5.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot5.0        	MainChild (set=Slot6.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot6.0        	Chain (set=0)
+h.registerCommitment SlotIndex(6) CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6)
+h.registerCommitment SlotIndex(6) CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6) done
+h.registerCommitment SlotIndex(6) CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6)
+h.registerCommitment SlotIndex(6) CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6) done
+h.registerCommitment SlotIndex(6) CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6)
+h.registerCommitment SlotIndex(6) CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6) done
+trackHeaviestCandidates CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot6.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot6.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot6.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot6.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot6.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot6.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(6))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot6.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot6.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 6,
+      "previousCommitmentId": "0x2d4bb74a78afdc7d8650e7e76d8320afd54032f9f4b72432bb283fed6f02fbc305000000",
+      "rootsId": "0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 7
+	PrevID: CommitmentID(0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000:6)
+	RootsID: 0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7) acceptedBlocks=[] roots=Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot7.0        	created (id=CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot7.0        	Parent (set=Slot6.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot6.0        	MainChild (set=Slot7.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot7.0        	Chain (set=0)
+h.registerCommitment SlotIndex(7) CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7)
+h.registerCommitment SlotIndex(7) CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7) done
+h.registerCommitment SlotIndex(7) CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7)
+h.registerCommitment SlotIndex(7) CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7) done
+h.registerCommitment SlotIndex(7) CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7)
+h.registerCommitment SlotIndex(7) CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7) done
+trackHeaviestCandidates CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot7.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot7.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot7.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot7.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot7.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot7.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(7))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot7.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot7.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 7,
+      "previousCommitmentId": "0x73cff33033c3150c3f1c5eb9cf9c71fdd8ed4423cae2603e55299654d32c3a0e06000000",
+      "rootsId": "0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 8
+	PrevID: CommitmentID(0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000:7)
+	RootsID: 0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8) acceptedBlocks=[] roots=Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot8.0        	created (id=CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot8.0        	Parent (set=Slot7.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot7.0        	MainChild (set=Slot8.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot8.0        	Chain (set=0)
+h.registerCommitment SlotIndex(8) CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8)
+h.registerCommitment SlotIndex(8) CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8) done
+h.registerCommitment SlotIndex(8) CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8)
+h.registerCommitment SlotIndex(8) CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8) done
+h.registerCommitment SlotIndex(8) CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8)
+h.registerCommitment SlotIndex(8) CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8) done
+trackHeaviestCandidates CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot8.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot8.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot8.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot8.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot8.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot8.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(8))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot8.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot8.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 8,
+      "previousCommitmentId": "0x6cd65b5e76517902c9841d6d877c0d356dee253c8d81f1617552f550ad3c0dd107000000",
+      "rootsId": "0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 9
+	PrevID: CommitmentID(0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000:8)
+	RootsID: 0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9) acceptedBlocks=[] roots=Roots(0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361): TangleRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x94ea6a72f5202880efec1c092e03fe3c8e9951ea3e26cbce2b388a3fcd6836ad, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot9.0        	created (id=CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot9.0        	Parent (set=Slot8.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot8.0        	MainChild (set=Slot9.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot9.0        	Chain (set=0)
+h.registerCommitment SlotIndex(9) CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9)
+h.registerCommitment SlotIndex(9) CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9) done
+h.registerCommitment SlotIndex(9) CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9)
+h.registerCommitment SlotIndex(9) CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9) done
+h.registerCommitment SlotIndex(9) CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9)
+h.registerCommitment SlotIndex(9) CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9) done
+trackHeaviestCandidates CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot9.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot9.0        	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot9.0        	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot9.0        	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot9.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot9.0        	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(9))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot9.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot9.0        	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 9,
+      "previousCommitmentId": "0x475ea41bcdc2b31c295b20c083e0cda6a7b7c63565d50c96724504cc066bcd3108000000",
+      "rootsId": "0xc52030a8d4d8c01a5729abd42cdf5a4aafa30b13e3ec9de5df5aef9c61811361",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 10
+	PrevID: CommitmentID(0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000:9)
+	RootsID: 0x319a45f0b7a900c83beb8a19943d5c3f73de1d9fae2392919c83b7da2bdac78f
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0x319a45f0b7a900c83beb8a19943d5c3f73de1d9fae2392919c83b7da2bdac78f): TangleRoot: 0xaa05a20993dd2dc022d92fd83db3426cfb1a05596e02d45ee0846ab5de92c08b, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x56e133fa233c33aa3daa065003c389ee26b4924affa4fcea69a947ac58aa8104, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10) acceptedBlocks=[BlockID(chain-block1-1-node1:10) BlockID(chain-block1-0-node1:10)] roots=Roots(0x319a45f0b7a900c83beb8a19943d5c3f73de1d9fae2392919c83b7da2bdac78f): TangleRoot: 0xaa05a20993dd2dc022d92fd83db3426cfb1a05596e02d45ee0846ab5de92c08b, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x56e133fa233c33aa3daa065003c389ee26b4924affa4fcea69a947ac58aa8104, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot10.0       	created (id=CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot10.0       	Parent (set=Slot9.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot9.0        	MainChild (set=Slot10.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot10.0       	Chain (set=0)
+h.registerCommitment SlotIndex(10) CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10)
+h.registerCommitment SlotIndex(10) CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10) done
+h.registerCommitment SlotIndex(10) CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10)
+h.registerCommitment SlotIndex(10) CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10) done
+h.registerCommitment SlotIndex(10) CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10)
+h.registerCommitment SlotIndex(10) CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10) done
+trackHeaviestCandidates CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot10.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot10.0       	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot10.0       	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot10.0       	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot10.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot10.0       	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(10))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot10.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot10.0       	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 10,
+      "previousCommitmentId": "0xfd1d4d9b24837f9f6f46f78ceafaf4054e8f2d2c94487c688a3cb8fb3fcad44209000000",
+      "rootsId": "0x319a45f0b7a900c83beb8a19943d5c3f73de1d9fae2392919c83b7da2bdac78f",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10))
+2024-01-17 15:49:36	TRACE  	node1.Engine0.NotarizationManager	Committing (commitment=Commitment{
+	Index: 11
+	PrevID: CommitmentID(0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000:10)
+	RootsID: 0xb230a8e3d8106343c938887e228398982a5881049ce8df91747d80e6b8c3161c
+	CumulativeWeight: 0
+	RMC: 1
+} roots =Roots(0xb230a8e3d8106343c938887e228398982a5881049ce8df91747d80e6b8c3161c): TangleRoot: 0xbc581e32af1a9fe1867bbf5bce744f2f2d446b8fbda778dc1022e37a4c9d99a8, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x56e133fa233c33aa3daa065003c389ee26b4924affa4fcea69a947ac58aa8104, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.SlotCommitted (commitment=CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11) acceptedBlocks=[BlockID(chain-block1-3-node1:11) BlockID(chain-chain-block1-3-node1-0-node1:11) BlockID(chain-chain-block1-3-node1-1-node1:11) BlockID(chain-block1-2-node1:11)] roots=Roots(0xb230a8e3d8106343c938887e228398982a5881049ce8df91747d80e6b8c3161c): TangleRoot: 0xbc581e32af1a9fe1867bbf5bce744f2f2d446b8fbda778dc1022e37a4c9d99a8, StateMutationRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, StateRoot: 0xd5f45207f9469bac786a7de68bbec6d2a72fc8190591f9705e240bf314537ff5, AccountRoot: 0x56e133fa233c33aa3daa065003c389ee26b4924affa4fcea69a947ac58aa8104, AttestationsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, CommitteeRoot: 0x57e35d84f101637360d994603c90c01f77a4bd4188a52790c6d537711b8cae5f, RewardsRoot: 0x0000000000000000000000000000000000000000000000000000000000000000, ProtocolParametersHash: 0xb65cb9cd13277d19979d10ef5243ed5d63a5c075fd255bcf67944e4efd60654a attestations=[])
+2024-01-17 15:49:36	DEBUG  	node1.Commitments.Slot11.0       	created (id=CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11))
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot11.0       	Parent (set=Slot10.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot10.0       	MainChild (set=Slot11.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot11.0       	Chain (set=0)
+h.registerCommitment SlotIndex(11) CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11)
+h.registerCommitment SlotIndex(11) CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11) done
+h.registerCommitment SlotIndex(11) CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11)
+h.registerCommitment SlotIndex(11) CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11) done
+h.registerCommitment SlotIndex(11) CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11)
+h.registerCommitment SlotIndex(11) CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11) done
+trackHeaviestCandidates CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestCommitment (set=Slot11.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot11.0       	ReplayDroppedBlocks (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot11.0       	IsVerified (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot11.0       	IsAttested (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestAttestedCommitment (set=Slot11.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot11.0       	IsSynced (set=true)
+2024-01-17 15:49:36	TRACE  	node1.Chains.0                   	LatestSyncedSlot (set=SlotIndex(11))
+2024-01-17 15:49:36	DEBUG  	node1.Chains.0                   	LatestProducedCommitment (set=Slot11.0)
+2024-01-17 15:49:36	TRACE  	node1.Commitments.Slot11.0       	ReplayDroppedBlocks (set=false)
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	LatestCommitment (set=Commitment {
+    ID: CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11)
+    Commitment: "{
+      "protocolVersion": 3,
+      "slot": 11,
+      "previousCommitmentId": "0x9d68b47db8183abfcbe60187f29c3c6e95ac044bf62feb420fa35688b9ce7b2f0a000000",
+      "rootsId": "0xb230a8e3d8106343c938887e228398982a5881049ce8df91747d80e6b8c3161c",
+      "cumulativeWeight": "0",
+      "referenceManaCost": "1"
+    }"
+})
+2024-01-17 15:49:36	TRACE  	node1.Engine0                    	NotarizationManager.LatestCommitmentUpdated (commitment=CommitmentID(0xd7983f2331d693616133dedf8e4b3bd29f80b882c014202ca38191294b50a20d0b000000:11))
+Shutting down node node1
+signal: interrupt
+FAIL	github.com/iotaledger/iota-core/pkg/tests	7.261s
diff --git a/pkg/tests/protocol_engine_rollback_test.go b/pkg/tests/protocol_engine_rollback_test.go
index f1424fbb..f3a3b111 100644
--- a/pkg/tests/protocol_engine_rollback_test.go
+++ b/pkg/tests/protocol_engine_rollback_test.go
@@ -183,7 +183,7 @@ func TestProtocol_EngineRollbackFinalization(t *testing.T) {
 		for epoch := 0; epoch <= 2; epoch++ {
 			committeeEpoch, err := newEngine.Storage.Committee().Load(iotago.EpochIndex(epoch))
 			require.NoError(t, err)
-			require.Len(t, committeeEpoch.IDs(), 4)
+			require.Equal(t, 4, committeeEpoch.SeatCount())
 		}
 
 		// Commmittee for the future epoch does not exist.
@@ -377,7 +377,7 @@ func TestProtocol_EngineRollbackNoFinalization(t *testing.T) {
 		for epoch := 0; epoch <= 2; epoch++ {
 			committeeEpoch, err := newEngine.Storage.Committee().Load(iotago.EpochIndex(epoch))
 			require.NoError(t, err)
-			require.Len(t, committeeEpoch.IDs(), 4)
+			require.Equal(t, 4, committeeEpoch.SeatCount())
 		}
 
 		// Commmittee for the future epoch does not exist.
@@ -571,7 +571,7 @@ func TestProtocol_EngineRollbackNoFinalizationLastSlot(t *testing.T) {
 		for epoch := 0; epoch <= 2; epoch++ {
 			committeeEpoch, err := newEngine.Storage.Committee().Load(iotago.EpochIndex(epoch))
 			require.NoError(t, err)
-			require.Len(t, committeeEpoch.IDs(), 4)
+			require.Equal(t, 4, committeeEpoch.SeatCount())
 		}
 
 		// Commmittee for the future epoch does not exist.
@@ -765,7 +765,7 @@ func TestProtocol_EngineRollbackNoFinalizationBeforePointOfNoReturn(t *testing.T
 		for epoch := 0; epoch <= 1; epoch++ {
 			committeeEpoch, err := newEngine.Storage.Committee().Load(iotago.EpochIndex(epoch))
 			require.NoError(t, err)
-			require.Len(t, committeeEpoch.IDs(), 4)
+			require.Equal(t, 4, committeeEpoch.SeatCount())
 		}
 
 		// Committee for the future epoch does not exist.
diff --git a/pkg/testsuite/mock/node.go b/pkg/testsuite/mock/node.go
index 69eed80f..5e4dabdc 100644
--- a/pkg/testsuite/mock/node.go
+++ b/pkg/testsuite/mock/node.go
@@ -385,7 +385,7 @@ func (n *Node) attachEngineLogsWithName(failOnBlockFiltered bool, instance *engi
 		instance.LogTrace("SybilProtection.OnlineCommitteeSeatRemoved", "seat", seat)
 	})
 
-	events.SybilProtection.CommitteeSelected.Hook(func(committee *account.Accounts, epoch iotago.EpochIndex) {
+	events.SybilProtection.CommitteeSelected.Hook(func(committee *account.SeatedAccounts, epoch iotago.EpochIndex) {
 		instance.LogTrace("SybilProtection.CommitteeSelected", "epoch", epoch, "committee", committee.IDs())
 	})
 
diff --git a/pkg/testsuite/sybilprotection.go b/pkg/testsuite/sybilprotection.go
index 187a7d00..57d8e282 100644
--- a/pkg/testsuite/sybilprotection.go
+++ b/pkg/testsuite/sybilprotection.go
@@ -41,6 +41,44 @@ func (t *TestSuite) AssertSybilProtectionCommittee(epoch iotago.EpochIndex, expe
 	}
 }
 
+func (t *TestSuite) AssertReelectedCommitteeSeatIndices(prevEpoch iotago.EpochIndex, newEpoch iotago.EpochIndex, nodes ...*mock.Node) {
+	mustNodes(nodes)
+
+	for _, node := range nodes {
+		t.Eventually(func() error {
+			committeeInPrevEpoch, exists := node.Protocol.Engines.Main.Get().SybilProtection.SeatManager().CommitteeInEpoch(prevEpoch)
+			if !exists {
+				return ierrors.Errorf("AssertReelectedCommitteeSeatIndices: %s: failed to get committee in previous epoch %d", node.Name, prevEpoch)
+			}
+
+			committeeInNewEpoch, exists := node.Protocol.Engines.Main.Get().SybilProtection.SeatManager().CommitteeInEpoch(newEpoch)
+			if !exists {
+				return ierrors.Errorf("AssertReelectedCommitteeSeatIndices: %s: failed to get committee in new epoch %d", node.Name, newEpoch)
+			}
+
+			committeeInPrevEpochAccounts, err := committeeInPrevEpoch.Accounts()
+			if err != nil {
+				return ierrors.Errorf("AssertReelectedCommitteeSeatIndices: %s: failed to get accounts in committee in previous epoch %d: %w", node.Name, prevEpoch, err)
+			}
+
+			var innerErr error
+			committeeInPrevEpochAccounts.ForEach(func(id iotago.AccountID, _ *account.Pool) bool {
+				if seatIndex, memberExists := committeeInNewEpoch.GetSeat(id); memberExists {
+					if seatIndex != lo.Return1(committeeInPrevEpoch.GetSeat(id)) {
+						innerErr = ierrors.Errorf("account %s must have the same SeatIndex in the previous and new epoch committee", id)
+
+						return false
+					}
+				}
+
+				return true
+			})
+
+			return innerErr
+		})
+	}
+}
+
 func (t *TestSuite) AssertSybilProtectionCandidates(epoch iotago.EpochIndex, expectedAccounts []iotago.AccountID, nodes ...*mock.Node) {
 	mustNodes(nodes)
 
diff --git a/tools/docker-network/tests/dockerframework.go b/tools/docker-network/tests/dockerframework.go
index 3c3ac3d3..f31fb032 100644
--- a/tools/docker-network/tests/dockerframework.go
+++ b/tools/docker-network/tests/dockerframework.go
@@ -336,7 +336,7 @@ func (d *DockerTestFramework) CreateAccount(opts ...options.Option[builder.Accou
 
 	// transition to a full account with new Ed25519 address and staking feature
 	accEd25519Addr, accPrivateKey := d.getAddress(iotago.AddressEd25519)
-	accBlockIssuerKey := iotago.Ed25519PublicKeyHashBlockIssuerKeyFromPublicKey(hiveEd25519.PublicKey(accPrivateKey.Public().(ed25519.PublicKey)))
+	accBlockIssuerKey := iotago.Ed25519PublicKeyHashBlockIssuerKeyFromPublicKey(hiveEd25519.PublicKey(accPrivateKey.Public().(hiveEd25519.PublicKey)))
 	accountOutput := options.Apply(builder.NewAccountOutputBuilder(accEd25519Addr, implicitAccountOutput.BaseTokenAmount()),
 		opts, func(b *builder.AccountOutputBuilder) {
 			b.AccountID(accountID).