status-im/status-go

View on GitHub
services/wallet/walletevent/events.go

Summary

Maintainability
A
0 mins
Test Coverage
B
84%
package walletevent

import (
    "encoding/json"
    "math/big"
    "strings"

    "github.com/ethereum/go-ethereum/common"
)

// EventType type for event types.
type EventType string

// EventType prefix to be used for internal events.
// These events are not forwarded to the client, they are only used
// within status-go.
const InternalEventTypePrefix = "INT-"

func (t EventType) IsInternal() bool {
    return strings.HasPrefix(string(t), InternalEventTypePrefix)
}

// Event is a type for transfer events.
type Event struct {
    Type        EventType        `json:"type"`
    BlockNumber *big.Int         `json:"blockNumber"`
    Accounts    []common.Address `json:"accounts"`
    Message     string           `json:"message"`
    At          int64            `json:"at"`
    ChainID     uint64           `json:"chainId"`
    RequestID   *int             `json:"requestId,omitempty"`
    // For Internal events only, not serialized
    EventParams interface{}
}

func GetPayload[T any](e Event) (*T, error) {
    var payload T
    err := json.Unmarshal([]byte(e.Message), &payload)
    if err != nil {
        return nil, err
    }
    return &payload, nil
}

func ExtractPayload[T any](e Event, payload *T) error {
    return json.Unmarshal([]byte(e.Message), payload)
}