Skip to content

Commit

Permalink
Modify parser client to ParseWithMetadata
Browse files Browse the repository at this point in the history
  • Loading branch information
walker-16 committed Jul 7, 2023
1 parent 51d1799 commit bbf0b0b
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 33 deletions.
29 changes: 21 additions & 8 deletions parser/parser/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,27 @@ import (
"time"
)

// ParserMetadata represent a parser metadata.
type ParserMetadata struct {
AppIDs []string `json:"appIds"`
Amount *string `json:"amount"`
TokenChain *uint16 `json:"tokenChain"`
TokenAddress *string `json:"tokenAddress"`
ReceiverChain *uint16 `json:"receiverChain"`
ReceiverAddress *string `json:"receiverAddress"`
Fee *string `json:"fee"`
}

// ParsedVaaUpdate representa a parsedVaa document.
type ParsedVaaUpdate struct {
ID string `bson:"_id"`
EmitterChain uint16 `bson:"emitterChain"`
EmitterAddr string `bson:"emitterAddr"`
Sequence string `bson:"sequence"`
AppID string `bson:"appId"`
Result interface{} `bson:"result"`
UpdatedAt *time.Time `bson:"updatedAt"`
Timestamp time.Time `bson:"-"`
ID string `bson:"_id"`
EmitterChain uint16 `bson:"emitterChain"`
EmitterAddr string `bson:"emitterAddr"`
Sequence string `bson:"sequence"`
AppID string `bson:"appId"`
Result interface{} `bson:"result"`
MetadataRaw ParserMetadata `bson:"metadataRaw"`
Metadata ParserMetadata `bson:"metadata"`
UpdatedAt *time.Time `bson:"updatedAt"`
Timestamp time.Time `bson:"-"`
}
73 changes: 49 additions & 24 deletions parser/parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package parser

import (
"bytes"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
Expand Down Expand Up @@ -106,30 +107,54 @@ func (c ParserVAAAPIClient) ParsePayload(chainID uint16, address, sequence strin

// ParseVaaStandardResponse represent a parse vaa payload and standard fields.
type ParseVaaStandardResponse struct {
ChainID uint16 `json:"chainId"`
EmitterAddress string `json:"address"`
Sequence string `json:"sequence"`
AppID string `json:"appId"`
Result interface{} `json:"result"`
Metadata ParserMetadata `json:"metadata"`
}

// ParseVaa invoke the endpoint to parse a VAA from the VAAParserAPI to get payload and standard fields.
func (c *ParserVAAAPIClient) ParseVaa(vaa *sdk.VAA) (*ParseVaaStandardResponse, error) {
//endpointUrl := fmt.Sprintf("%s/vaas/parse", c.BaseURL)

// vaaBytes, err := vaa.Marshal()
// if err != nil {
// return nil, errors.New("error marshalling vaa")
// }

// body := struct {
// Body string `json: "body"`
// }{
// Body: string(vaaBytes),
// }

// response, err := c.Client.Post(endpointUrl, "application/json", bytes.NewBuffer(body))
// if err != nil {
// c.Logger.Error("error call parse vaa endpoint", zap.Error(err), zap.Uint16("chainID", uint16(vaa.EmitterChain)),
// zap.String("address", vaa.EmitterAddress.String()), zap.Uint64("sequence", vaa.Sequence))
// return nil, ErrCallEndpoint
// }
// defer response.Body.Close()

return nil, nil
type ParserMetadata struct {
AppIDs []string `json:"appIds"`
Amount *string `json:"amount"`
TokenChain *uint16 `json:"tokenChain"`
TokenAddress *string `json:"tokenAddress"`
ReceiverChain *uint16 `json:"receiverChain"`
ReceiverAddress *string `json:"receiverAddress"`
Fee *string `json:"fee"`
}

// ParseVaaWithMetadata invoke the endpoint to parse a VAA from the VAAParserAPI to get payload and metadata fields.
func (c *ParserVAAAPIClient) ParseVaaWithMetadata(vaa *sdk.VAA) (*ParseVaaStandardResponse, error) {
endpointUrl := fmt.Sprintf("%s/vaas/parse", c.BaseURL)

vaaBytes, err := vaa.Marshal()
if err != nil {
return nil, errors.New("error marshalling vaa")
}

body := base64.StdEncoding.EncodeToString(vaaBytes)
response, err := c.Client.Post(endpointUrl, "text/html", bytes.NewBuffer([]byte(body)))
if err != nil {
c.Logger.Error("error call parse vaa endpoint", zap.Error(err), zap.Uint16("chainID", uint16(vaa.EmitterChain)),
zap.String("address", vaa.EmitterAddress.String()), zap.Uint64("sequence", vaa.Sequence))
return nil, ErrCallEndpoint
}
defer response.Body.Close()

switch response.StatusCode {
case http.StatusCreated:
var parsedVAA ParseVaaStandardResponse
json.NewDecoder(response.Body).Decode(&parsedVAA)
return &parsedVAA, nil
case http.StatusNotFound:
return nil, ErrNotFound
case http.StatusBadRequest:
return nil, ErrBadRequest
case http.StatusUnprocessableEntity:
return nil, ErrUnproceesableEntity
default:
return nil, ErrInternalError
}
}
20 changes: 19 additions & 1 deletion parser/processor/processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse
sequence := fmt.Sprintf("%d", vaa.Sequence)

p.metrics.IncVaaPayloadParserRequestCount(chainID)
vaaParseResponse, err := p.parser.ParsePayload(chainID, emitterAddress, sequence, vaa.Payload)
vaaParseResponse, err := p.parser.ParseVaaWithMetadata(vaa)
if err != nil {
// split metrics error not found and others errors.
if errors.Is(err, parser.ErrNotFound) {
Expand Down Expand Up @@ -78,6 +78,8 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse
p.metrics.IncVaaPayloadParserSuccessCount(chainID)
p.metrics.IncVaaParsed(chainID)

metadata := transformMetadata(vaaParseResponse.Metadata)

// create ParsedVaaUpdate to upsert.
now := time.Now()
vaaParsed := parser.ParsedVaaUpdate{
Expand All @@ -87,6 +89,8 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse
Sequence: sequence,
AppID: vaaParseResponse.AppID,
Result: vaaParseResponse.Result,
MetadataRaw: vaaParseResponse.Metadata,
Metadata: metadata,
Timestamp: vaa.Timestamp,
UpdatedAt: &now,
}
Expand All @@ -113,3 +117,17 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse
p.logger.Info("parsed VAA was successfully persisted", zap.String("id", vaaParsed.ID))
return &vaaParsed, nil
}

func transformMetadata(metadataRaw parser.ParserMetadata) parser.ParserMetadata {

metadata := parser.ParserMetadata{
AppIDs: metadataRaw.AppIDs,
Amount: metadataRaw.Amount, //
TokenChain: metadataRaw.TokenChain,
TokenAddress: metadataRaw.TokenAddress,
ReceiverChain: metadataRaw.ReceiverChain,
ReceiverAddress: metadataRaw.ReceiverAddress,
Fee: metadataRaw.Fee, //
}
return metadata
}

0 comments on commit bbf0b0b

Please sign in to comment.