diff --git a/api/docs/docs.go b/api/docs/docs.go index 58538e44d..fae5293f2 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -1188,6 +1188,32 @@ const docTemplate = `{ } } }, + "/api/v1/vaas/parse": { + "post": { + "description": "Parse a VAA.", + "tags": [ + "Wormscan" + ], + "operationId": "parse-vaa", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/parser.ParseVaaWithStandarizedPropertiesdResponse" + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/v1/vaas/vaa-counts": { "get": { "description": "Returns the total number of VAAs emitted for each blockchain.", @@ -2300,6 +2326,56 @@ const docTemplate = `{ } } }, + "parser.ParseVaaWithStandarizedPropertiesdResponse": { + "type": "object", + "properties": { + "parsedPayload": {}, + "standardizedProperties": { + "$ref": "#/definitions/parser.StandardizedProperties" + } + } + }, + "parser.StandardizedProperties": { + "type": "object", + "properties": { + "amount": { + "type": "string" + }, + "appIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "fee": { + "type": "string" + }, + "feeAddress": { + "type": "string" + }, + "feeChain": { + "$ref": "#/definitions/vaa.ChainID" + }, + "fromAddress": { + "type": "string" + }, + "fromChain": { + "$ref": "#/definitions/vaa.ChainID" + }, + "toAddress": { + "type": "string" + }, + "toChain": { + "$ref": "#/definitions/vaa.ChainID" + }, + "tokenAddress": { + "type": "string" + }, + "tokenChain": { + "$ref": "#/definitions/vaa.ChainID" + } + } + }, "response.Response-address_AddressOverview": { "type": "object", "properties": { diff --git a/api/docs/swagger.json b/api/docs/swagger.json index 7ddc80109..4c72e3267 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -1181,6 +1181,32 @@ } } }, + "/api/v1/vaas/parse": { + "post": { + "description": "Parse a VAA.", + "tags": [ + "Wormscan" + ], + "operationId": "parse-vaa", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/parser.ParseVaaWithStandarizedPropertiesdResponse" + } + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/v1/vaas/vaa-counts": { "get": { "description": "Returns the total number of VAAs emitted for each blockchain.", @@ -2293,6 +2319,56 @@ } } }, + "parser.ParseVaaWithStandarizedPropertiesdResponse": { + "type": "object", + "properties": { + "parsedPayload": {}, + "standardizedProperties": { + "$ref": "#/definitions/parser.StandardizedProperties" + } + } + }, + "parser.StandardizedProperties": { + "type": "object", + "properties": { + "amount": { + "type": "string" + }, + "appIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "fee": { + "type": "string" + }, + "feeAddress": { + "type": "string" + }, + "feeChain": { + "$ref": "#/definitions/vaa.ChainID" + }, + "fromAddress": { + "type": "string" + }, + "fromChain": { + "$ref": "#/definitions/vaa.ChainID" + }, + "toAddress": { + "type": "string" + }, + "toChain": { + "$ref": "#/definitions/vaa.ChainID" + }, + "tokenAddress": { + "type": "string" + }, + "tokenChain": { + "$ref": "#/definitions/vaa.ChainID" + } + } + }, "response.Response-address_AddressOverview": { "type": "object", "properties": { diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml index a680d5c0e..a7a948c14 100644 --- a/api/docs/swagger.yaml +++ b/api/docs/swagger.yaml @@ -350,6 +350,39 @@ definitions: updatedAt: type: string type: object + parser.ParseVaaWithStandarizedPropertiesdResponse: + properties: + parsedPayload: {} + standardizedProperties: + $ref: '#/definitions/parser.StandardizedProperties' + type: object + parser.StandardizedProperties: + properties: + amount: + type: string + appIds: + items: + type: string + type: array + fee: + type: string + feeAddress: + type: string + feeChain: + $ref: '#/definitions/vaa.ChainID' + fromAddress: + type: string + fromChain: + $ref: '#/definitions/vaa.ChainID' + toAddress: + type: string + toChain: + $ref: '#/definitions/vaa.ChainID' + tokenAddress: + type: string + tokenChain: + $ref: '#/definitions/vaa.ChainID' + type: object response.Response-address_AddressOverview: properties: data: @@ -1676,6 +1709,23 @@ paths: description: Internal Server Error tags: - Wormscan + /api/v1/vaas/parse: + post: + description: Parse a VAA. + operationId: parse-vaa + responses: + "200": + description: OK + schema: + $ref: '#/definitions/parser.ParseVaaWithStandarizedPropertiesdResponse' + "400": + description: Bad Request + "404": + description: Not Found + "500": + description: Internal Server Error + tags: + - Wormscan /api/v1/vaas/vaa-counts: get: description: Returns the total number of VAAs emitted for each blockchain. diff --git a/api/handlers/vaa/service.go b/api/handlers/vaa/service.go index 0a9f9b592..1e13d5886 100644 --- a/api/handlers/vaa/service.go +++ b/api/handlers/vaa/service.go @@ -11,6 +11,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/api/response" "github.com/wormhole-foundation/wormhole-explorer/api/types" "github.com/wormhole-foundation/wormhole-explorer/common/client/cache" + vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" "go.uber.org/zap" ) @@ -19,15 +20,17 @@ import ( type Service struct { repo *Repository getCacheFunc cache.CacheGetFunc + parseVaaFunc vaaPayloadParser.ParseVaaFunc logger *zap.Logger } // NewService creates a new VAA Service. -func NewService(r *Repository, getCacheFunc cache.CacheGetFunc, logger *zap.Logger) *Service { +func NewService(r *Repository, getCacheFunc cache.CacheGetFunc, parseVaaFunc vaaPayloadParser.ParseVaaFunc, logger *zap.Logger) *Service { s := Service{ repo: r, getCacheFunc: getCacheFunc, + parseVaaFunc: parseVaaFunc, logger: logger.With(zap.String("module", "VaaService")), } @@ -245,3 +248,26 @@ func (s *Service) discardVaaNotIndexed(ctx context.Context, chain sdk.ChainID, e } return true } + +// ParseVaa parse a vaa payload. +func (s *Service) ParseVaa(ctx context.Context, vaaByte []byte) (vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse, error) { + // unmarshal vaa + vaa, err := sdk.Unmarshal(vaaByte) + if err != nil { + requestID := fmt.Sprintf("%v", ctx.Value("requestid")) + s.logger.Error("error unmarshal vaa to parse", zap.Error(err), zap.String("requestID", requestID)) + return vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse{}, errs.ErrInternalError + } + + // call vaa payload parser api + parsedVaa, err := s.parseVaaFunc(vaa) + if err != nil { + if errors.Is(err, vaaPayloadParser.ErrNotFound) { + return vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse{}, errs.ErrNotFound + } + requestID := fmt.Sprintf("%v", ctx.Value("requestid")) + s.logger.Error("error parse vaa", zap.Error(err), zap.String("requestID", requestID)) + return vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse{}, errs.ErrInternalError + } + return *parsedVaa, nil +} diff --git a/api/internal/config/config.go b/api/internal/config/config.go index 89bbb7e2a..f8cc9db1e 100644 --- a/api/internal/config/config.go +++ b/api/internal/config/config.go @@ -53,6 +53,11 @@ type AppConfig struct { Bucket30Days string BucketInfinite string } + VaaPayloadParser struct { + Enabled bool + URL string + Timeout int64 + } RateLimit struct { Enabled bool // Max number of requests per minute diff --git a/api/main.go b/api/main.go index f4a31ff44..1bef65430 100644 --- a/api/main.go +++ b/api/main.go @@ -39,9 +39,11 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/api/routes/wormscan" rpcApi "github.com/wormhole-foundation/wormhole-explorer/api/rpc" wormscanCache "github.com/wormhole-foundation/wormhole-explorer/common/client/cache" + vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" "github.com/wormhole-foundation/wormhole-explorer/common/dbutil" xlogger "github.com/wormhole-foundation/wormhole-explorer/common/logger" "github.com/wormhole-foundation/wormhole-explorer/common/utils" + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" "go.uber.org/zap" ) @@ -123,6 +125,12 @@ func main() { rootLogger.Info("initializing InfluxDB client") influxCli := newInfluxClient(cfg.Influx.URL, cfg.Influx.Token) + //VaaPayloadParser client + vaaParserFunc, err := NewVaaParserFunc(cfg, rootLogger) + if err != nil { + rootLogger.Fatal("failed to initialize VAA parser", zap.Error(err)) + } + // Set up repositories rootLogger.Info("initializing repositories") addressRepo := address.NewRepository(db.Database, rootLogger) @@ -145,7 +153,7 @@ func main() { // Set up services rootLogger.Info("initializing services") addressService := address.NewService(addressRepo, rootLogger) - vaaService := vaa.NewService(vaaRepo, cache.Get, rootLogger) + vaaService := vaa.NewService(vaaRepo, cache.Get, vaaParserFunc, rootLogger) obsService := observations.NewService(obsRepo, rootLogger) governorService := governor.NewService(governorRepo, rootLogger) infrastructureService := infrastructure.NewService(infrastructureRepo, rootLogger) @@ -313,3 +321,18 @@ func NewRateLimiter(ctx context.Context, cfg *config.AppConfig, logger *zap.Logg return router, nil } + +// NewVaaParserFunc returns a function to parse VAA payload. +func NewVaaParserFunc(cfg *config.AppConfig, logger *zap.Logger) (vaaPayloadParser.ParseVaaFunc, error) { + if cfg.RunMode == config.RunModeDevelopmernt && !cfg.VaaPayloadParser.Enabled { + return func(vaa *sdk.VAA) (*vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse, error) { + return &vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse{}, nil + }, nil + } + vaaPayloadParserClient, err := vaaPayloadParser.NewParserVAAAPIClient(cfg.VaaPayloadParser.Timeout, + cfg.VaaPayloadParser.URL, logger) + if err != nil { + return nil, fmt.Errorf("failed to initialize VAA parser client: %w", err) + } + return vaaPayloadParserClient.ParseVaaWithStandarizedProperties, nil +} diff --git a/api/response/error.go b/api/response/error.go index 42b8278d2..2e24f524d 100644 --- a/api/response/error.go +++ b/api/response/error.go @@ -145,3 +145,21 @@ func NewInvalidQueryParamError(ctx *fiber.Ctx, message string, err error) APIErr Details: []ErrorDetail{detail}, } } + +func NewRequestBodyError(ctx *fiber.Ctx, message string, err error) APIError { + if message == "" { + message = "INVALID BODY" + } + detail := ErrorDetail{ + RequestID: fmt.Sprintf("%v", ctx.Locals("requestid")), + } + if enableStackTrace && err != nil { + detail.StackTrace = fmt.Sprintf("%+v\n", err) + } + return APIError{ + StatusCode: fiber.StatusBadRequest, + Code: InvalidParam, + Message: message, + Details: []ErrorDetail{detail}, + } +} diff --git a/api/routes/wormscan/routes.go b/api/routes/wormscan/routes.go index 0f2b084cf..0a95d482d 100644 --- a/api/routes/wormscan/routes.go +++ b/api/routes/wormscan/routes.go @@ -81,6 +81,7 @@ func RegisterRoutes( vaas.Get("/:chain", vaaCtrl.FindByChain) vaas.Get("/:chain/:emitter", vaaCtrl.FindByEmitter) vaas.Get("/:chain/:emitter/:sequence", vaaCtrl.FindById) + vaas.Post("/parse", vaaCtrl.ParseVaa) // oservations resource observations := api.Group("/observations") diff --git a/api/routes/wormscan/vaa/controller.go b/api/routes/wormscan/vaa/controller.go index 7cb34e1f0..c72dad0ea 100644 --- a/api/routes/wormscan/vaa/controller.go +++ b/api/routes/wormscan/vaa/controller.go @@ -2,11 +2,14 @@ package vaa import ( + "encoding/base64" "strconv" "github.com/gofiber/fiber/v2" + "github.com/pkg/errors" "github.com/wormhole-foundation/wormhole-explorer/api/handlers/vaa" "github.com/wormhole-foundation/wormhole-explorer/api/middleware" + "github.com/wormhole-foundation/wormhole-explorer/api/response" _ "github.com/wormhole-foundation/wormhole-explorer/api/response" // required by swaggo "go.uber.org/zap" ) @@ -207,3 +210,47 @@ func (c *Controller) GetVaaCount(ctx *fiber.Ctx) error { return ctx.JSON(vaas) } + +// ParseVaa godoc +// @Description Parse a VAA. +// @Tags Wormscan +// @ID parse-vaa +// @Success 200 {object} parser.ParseVaaWithStandarizedPropertiesdResponse +// @Failure 400 +// @Failure 404 +// @Failure 500 +// @Router /api/v1/vaas/parse [post] +func (c *Controller) ParseVaa(ctx *fiber.Ctx) error { + + parseVaaBody := struct { + Vaa string `json:"vaa"` + }{} + + err := ctx.BodyParser(&parseVaaBody) + if err != nil { + return response.NewRequestBodyError(ctx, + "invalid vaa request, unable to parse", + errors.WithStack(err)) + } + + if len(parseVaaBody.Vaa) == 0 { + return response.NewRequestBodyError( + ctx, + "invalid vaa request, vaa is empty", + nil) + } + + vaa, err := base64.StdEncoding.DecodeString(parseVaaBody.Vaa) + if err != nil { + return response.NewRequestBodyError(ctx, + "invalid vaa request, vaa is not base64 encoded", + errors.WithStack(err)) + } + + parsedVaa, err := c.srv.ParseVaa(ctx.Context(), vaa) + if err != nil { + return err + } + + return ctx.JSON(parsedVaa) +} diff --git a/parser/parser/parser.go b/common/client/parser/parser.go similarity index 82% rename from parser/parser/parser.go rename to common/client/parser/parser.go index ee15ecf65..934bf6240 100644 --- a/parser/parser/parser.go +++ b/common/client/parser/parser.go @@ -39,6 +39,9 @@ type ParserVAAAPIClient struct { Logger *zap.Logger } +// ParseVaaFunc represent a parse vaa function. +type ParseVaaFunc func(vaa *sdk.VAA) (*ParseVaaWithStandarizedPropertiesdResponse, error) + // NewParserVAAAPIClient create new instances of ParserVAAAPIClient. func NewParserVAAAPIClient(timeout int64, baseURL string, logger *zap.Logger) (ParserVAAAPIClient, error) { if timeout == 0 { @@ -105,6 +108,21 @@ func (c ParserVAAAPIClient) ParsePayload(chainID uint16, address, sequence strin } } +// StandardizedProperties represent a standardized properties. +type StandardizedProperties struct { + AppIds []string `json:"appIds" bson:"appIds"` + FromChain sdk.ChainID `json:"fromChain" bson:"fromChain"` + FromAddress string `json:"fromAddress" bson:"fromAddress"` + ToChain sdk.ChainID `json:"toChain" bson:"toChain"` + ToAddress string `json:"toAddress" bson:"toAddress"` + TokenChain sdk.ChainID `json:"tokenChain" bson:"tokenChain"` + TokenAddress string `json:"tokenAddress" bson:"tokenAddress"` + Amount string `json:"amount" bson:"amount"` + FeeAddress string `json:"feeAddress" bson:"feeAddress"` + FeeChain sdk.ChainID `json:"feeChain" bson:"feeChain"` + Fee string `json:"fee" bson:"fee"` +} + // ParseVaaWithStandarizedPropertiesdResponse represent a parse vaa response. type ParseVaaWithStandarizedPropertiesdResponse struct { ParsedPayload interface{} `json:"parsedPayload"` diff --git a/parser/parser/parser_test.go b/common/client/parser/parser_test.go similarity index 100% rename from parser/parser/parser_test.go rename to common/client/parser/parser_test.go diff --git a/deploy/api/api-service.yaml b/deploy/api/api-service.yaml index 7ecc416bf..19139134d 100644 --- a/deploy/api/api-service.yaml +++ b/deploy/api/api-service.yaml @@ -103,6 +103,12 @@ spec: value: "60" - name: WORMSCAN_PPROF_ENABLED value: "{{ .WORMSCAN_PPROF_ENABLED }}" + - name: WORMSCAN_VAAPAYLOADPARSER_URL + value: {{ .WORMSCAN_VAAPAYLOADPARSER_URL }} + - name: WORMSCAN_VAAPAYLOADPARSER_TIMEOUT + value: "{{ .WORMSCAN_VAAPAYLOADPARSER_TIMEOUT }}" + - name: WORMSCAN_VAAPAYLOADPARSER_ENABLED + value: "{{ .WORMSCAN_VAAPAYLOADPARSER_ENABLED }}" - name: WORMSCAN_INFLUX_URL valueFrom: configMapKeyRef: diff --git a/deploy/api/env/production-mainnet.env b/deploy/api/env/production-mainnet.env index c28e1288d..bfec296a7 100644 --- a/deploy/api/env/production-mainnet.env +++ b/deploy/api/env/production-mainnet.env @@ -17,3 +17,6 @@ ALB_GROUP_NAME=wormscan-group ALB_SSL_CERT= WORMSCAN_RATELIMIT_ENABLED=true WORMSCAN_RATELIMIT_MAX=1000 +WORMSCAN_VAAPAYLOADPARSER_URL= +WORMSCAN_VAAPAYLOADPARSER_TIMEOUT=10 +WORMSCAN_VAAPAYLOADPARSER_ENABLED=true diff --git a/deploy/api/env/production-testnet.env b/deploy/api/env/production-testnet.env index 72aec8110..ea22274c8 100644 --- a/deploy/api/env/production-testnet.env +++ b/deploy/api/env/production-testnet.env @@ -16,4 +16,7 @@ HOSTNAME=api.testnet.wormholescan.io ALB_GROUP_NAME=wormscan-group-production-testing ALB_SSL_CERT= WORMSCAN_RATELIMIT_ENABLED=true -WORMSCAN_RATELIMIT_MAX=100 \ No newline at end of file +WORMSCAN_RATELIMIT_MAX=100 +WORMSCAN_VAAPAYLOADPARSER_URL= +WORMSCAN_VAAPAYLOADPARSER_TIMEOUT=10 +WORMSCAN_VAAPAYLOADPARSER_ENABLED=true \ No newline at end of file diff --git a/deploy/api/env/staging-mainnet.env b/deploy/api/env/staging-mainnet.env index 1c4a5ae48..9fe767a54 100644 --- a/deploy/api/env/staging-mainnet.env +++ b/deploy/api/env/staging-mainnet.env @@ -16,4 +16,7 @@ HOSTNAME=api.staging.wormscan.io ALB_GROUP_NAME=wormscan-group-staging ALB_SSL_CERT= WORMSCAN_RATELIMIT_ENABLED=true -WORMSCAN_RATELIMIT_MAX=100 \ No newline at end of file +WORMSCAN_RATELIMIT_MAX=100 +WORMSCAN_VAAPAYLOADPARSER_URL= +WORMSCAN_VAAPAYLOADPARSER_TIMEOUT=10 +WORMSCAN_VAAPAYLOADPARSER_ENABLED=true \ No newline at end of file diff --git a/deploy/api/env/staging-testnet.env b/deploy/api/env/staging-testnet.env index ebe5035d1..2b1b826b8 100644 --- a/deploy/api/env/staging-testnet.env +++ b/deploy/api/env/staging-testnet.env @@ -16,4 +16,7 @@ HOSTNAME=api.testnet.wormscan.io ALB_GROUP_NAME=wormscan-group-test ALB_SSL_CERT= WORMSCAN_RATELIMIT_ENABLED=true -WORMSCAN_RATELIMIT_MAX=100 \ No newline at end of file +WORMSCAN_RATELIMIT_MAX=100 +WORMSCAN_VAAPAYLOADPARSER_URL= +WORMSCAN_VAAPAYLOADPARSER_TIMEOUT=10 +WORMSCAN_VAAPAYLOADPARSER_ENABLED=true \ No newline at end of file diff --git a/parser/cmd/backfiller/run.go b/parser/cmd/backfiller/run.go index af605d10c..174e32847 100644 --- a/parser/cmd/backfiller/run.go +++ b/parser/cmd/backfiller/run.go @@ -5,6 +5,7 @@ import ( "time" "github.com/wormhole-foundation/wormhole-explorer/common/client/alert" + vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" "github.com/wormhole-foundation/wormhole-explorer/common/dbutil" "github.com/wormhole-foundation/wormhole-explorer/common/logger" "github.com/wormhole-foundation/wormhole-explorer/parser/config" @@ -48,7 +49,7 @@ func Run(config *config.BackfillerConfiguration) { logger.Fatal("Failed to connect MongoDB", zap.Error(err)) } - parserVAAAPIClient, err := parser.NewParserVAAAPIClient(config.VaaPayloadParserTimeout, config.VaaPayloadParserURL, logger) + parserVAAAPIClient, err := vaaPayloadParser.NewParserVAAAPIClient(config.VaaPayloadParserTimeout, config.VaaPayloadParserURL, logger) if err != nil { logger.Fatal("Failed to create parse vaa api client") } diff --git a/parser/cmd/service/run.go b/parser/cmd/service/run.go index ab4fbb30d..665287b58 100644 --- a/parser/cmd/service/run.go +++ b/parser/cmd/service/run.go @@ -12,6 +12,7 @@ import ( awsconfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials" "github.com/wormhole-foundation/wormhole-explorer/common/client/alert" + vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" "github.com/wormhole-foundation/wormhole-explorer/common/dbutil" "github.com/wormhole-foundation/wormhole-explorer/common/logger" "github.com/wormhole-foundation/wormhole-explorer/parser/config" @@ -75,7 +76,7 @@ func Run() { metrics := newMetrics(config) // create a parserVAAAPIClient - parserVAAAPIClient, err := parser.NewParserVAAAPIClient(config.VaaPayloadParserTimeout, + parserVAAAPIClient, err := vaaPayloadParser.NewParserVAAAPIClient(config.VaaPayloadParserTimeout, config.VaaPayloadParserURL, logger) if err != nil { logger.Fatal("failed to create parse vaa api client") diff --git a/parser/parser/model.go b/parser/parser/model.go index 9595fbe58..c73a6dda1 100644 --- a/parser/parser/model.go +++ b/parser/parser/model.go @@ -3,34 +3,20 @@ package parser import ( "time" + vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" ) -// StandardizedProperties represent a standardized properties. -type StandardizedProperties struct { - AppIds []string `json:"appIds" bson:"appIds"` - FromChain sdk.ChainID `json:"fromChain" bson:"fromChain"` - FromAddress string `json:"fromAddress" bson:"fromAddress"` - ToChain sdk.ChainID `json:"toChain" bson:"toChain"` - ToAddress string `json:"toAddress" bson:"toAddress"` - TokenChain sdk.ChainID `json:"tokenChain" bson:"tokenChain"` - TokenAddress string `json:"tokenAddress" bson:"tokenAddress"` - Amount string `json:"amount" bson:"amount"` - FeeAddress string `json:"feeAddress" bson:"feeAddress"` - FeeChain sdk.ChainID `json:"feeChain" bson:"feeChain"` - Fee string `json:"fee" bson:"fee"` -} - // ParsedVaaUpdate represent a parsed vaa update. type ParsedVaaUpdate struct { - ID string `bson:"_id" json:"id"` - EmitterChain sdk.ChainID `bson:"emitterChain" json:"emitterChain"` - EmitterAddr string `bson:"emitterAddr" json:"emitterAddr"` - Sequence string `bson:"sequence" json:"sequence"` - AppIDs []string `bson:"appIds" json:"appIds"` - ParsedPayload interface{} `bson:"parsedPayload" json:"parsedPayload"` - RawStandardizedProperties StandardizedProperties `bson:"rawStandardizedProperties" json:"rawStandardizedProperties"` - StandardizedProperties StandardizedProperties `bson:"standardizedProperties" json:"standardizedProperties"` - UpdatedAt *time.Time `bson:"updatedAt" json:"updatedAt"` - Timestamp time.Time `bson:"-" json:"-"` + ID string `bson:"_id" json:"id"` + EmitterChain sdk.ChainID `bson:"emitterChain" json:"emitterChain"` + EmitterAddr string `bson:"emitterAddr" json:"emitterAddr"` + Sequence string `bson:"sequence" json:"sequence"` + AppIDs []string `bson:"appIds" json:"appIds"` + ParsedPayload interface{} `bson:"parsedPayload" json:"parsedPayload"` + RawStandardizedProperties vaaPayloadParser.StandardizedProperties `bson:"rawStandardizedProperties" json:"rawStandardizedProperties"` + StandardizedProperties vaaPayloadParser.StandardizedProperties `bson:"standardizedProperties" json:"standardizedProperties"` + UpdatedAt *time.Time `bson:"updatedAt" json:"updatedAt"` + Timestamp time.Time `bson:"-" json:"-"` } diff --git a/parser/processor/processor.go b/parser/processor/processor.go index 07ed9c534..4b150e600 100644 --- a/parser/processor/processor.go +++ b/parser/processor/processor.go @@ -9,6 +9,7 @@ import ( "time" "github.com/wormhole-foundation/wormhole-explorer/common/client/alert" + vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" "github.com/wormhole-foundation/wormhole-explorer/common/domain" parserAlert "github.com/wormhole-foundation/wormhole-explorer/parser/internal/alert" "github.com/wormhole-foundation/wormhole-explorer/parser/internal/metrics" @@ -18,14 +19,14 @@ import ( ) type Processor struct { - parser parser.ParserVAAAPIClient + parser vaaPayloadParser.ParserVAAAPIClient repository *parser.Repository alert alert.AlertClient metrics metrics.Metrics logger *zap.Logger } -func New(parser parser.ParserVAAAPIClient, repository *parser.Repository, alert alert.AlertClient, metrics metrics.Metrics, logger *zap.Logger) *Processor { +func New(parser vaaPayloadParser.ParserVAAAPIClient, repository *parser.Repository, alert alert.AlertClient, metrics metrics.Metrics, logger *zap.Logger) *Processor { return &Processor{ parser: parser, repository: repository, @@ -51,14 +52,14 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse vaaParseResponse, err := p.parser.ParseVaaWithStandarizedProperties(vaa) if err != nil { // split metrics error not found and others errors. - if errors.Is(err, parser.ErrNotFound) { + if errors.Is(err, vaaPayloadParser.ErrNotFound) { p.metrics.IncVaaPayloadParserNotFoundCount(chainID) } else { p.metrics.IncVaaPayloadParserErrorCount(chainID) } // if error is ErrInternalError or ErrCallEndpoint return error in order to retry. - if errors.Is(err, parser.ErrInternalError) || errors.Is(err, parser.ErrCallEndpoint) { + if errors.Is(err, vaaPayloadParser.ErrInternalError) || errors.Is(err, vaaPayloadParser.ErrCallEndpoint) { // send alert when exists and error calling vaa-payload-parser component. alertContext := alert.AlertContext{ Details: map[string]string{ @@ -122,13 +123,13 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse } // transformStandarizedProperties transform amount and fee amount. -func (p *Processor) transformStandarizedProperties(vaaID string, sp parser.StandardizedProperties) parser.StandardizedProperties { +func (p *Processor) transformStandarizedProperties(vaaID string, sp vaaPayloadParser.StandardizedProperties) vaaPayloadParser.StandardizedProperties { // transform amount. amount := p.transformAmount(sp.TokenChain, sp.TokenAddress, sp.Amount, vaaID) // transform fee amount. feeAmount := p.transformAmount(sp.FeeChain, sp.FeeAddress, sp.Fee, vaaID) // create StandardizedProperties. - return parser.StandardizedProperties{ + return vaaPayloadParser.StandardizedProperties{ AppIds: sp.AppIds, FromChain: sp.FromChain, FromAddress: sp.FromAddress, @@ -202,8 +203,8 @@ func (p *Processor) transformAmount(chainID sdk.ChainID, nativeAddress, amount, } // createStandarizedProperties create a new StandardizedProperties with amount and fee amount transformed. -func createStandarizedProperties(m parser.StandardizedProperties, amount, feeAmount, fromAddress, toAddress, tokenAddress, feeAddress string) parser.StandardizedProperties { - return parser.StandardizedProperties{ +func createStandarizedProperties(m vaaPayloadParser.StandardizedProperties, amount, feeAmount, fromAddress, toAddress, tokenAddress, feeAddress string) vaaPayloadParser.StandardizedProperties { + return vaaPayloadParser.StandardizedProperties{ AppIds: m.AppIds, FromChain: m.FromChain, FromAddress: fromAddress,