Merge remote-tracking branch 'origin' into fix/improve-pods-name

This commit is contained in:
julian merlo 2024-02-02 08:45:28 -03:00
commit 01883e6939
13 changed files with 1379 additions and 965 deletions

View File

@ -93,7 +93,7 @@ func (r *TokenResolver) GetTransferredTokenByVaa(ctx context.Context, vaa *sdk.V
return nil, nil return nil, nil
} }
token, err := createToken(result.StandardizedProperties, vaa.EmitterChain) token, err := createToken(result, vaa.EmitterChain)
if err != nil { if err != nil {
r.logger.Debug("Creating transferred token", r.logger.Debug("Creating transferred token",
zap.String("vaaId", vaa.MessageID()), zap.String("vaaId", vaa.MessageID()),
@ -104,50 +104,60 @@ func (r *TokenResolver) GetTransferredTokenByVaa(ctx context.Context, vaa *sdk.V
return token, err return token, err
} }
func createToken(s parser.StandardizedProperties, emitterChain sdk.ChainID) (*TransferredToken, error) { func createToken(p *parser.ParseVaaWithStandarizedPropertiesdResponse, emitterChain sdk.ChainID) (*TransferredToken, error) {
if !domain.ChainIdIsValid(s.TokenChain) { if !domain.ChainIdIsValid(p.StandardizedProperties.TokenChain) {
return nil, fmt.Errorf("tokenChain is invalid: %d", s.TokenChain) return nil, fmt.Errorf("tokenChain is invalid: %d", p.StandardizedProperties.TokenChain)
} }
if !domain.ChainIdIsValid(s.ToChain) { if !domain.ChainIdIsValid(p.StandardizedProperties.ToChain) {
return nil, fmt.Errorf("toChain is invalid: %d", s.ToChain) return nil, fmt.Errorf("toChain is invalid: %d", p.StandardizedProperties.ToChain)
} }
if !domain.ChainIdIsValid(emitterChain) { if !domain.ChainIdIsValid(emitterChain) {
return nil, fmt.Errorf("emitterChain is invalid: %d", emitterChain) return nil, fmt.Errorf("emitterChain is invalid: %d", emitterChain)
} }
if s.TokenAddress == "" { if p.StandardizedProperties.TokenAddress == "" {
return nil, errors.New("tokenAddress is empty") return nil, errors.New("tokenAddress is empty")
} }
if s.Amount == "" { if p.StandardizedProperties.Amount == "" {
return nil, errors.New("amount is empty") return nil, errors.New("amount is empty")
} }
address, err := sdk.StringToAddress(s.TokenAddress) addressHex, err := domain.DecodeNativeAddressToHex(p.StandardizedProperties.TokenChain, p.StandardizedProperties.TokenAddress)
if err != nil {
if p.ParsedPayload != nil && p.ParsedPayload.TokenAddress != "" {
addressHex = p.ParsedPayload.TokenAddress
} else {
return nil, fmt.Errorf("cannot decode token with tokenChain [%d] tokenAddress [%s] to hex",
p.StandardizedProperties.TokenChain, p.StandardizedProperties.TokenAddress)
}
}
address, err := sdk.StringToAddress(addressHex)
if err != nil { if err != nil {
return nil, err return nil, err
} }
n := new(big.Int) n := new(big.Int)
n, ok := n.SetString(s.Amount, 10) n, ok := n.SetString(p.StandardizedProperties.Amount, 10)
if !ok { if !ok {
return nil, fmt.Errorf("amount [%s] is not a number", s.Amount) return nil, fmt.Errorf("amount [%s] is not a number", p.StandardizedProperties.Amount)
} }
appId := domain.AppIdUnkonwn appId := domain.AppIdUnkonwn
if len(s.AppIds) > 0 { if len(p.StandardizedProperties.AppIds) > 0 {
appId = s.AppIds[0] appId = p.StandardizedProperties.AppIds[0]
} }
return &TransferredToken{ return &TransferredToken{
AppId: appId, AppId: appId,
FromChain: emitterChain, FromChain: emitterChain,
ToChain: s.ToChain, ToChain: p.StandardizedProperties.ToChain,
TokenAddress: address, TokenAddress: address,
TokenChain: s.TokenChain, TokenChain: p.StandardizedProperties.TokenChain,
Amount: n, Amount: n,
}, nil }, nil
} }

View File

@ -172,6 +172,8 @@ func (r *Repository) matchOperationByTxHash(ctx context.Context, txHash string)
bson.D{{Key: "originTx.nativeTxHash", Value: bson.M{"$eq": txHash}}}, bson.D{{Key: "originTx.nativeTxHash", Value: bson.M{"$eq": txHash}}},
bson.D{{Key: "originTx.attribute.value.originTxHash", Value: bson.M{"$eq": txHashHex}}}, bson.D{{Key: "originTx.attribute.value.originTxHash", Value: bson.M{"$eq": txHashHex}}},
bson.D{{Key: "originTx.attribute.value.originTxHash", Value: bson.M{"$eq": txHash}}}, bson.D{{Key: "originTx.attribute.value.originTxHash", Value: bson.M{"$eq": txHash}}},
bson.D{{Key: "originTx.attribute.value.originTxHash", Value: bson.M{"$eq": qLower}}},
bson.D{{Key: "originTx.attribute.value.originTxHash", Value: bson.M{"$eq": qHigher}}},
bson.D{{Key: "destinationTx.txHash", Value: bson.M{"$eq": txHash}}}, bson.D{{Key: "destinationTx.txHash", Value: bson.M{"$eq": txHash}}},
bson.D{{Key: "destinationTx.txHash", Value: bson.M{"$eq": qLower}}}, bson.D{{Key: "destinationTx.txHash", Value: bson.M{"$eq": qLower}}},
bson.D{{Key: "destinationTx.txHash", Value: bson.M{"$eq": qHigher}}}, bson.D{{Key: "destinationTx.txHash", Value: bson.M{"$eq": qHigher}}},
@ -204,7 +206,10 @@ func (r *Repository) FindAll(ctx context.Context, query OperationQuery) ([]*Oper
} }
// sort // sort
pipeline = append(pipeline, bson.D{{Key: "$sort", Value: bson.D{bson.E{Key: "originTx.timestamp", Value: query.Pagination.GetSortInt()}}}}) pipeline = append(pipeline, bson.D{{Key: "$sort", Value: bson.D{
bson.E{Key: "originTx.timestamp", Value: query.Pagination.GetSortInt()},
bson.E{Key: "_id", Value: -1},
}}})
// Skip initial results // Skip initial results
pipeline = append(pipeline, bson.D{{Key: "$skip", Value: query.Pagination.Skip}}) pipeline = append(pipeline, bson.D{{Key: "$skip", Value: query.Pagination.Skip}})

View File

@ -250,7 +250,7 @@ func (s *Service) discardVaaNotIndexed(ctx context.Context, chain sdk.ChainID, e
} }
// ParseVaa parse a vaa payload. // ParseVaa parse a vaa payload.
func (s *Service) ParseVaa(ctx context.Context, vaaByte []byte) (vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse, error) { func (s *Service) ParseVaa(ctx context.Context, vaaByte []byte) (any, error) {
// unmarshal vaa // unmarshal vaa
vaa, err := sdk.Unmarshal(vaaByte) vaa, err := sdk.Unmarshal(vaaByte)
if err != nil { if err != nil {
@ -263,11 +263,11 @@ func (s *Service) ParseVaa(ctx context.Context, vaaByte []byte) (vaaPayloadParse
parsedVaa, err := s.parseVaaFunc(vaa) parsedVaa, err := s.parseVaaFunc(vaa)
if err != nil { if err != nil {
if errors.Is(err, vaaPayloadParser.ErrNotFound) { if errors.Is(err, vaaPayloadParser.ErrNotFound) {
return vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse{}, errs.ErrNotFound return nil, errs.ErrNotFound
} }
requestID := fmt.Sprintf("%v", ctx.Value("requestid")) requestID := fmt.Sprintf("%v", ctx.Value("requestid"))
s.logger.Error("error parse vaa", zap.Error(err), zap.String("requestID", requestID)) s.logger.Error("error parse vaa", zap.Error(err), zap.String("requestID", requestID))
return vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse{}, errs.ErrInternalError return nil, errs.ErrInternalError
} }
return *parsedVaa, nil return parsedVaa, nil
} }

View File

@ -356,8 +356,8 @@ func NewRateLimiter(ctx context.Context, cfg *config.AppConfig, logger *zap.Logg
// NewVaaParserFunc returns a function to parse VAA payload. // NewVaaParserFunc returns a function to parse VAA payload.
func NewVaaParserFunc(cfg *config.AppConfig, logger *zap.Logger) (vaaPayloadParser.ParseVaaFunc, error) { func NewVaaParserFunc(cfg *config.AppConfig, logger *zap.Logger) (vaaPayloadParser.ParseVaaFunc, error) {
if cfg.RunMode == config.RunModeDevelopmernt && !cfg.VaaPayloadParser.Enabled { if cfg.RunMode == config.RunModeDevelopmernt && !cfg.VaaPayloadParser.Enabled {
return func(vaa *sdk.VAA) (*vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse, error) { return func(vaa *sdk.VAA) (any, error) {
return &vaaPayloadParser.ParseVaaWithStandarizedPropertiesdResponse{}, nil return nil, nil
}, nil }, nil
} }
vaaPayloadParserClient, err := vaaPayloadParser.NewParserVAAAPIClient(cfg.VaaPayloadParser.Timeout, vaaPayloadParserClient, err := vaaPayloadParser.NewParserVAAAPIClient(cfg.VaaPayloadParser.Timeout,
@ -365,5 +365,5 @@ func NewVaaParserFunc(cfg *config.AppConfig, logger *zap.Logger) (vaaPayloadPars
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to initialize VAA parser client: %w", err) return nil, fmt.Errorf("failed to initialize VAA parser client: %w", err)
} }
return vaaPayloadParserClient.ParseVaaWithStandarizedProperties, nil return vaaPayloadParserClient.ParseVaa, nil
} }

View File

@ -31,7 +31,7 @@ func NewController(operationService *operations.Service, logger *zap.Logger) *Co
// @Param address query string false "address of the emitter" // @Param address query string false "address of the emitter"
// @Param txHash query string false "hash of the transaction" // @Param txHash query string false "hash of the transaction"
// @Param page query integer false "page number" // @Param page query integer false "page number"
// @Param size query integer false "page size" // @Param pageSize query integer false "pageSize". Maximum value is 100.
// @Success 200 {object} []OperationResponse // @Success 200 {object} []OperationResponse
// @Failure 400 // @Failure 400
// @Failure 500 // @Failure 500
@ -43,6 +43,11 @@ func (c *Controller) FindAll(ctx *fiber.Ctx) error {
return err return err
} }
// Check pagination max limit
if pagination.Limit > 100 {
return response.NewInvalidParamError(ctx, "pageSize cannot be greater than 100", nil)
}
address := middleware.ExtractAddressFromQueryParams(ctx, c.logger) address := middleware.ExtractAddressFromQueryParams(ctx, c.logger)
txHash, err := middleware.GetTxHash(ctx, c.logger) txHash, err := middleware.GetTxHash(ctx, c.logger)
if err != nil { if err != nil {

View File

@ -40,7 +40,7 @@ type ParserVAAAPIClient struct {
} }
// ParseVaaFunc represent a parse vaa function. // ParseVaaFunc represent a parse vaa function.
type ParseVaaFunc func(vaa *sdk.VAA) (*ParseVaaWithStandarizedPropertiesdResponse, error) type ParseVaaFunc func(vaa *sdk.VAA) (any, error)
// NewParserVAAAPIClient create new instances of ParserVAAAPIClient. // NewParserVAAAPIClient create new instances of ParserVAAAPIClient.
func NewParserVAAAPIClient(timeout int64, baseURL string, logger *zap.Logger) (ParserVAAAPIClient, error) { func NewParserVAAAPIClient(timeout int64, baseURL string, logger *zap.Logger) (ParserVAAAPIClient, error) {
@ -123,9 +123,14 @@ type StandardizedProperties struct {
Fee string `json:"fee" bson:"fee"` Fee string `json:"fee" bson:"fee"`
} }
type ParsedPayload struct {
TokenAddress string `json:"tokenAddress"`
TokenChain int `json:"tokenChain"`
}
// ParseVaaWithStandarizedPropertiesdResponse represent a parse vaa response. // ParseVaaWithStandarizedPropertiesdResponse represent a parse vaa response.
type ParseVaaWithStandarizedPropertiesdResponse struct { type ParseVaaWithStandarizedPropertiesdResponse struct {
ParsedPayload interface{} `json:"parsedPayload"` ParsedPayload *ParsedPayload `json:"parsedPayload"`
StandardizedProperties StandardizedProperties `json:"standardizedProperties"` StandardizedProperties StandardizedProperties `json:"standardizedProperties"`
} }
@ -162,3 +167,37 @@ func (c *ParserVAAAPIClient) ParseVaaWithStandarizedProperties(vaa *sdk.VAA) (*P
return nil, ErrInternalError return nil, ErrInternalError
} }
} }
// ParseVaa invoke the endpoint to parse a VAA from the VAAParserAPI.
func (c *ParserVAAAPIClient) ParseVaa(vaa *sdk.VAA) (any, 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/plain", 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 any
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
}
}

View File

@ -90,7 +90,12 @@ func TranslateEmitterAddress(chainID sdk.ChainID, address string) (string, error
sdk.ChainIDCelo, sdk.ChainIDCelo,
sdk.ChainIDMoonbeam, sdk.ChainIDMoonbeam,
sdk.ChainIDArbitrum, sdk.ChainIDArbitrum,
sdk.ChainIDOptimism: sdk.ChainIDOptimism,
sdk.ChainIDSepolia,
sdk.ChainIDArbitrumSepolia,
sdk.ChainIDBaseSepolia,
sdk.ChainIDOptimismSepolia,
sdk.ChainIDHolesky:
return "0x" + hex.EncodeToString(addressBytes[12:]), nil return "0x" + hex.EncodeToString(addressBytes[12:]), nil
@ -223,7 +228,11 @@ func EncodeTrxHashByChainID(chainID sdk.ChainID, txHash []byte) (string, error)
case sdk.ChainIDWormchain: case sdk.ChainIDWormchain:
//TODO: check if this is correct //TODO: check if this is correct
return hex.EncodeToString(txHash), nil return hex.EncodeToString(txHash), nil
case sdk.ChainIDSepolia: case sdk.ChainIDSepolia,
sdk.ChainIDArbitrumSepolia,
sdk.ChainIDBaseSepolia,
sdk.ChainIDOptimismSepolia,
sdk.ChainIDHolesky:
return hex.EncodeToString(txHash), nil return hex.EncodeToString(txHash), nil
default: default:
return hex.EncodeToString(txHash), fmt.Errorf("unknown chain id: %d", chainID) return hex.EncodeToString(txHash), fmt.Errorf("unknown chain id: %d", chainID)
@ -260,7 +269,12 @@ func DecodeNativeAddressToHex(chainID sdk.ChainID, address string) (string, erro
sdk.ChainIDCelo, sdk.ChainIDCelo,
sdk.ChainIDMoonbeam, sdk.ChainIDMoonbeam,
sdk.ChainIDArbitrum, sdk.ChainIDArbitrum,
sdk.ChainIDOptimism: sdk.ChainIDOptimism,
sdk.ChainIDSepolia,
sdk.ChainIDArbitrumSepolia,
sdk.ChainIDBaseSepolia,
sdk.ChainIDOptimismSepolia,
sdk.ChainIDHolesky:
return address, nil return address, nil

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,20 @@
---
apiVersion: v1
kind: Service
metadata:
name: {{ .NAME }}
namespace: {{ .NAMESPACE }}
labels:
app: {{ .NAME }}
spec:
selector:
app: {{ .NAME }}
ports:
- port: 80
targetPort: 8000
name: {{ .NAME }}
protocol: TCP
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@ -262,3 +279,4 @@ spec:
requests: requests:
memory: {{ .RESOURCES_REQUESTS_MEMORY }} memory: {{ .RESOURCES_REQUESTS_MEMORY }}
cpu: {{ .RESOURCES_REQUESTS_CPU }} cpu: {{ .RESOURCES_REQUESTS_CPU }}

View File

@ -18,7 +18,7 @@ const defaultMaxHealthTimeSeconds = 60
const ( const (
// mainnet p2p config. // mainnet p2p config.
MainNetP2ppNetworkID = "/wormhole/mainnet/2" MainNetP2ppNetworkID = "/wormhole/mainnet/2"
MainNetP2pBootstrap = "/dns4/wormhole-v2-mainnet-bootstrap.xlabs.xyz/udp/8999/quic/p2p/12D3KooWNQ9tVrcb64tw6bNs2CaNrUGPM7yRrKvBBheQ5yCyPHKC,/dns4/wormhole.mcf.rocks/udp/8999/quic/p2p/12D3KooWDZVv7BhZ8yFLkarNdaSWaB43D6UbQwExJ8nnGAEmfHcU,/dns4/wormhole-v2-mainnet-bootstrap.staking.fund/udp/8999/quic/p2p/12D3KooWG8obDX9DNi1KUwZNu9xkGwfKqTp2GFwuuHpWZ3nQruS1" MainNetP2pBootstrap = "/dns4/wormhole-v2-mainnet-bootstrap.xlabs.xyz/udp/8999/quic-v1/p2p/12D3KooWNQ9tVrcb64tw6bNs2CaNrUGPM7yRrKvBBheQ5yCyPHKC,/dns4/wormhole.mcf.rocks/udp/8999/quic-v1/p2p/12D3KooWDZVv7BhZ8yFLkarNdaSWaB43D6UbQwExJ8nnGAEmfHcU,/dns4/wormhole-v2-mainnet-bootstrap.staking.fund/udp/8999/quic-v1/p2p/12D3KooWG8obDX9DNi1KUwZNu9xkGwfKqTp2GFwuuHpWZ3nQruS1"
MainNetP2pPort uint = 8999 MainNetP2pPort uint = 8999
// testnet p2p config. // testnet p2p config.

View File

@ -77,13 +77,32 @@ func Run(db *mongo.Database) error {
return err return err
} }
indexVaaByTimestamp := mongo.IndexModel{ indexVaaByEmitteChainEmitterAddrSequence := mongo.IndexModel{
Keys: bson.D{ Keys: bson.D{
{Key: "emitterChain", Value: 1}, {Key: "emitterChain", Value: 1},
{Key: "emitterAddr", Value: 1}, {Key: "emitterAddr", Value: 1},
{Key: "sequence", Value: 1}, {Key: "sequence", Value: 1},
}} }}
_, err = db.Collection("vaas").Indexes().CreateOne(context.TODO(), indexVaaByTimestamp) _, err = db.Collection("vaas").Indexes().CreateOne(context.TODO(), indexVaaByEmitteChainEmitterAddrSequence)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
indexVaaByTimestampId := mongo.IndexModel{
Keys: bson.D{
{Key: "timestamp", Value: -1},
{Key: "_id", Value: -1},
}}
_, err = db.Collection("vaas").Indexes().CreateOne(context.TODO(), indexVaaByTimestampId)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
indexVaaByTxHash := mongo.IndexModel{
Keys: bson.D{
{Key: "txHash", Value: 1},
}}
_, err = db.Collection("vaas").Indexes().CreateOne(context.TODO(), indexVaaByTxHash)
if err != nil && isNotAlreadyExistsError(err) { if err != nil && isNotAlreadyExistsError(err) {
return err return err
} }
@ -122,6 +141,62 @@ func Run(db *mongo.Database) error {
return err return err
} }
// create index in globaltransactions collection for wormchain nested txHash.
indexGlobalTransactionsByOriginTxInAttribute := mongo.IndexModel{
Keys: bson.D{{Key: "originTx.attribute.value.originTxHash", Value: 1}}}
_, err = db.Collection("globaltransactions").Indexes().CreateOne(context.TODO(), indexGlobalTransactionsByOriginTxInAttribute)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in globaltransactions collection by originTx nativeTxHash.
indexGlobalTransactionsByOriginNativeTxHash := mongo.IndexModel{
Keys: bson.D{{Key: "originTx.nativeTxHash", Value: 1}}}
_, err = db.Collection("globaltransactions").Indexes().CreateOne(context.TODO(), indexGlobalTransactionsByOriginNativeTxHash)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in globaltransactions collection by destination txHash.
indexGlobalTransactionsByDestinationTxHash := mongo.IndexModel{
Keys: bson.D{{Key: "destinationTx.txHash", Value: 1}}}
_, err = db.Collection("globaltransactions").Indexes().CreateOne(context.TODO(), indexGlobalTransactionsByDestinationTxHash)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in globaltransactions collection by timestamp/_id sort.
indexGlobalTransactionsByTimestampAndId := mongo.IndexModel{
Keys: bson.D{{Key: "originTx.timestamp", Value: -1}, {Key: "_id", Value: -1}}}
_, err = db.Collection("globaltransactions").Indexes().CreateOne(context.TODO(), indexGlobalTransactionsByTimestampAndId)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in parsedVaa collection by standardizedProperties toAddress.
indexParsedVaaByStandardizedPropertiesToAddress := mongo.IndexModel{
Keys: bson.D{{Key: "standardizedProperties.toAddress", Value: 1}}}
_, err = db.Collection("parsedVaa").Indexes().CreateOne(context.TODO(), indexParsedVaaByStandardizedPropertiesToAddress)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in parsedVaa collection by parsedPayload tokenAddress.
indexParsedVaaByParsedPayloadTokenAddress := mongo.IndexModel{
Keys: bson.D{{Key: "parsedPayload.tokenAddress", Value: 1}}}
_, err = db.Collection("parsedVaa").Indexes().CreateOne(context.TODO(), indexParsedVaaByParsedPayloadTokenAddress)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in parsedVaa collection by indexedAt.
indexParsedVaaByIndexedAt := mongo.IndexModel{
Keys: bson.D{{Key: "indexedAt", Value: 1}}}
_, err = db.Collection("parsedVaa").Indexes().CreateOne(context.TODO(), indexParsedVaaByIndexedAt)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
return nil return nil
} }

View File

@ -141,9 +141,8 @@ func (m *MigrateSourceChainTx) runComplexMigration(ctx context.Context) error {
m.logger.Error("failed to process vaa", zap.Error(err), zap.String("id", v.ID)) m.logger.Error("failed to process vaa", zap.Error(err), zap.String("id", v.ID))
continue continue
} }
time.Sleep(5 * time.Second) time.Sleep(100 * time.Microsecond)
} }
page++
} }
return nil return nil
} }
@ -277,9 +276,6 @@ func (m *MigrateSourceChainTx) getVaasToMigrate(ctx context.Context, chainID sdk
// add match step by chain // add match step by chain
var matchStage1 bson.D var matchStage1 bson.D
if chainID != sdk.ChainIDUnset { if chainID != sdk.ChainIDUnset {
if chainID == sdk.ChainIDSolana || chainID == sdk.ChainIDAptos {
return []VAASourceChain{}, errors.New("invalid chainID")
}
matchStage1 = bson.D{{Key: "$match", Value: bson.D{ matchStage1 = bson.D{{Key: "$match", Value: bson.D{
{Key: "emitterChain", Value: chainID}, {Key: "emitterChain", Value: chainID},
}}} }}}

View File

@ -11,8 +11,9 @@ import (
) )
type solanaTransactionSignature struct { type solanaTransactionSignature struct {
BlockTime int64 `json:"blockTime"` BlockTime int64 `json:"blockTime"`
Signature string `json:"signature"` Signature string `json:"signature"`
Err interface{} `json:"err"`
} }
type solanaGetTransactionResponse struct { type solanaGetTransactionResponse struct {
@ -32,8 +33,7 @@ type solanaGetTransactionResponse struct {
} `json:"parsed"` } `json:"parsed"`
} `json:"instructions"` } `json:"instructions"`
} `json:"innerInstructions"` } `json:"innerInstructions"`
Err interface{} `json:"err"`
Err []interface{} `json:"err"`
} `json:"meta"` } `json:"meta"`
Transaction struct { Transaction struct {
Message struct { Message struct {
@ -98,7 +98,8 @@ func (a *apiSolana) fetchSolanaTx(
nativeTxHash = sigs[0].Signature nativeTxHash = sigs[0].Signature
} else { } else {
for _, sig := range sigs { for _, sig := range sigs {
if a.timestamp != nil && sig.BlockTime == a.timestamp.Unix() {
if a.timestamp != nil && sig.BlockTime == a.timestamp.Unix() && sig.Err == nil {
nativeTxHash = sig.Signature nativeTxHash = sig.Signature
break break
} }