Merge remote-tracking branch 'origin' into fix/improve-pods-name
This commit is contained in:
commit
01883e6939
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}})
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
@ -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 }}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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},
|
||||||
}}}
|
}}}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue