diff --git a/config/config-docker.yml b/config/config-docker.yml index 058c97c..2f205e0 100644 --- a/config/config-docker.yml +++ b/config/config-docker.yml @@ -10,7 +10,7 @@ btc: rpc-user: rpcuser rpc-pass: rpcpass bbn: - rpc-addr: https://rpc.devnet.babylonchain.io:443 + rpc-addr: https://rpc.devnet.babylonlabs.io:443 timeout: 30s poller: param-polling-interval: 60s diff --git a/config/config-local.yml b/config/config-local.yml index aa1647a..8e95bd5 100644 --- a/config/config-local.yml +++ b/config/config-local.yml @@ -10,7 +10,7 @@ btc: rpc-user: rpcuser rpc-pass: rpcpass bbn: - rpc-addr: https://rpc.devnet.babylonchain.io:443 + rpc-addr: https://rpc.devnet.babylonlabs.io:443 timeout: 30s poller: param-polling-interval: 10s diff --git a/internal/services/events.go b/internal/services/events.go index 84992d8..0c1ad81 100644 --- a/internal/services/events.go +++ b/internal/services/events.go @@ -8,6 +8,7 @@ import ( "time" "github.com/babylonlabs-io/babylon-staking-indexer/internal/types" + "github.com/babylonlabs-io/babylon-staking-indexer/internal/utils" abcitypes "github.com/cometbft/cometbft/abci/types" "github.com/rs/zerolog/log" ) @@ -51,29 +52,19 @@ func (s *Service) StartBbnEventProcessor(ctx context.Context) { // Entry point for processing events func (s *Service) processEvent(ctx context.Context, event BbnEvent) { - switch event.Category { - case BlockCategory: - s.processBbnBlockEvent(ctx, event.Event) - case TxCategory: - s.processBbnTxEvent(ctx, event.Event) - default: - log.Fatal().Msgf("Unknown event category: %s", event.Category) - } -} - -func (s *Service) processBbnTxEvent(ctx context.Context, event abcitypes.Event) { - switch EventTypes(event.Type) { + // Note: We no longer need to check for the event category here. We can directly + // process the event based on its type. + bbnEvent := event.Event + switch EventTypes(bbnEvent.Type) { case EventFinalityProviderCreatedType: - s.processNewFinalityProviderEvent(ctx, event) + log.Debug().Msg("Processing new finality provider event") + s.processNewFinalityProviderEvent(ctx, bbnEvent) case EventFinalityProviderEditedType: - s.processFinalityProviderEditedEvent(ctx, event) - } -} - -func (s *Service) processBbnBlockEvent(ctx context.Context, event abcitypes.Event) { - switch EventTypes(event.Type) { - case EventFinalityProviderStateChangeType: - s.processFinalityProviderStateChangeEvent(ctx, event) + log.Debug().Msg("Processing finality provider edited event") + s.processFinalityProviderEditedEvent(ctx, bbnEvent) + case EventFinalityProviderStatusChange: + log.Debug().Msg("Processing finality provider status change event") + s.processFinalityProviderStateChangeEvent(ctx, bbnEvent) } } @@ -108,7 +99,8 @@ func parseEvent[T any]( // Populate the attribute map from the event's attributes for _, attr := range event.Attributes { - attributeMap[attr.Key] = attr.Value + // Unescape the attribute value + attributeMap[attr.Key] = utils.SafeUnescape(attr.Value) } // Marshal the attributeMap into JSON diff --git a/internal/services/finality-provider.go b/internal/services/finality-provider.go index 6520067..979148a 100644 --- a/internal/services/finality-provider.go +++ b/internal/services/finality-provider.go @@ -8,15 +8,14 @@ import ( "github.com/babylonlabs-io/babylon-staking-indexer/internal/db" "github.com/babylonlabs-io/babylon-staking-indexer/internal/db/model" "github.com/babylonlabs-io/babylon-staking-indexer/internal/types" - "github.com/babylonlabs-io/babylon-staking-indexer/internal/utils/state" bbntypes "github.com/babylonlabs-io/babylon/x/btcstaking/types" abcitypes "github.com/cometbft/cometbft/abci/types" ) const ( - EventFinalityProviderCreatedType EventTypes = "babylon.btcstaking.v1.EventFinalityProviderCreated" - EventFinalityProviderEditedType EventTypes = "babylon.btcstaking.v1.EventFinalityProviderEdited" - EventFinalityProviderStateChangeType EventTypes = "babylon.btcstaking.v1.EventFinalityProviderStateChange" + EventFinalityProviderCreatedType EventTypes = "babylon.btcstaking.v1.EventFinalityProviderCreated" + EventFinalityProviderEditedType EventTypes = "babylon.btcstaking.v1.EventFinalityProviderEdited" + EventFinalityProviderStatusChange EventTypes = "babylon.btcstaking.v1.EventFinalityProviderStatusChange" ) func (s *Service) processNewFinalityProviderEvent( @@ -77,7 +76,7 @@ func (s *Service) processFinalityProviderStateChangeEvent( ctx context.Context, event abcitypes.Event, ) *types.Error { finalityProviderStateChange, err := parseEvent[bbntypes.EventFinalityProviderStatusChange]( - EventFinalityProviderStateChangeType, event, + EventFinalityProviderStatusChange, event, ) if err != nil { return err @@ -86,7 +85,8 @@ func (s *Service) processFinalityProviderStateChangeEvent( return err } - fp, dbErr := s.db.GetFinalityProviderByBtcPk(ctx, finalityProviderStateChange.BtcPk) + // Check FP exists + _, dbErr := s.db.GetFinalityProviderByBtcPk(ctx, finalityProviderStateChange.BtcPk) if dbErr != nil { return types.NewError( http.StatusInternalServerError, @@ -94,16 +94,6 @@ func (s *Service) processFinalityProviderStateChangeEvent( fmt.Errorf("failed to get finality provider by btc public key: %w", dbErr), ) } - if ok := state.IsQualifiedStateForFinalityProviderStateChange(fp.State, finalityProviderStateChange.NewState); !ok { - return types.NewErrorWithMsg( - http.StatusInternalServerError, - types.InternalServiceError, - fmt.Sprintf( - "finality provider state change from %s to %s is not allowed", - fp.State, finalityProviderStateChange.NewState, - ), - ) - } // If all validations pass, update the finality provider state if err := s.db.UpdateFinalityProviderState( diff --git a/internal/types/finaltiy-provider.go b/internal/types/finaltiy-provider.go deleted file mode 100644 index 4a5625f..0000000 --- a/internal/types/finaltiy-provider.go +++ /dev/null @@ -1,31 +0,0 @@ -package types - -import "fmt" - -type FinalityProviderState string - -const ( - FinalityProviderStateActive FinalityProviderState = "active" - ProviderStateStateInactive FinalityProviderState = "inactive" - FinalityProviderStateJailed FinalityProviderState = "jailed" - FinalityProviderStateSlashed FinalityProviderState = "slashed" -) - -func (s FinalityProviderState) String() string { - return string(s) -} - -func FromString(s string) (FinalityProviderState, error) { - switch s { - case "active": - return FinalityProviderStateActive, nil - case "inactive": - return ProviderStateStateInactive, nil - case "jailed": - return FinalityProviderStateJailed, nil - case "slashed": - return FinalityProviderStateSlashed, nil - default: - return "", fmt.Errorf("invalid finality provider state: %s", s) - } -} diff --git a/internal/utils/state/finality-provider-state.go b/internal/utils/state/finality-provider-state.go deleted file mode 100644 index 82bc899..0000000 --- a/internal/utils/state/finality-provider-state.go +++ /dev/null @@ -1,40 +0,0 @@ -package state - -import "github.com/babylonlabs-io/babylon-staking-indexer/internal/types" - -// finalityProviderStateChangeMap maps the current state of a finality provider to -// the states it can transition to -// TODO: This is pending confirmed state transitions from the core team -var finalityProviderStateChangeMap = map[string][]string{ - types.FinalityProviderStateActive.String(): { - types.ProviderStateStateInactive.String(), - types.FinalityProviderStateJailed.String(), - types.FinalityProviderStateSlashed.String(), - }, - types.ProviderStateStateInactive.String(): { - types.FinalityProviderStateActive.String(), - types.FinalityProviderStateJailed.String(), - types.FinalityProviderStateSlashed.String(), - }, - types.FinalityProviderStateJailed.String(): { - types.FinalityProviderStateActive.String(), - types.ProviderStateStateInactive.String(), - types.FinalityProviderStateSlashed.String(), - }, - types.FinalityProviderStateSlashed.String(): {}, -} - -func IsQualifiedStateForFinalityProviderStateChange( - currentState string, newState string, -) bool { - qualifiedStates, ok := finalityProviderStateChangeMap[currentState] - if !ok { - return false - } - for _, state := range qualifiedStates { - if state == newState { - return true - } - } - return false -} diff --git a/internal/utils/utils.go b/internal/utils/utils.go index de68560..8999827 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -2,6 +2,7 @@ package utils import ( "runtime" + "strconv" "strings" "github.com/btcsuite/btcd/chaincfg" @@ -77,3 +78,14 @@ func shortFuncName(fullName string) string { } return fullName } + +// SafeUnescape removes quotes from a string if it is quoted. +// Including the escape character. +func SafeUnescape(s string) string { + unquoted, err := strconv.Unquote(s) + if err != nil { + // Return the original string if unquoting fails + return s + } + return unquoted +}