wormhole-explorer/api/handlers/relays/repository.go

194 lines
7.5 KiB
Go

package relays
import (
"context"
"fmt"
"time"
"github.com/pkg/errors"
errs "github.com/wormhole-foundation/wormhole-explorer/api/internal/errors"
"github.com/wormhole-foundation/wormhole/sdk/vaa"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
)
type Repository struct {
db *mongo.Database
logger *zap.Logger
collections struct {
relays *mongo.Collection
}
}
func NewRepository(db *mongo.Database, logger *zap.Logger) *Repository {
return &Repository{db: db,
logger: logger.With(zap.String("module", "VaaRepository")),
collections: struct {
relays *mongo.Collection
}{
relays: db.Collection("relays"),
},
}
}
func (r *Repository) FindOne(ctx context.Context, q *RelaysQuery) (*RelayDoc, error) {
var response RelayDoc
err := r.collections.relays.FindOne(ctx, q.toBSON()).Decode(&response)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
return nil, errs.ErrNotFound
}
requestID := fmt.Sprintf("%v", ctx.Value("requestid"))
r.logger.Error("failed execute FindOne command to get relays",
zap.Error(err), zap.Any("q", q), zap.String("requestID", requestID))
return nil, errors.WithStack(err)
}
return &response, nil
}
type RelaysQuery struct {
chainId vaa.ChainID
emitter string
sequence string
}
type RelayDoc struct {
ID string `bson:"_id"`
Data struct {
Status string `bson:"status"`
ReceivedAt time.Time `bson:"receivedAt"`
CompletedAt *time.Time `bson:"completedAt"`
ToTxHash *string `bson:"toTxHash"`
Metadata *struct {
Attempts int `bson:"attempts"`
ExecutionStartTime int64 `bson:"executionStartTime"`
EmitterChain int `bson:"emitterChain"`
DidMatchDeliveryProvider bool `bson:"didMatchDeliveryProvider"`
DidParse bool `bson:"didParse"`
Instructions struct {
EncodedExecutionInfo string `bson:"encodedExecutionInfo"`
RefundAddress string `bson:"refundAddress"`
SourceDeliveryProvider string `bson:"sourceDeliveryProvider"`
SenderAddress string `bson:"senderAddress"`
VaaKeys []any `bson:"vaaKeys"`
ExtraReceiverValue struct {
Hex string `bson:"_hex"`
IsBigNumber bool `bson:"_isBigNumber"`
} `bson:"extraReceiverValue"`
TargetAddress string `bson:"targetAddress"`
RequestedReceiverValue struct {
Hex string `bson:"_hex"`
IsBigNumber bool `bson:"_isBigNumber"`
} `bson:"requestedReceiverValue"`
RefundChainID int `bson:"refundChainId"`
RefundDeliveryProvider string `bson:"refundDeliveryProvider"`
TargetChainID int `bson:"targetChainId"`
} `bson:"instructions"`
DeliveryRecord struct {
MaxRefund string `bson:"maxRefund"`
Budget string `bson:"budget"`
TargetChainAssetPriceUSD float64 `bson:"targetChainAssetPriceUSD"`
WalletNonce int `bson:"walletNonce"`
TransactionHashes []string `bson:"transactionHashes"`
HasAdditionalVaas bool `bson:"hasAdditionalVaas"`
AdditionalVaasDidFetch bool `bson:"additionalVaasDidFetch"`
WalletAcquisitionEndTime int64 `bson:"walletAcquisitionEndTime"`
WalletAcquisitionDidSucceed bool `bson:"walletAcquisitionDidSucceed"`
WalletBalanceAfter string `bson:"walletBalanceAfter"`
ResultLog struct {
TransactionHash string `bson:"transactionHash"`
VaaHash string `bson:"vaaHash"`
RefundStatus string `bson:"refundStatus"`
RevertString string `bson:"revertString"`
Status string `bson:"status"`
GasUsed string `bson:"gasUsed"`
SourceChain string `bson:"sourceChain"`
SourceVaaSequence string `bson:"sourceVaaSequence"`
} `bson:"resultLog"`
ResultString string `bson:"resultString"`
AdditionalVaaKeysPrintable string `bson:"additionalVaaKeysPrintable"`
BudgetUsd float64 `bson:"budgetUsd"`
WalletAcquisitionStartTime int64 `bson:"walletAcquisitionStartTime"`
GasUnitsEstimate int `bson:"gasUnitsEstimate"`
EstimatedTransactionFeeEther string `bson:"estimatedTransactionFeeEther"`
TargetChainDecimals int `bson:"targetChainDecimals"`
DeliveryInstructionsPrintable struct {
Payload string `bson:"payload"`
EncodedExecutionInfo string `bson:"encodedExecutionInfo"`
RefundDeliveryProvider string `bson:"refundDeliveryProvider"`
SourceDeliveryProvider string `bson:"sourceDeliveryProvider"`
SenderAddress string `bson:"senderAddress"`
TargetAddress string `bson:"targetAddress"`
RequestedReceiverValue string `bson:"requestedReceiverValue"`
ExtraReceiverValue string `bson:"extraReceiverValue"`
RefundChainID string `bson:"refundChainId"`
RefundAddress string `bson:"refundAddress"`
VaaKeys []any `bson:"vaaKeys"`
TargetChainID string `bson:"targetChainId"`
} `bson:"deliveryInstructionsPrintable"`
WalletAddress string `bson:"walletAddress"`
GasUsed int `bson:"gasUsed"`
GasPrice string `bson:"gasPrice"`
ReceiverValue string `bson:"receiverValue"`
MaxRefundUsd float64 `bson:"maxRefundUsd"`
GasPriceEstimate string `bson:"gasPriceEstimate"`
TransactionDidSubmit bool `bson:"transactionDidSubmit"`
EstimatedTransactionFee string `bson:"estimatedTransactionFee"`
TransactionSubmitTimeStart int64 `bson:"transactionSubmitTimeStart"`
TransactionSubmitTimeEnd int64 `bson:"transactionSubmitTimeEnd"`
ResultLogDidParse bool `bson:"resultLogDidParse"`
ChainID int `bson:"chainId"`
ReceiverValueUsd float64 `bson:"receiverValueUsd"`
WalletBalanceBefore string `bson:"walletBalanceBefore"`
} `bson:"deliveryRecord"`
RawVaaHex string `bson:"rawVaaHex"`
PayloadType int `bson:"payloadType"`
MaxAttempts int `bson:"maxAttempts"`
DidError bool `bson:"didError"`
ExecutionEndTime int64 `bson:"executionEndTime"`
EmitterAddress string `bson:"emitterAddress"`
DidSubmitTransaction bool `bson:"didSubmitTransaction"`
Sequence string `bson:"sequence"`
} `bson:"metadata"`
Sequence string `bson:"sequence"`
Vaa string `bson:"vaa"`
FromTxHash string `bson:"fromTxHash"`
MaxAttempts int `bson:"maxAttempts"`
AddedTimes int `bson:"addedTimes"`
ErrorMessage any `bson:"errorMessage"`
EmitterChain int `bson:"emitterChain"`
EmitterAddress string `bson:"emitterAddress"`
FailedAt *time.Time `bson:"failedAt"`
} `bson:"data"`
Event string `bson:"event"`
Origin string `bson:"origin"`
}
func (q *RelaysQuery) toBSON() *bson.D {
r := bson.D{}
id := fmt.Sprintf("%d/%s/%s", q.chainId, q.emitter, q.sequence)
r = append(r, bson.E{Key: "_id", Value: id})
return &r
}
func (q *RelaysQuery) SetChain(chainId vaa.ChainID) *RelaysQuery {
q.chainId = chainId
return q
}
func (q *RelaysQuery) SetEmitter(emitter string) *RelaysQuery {
q.emitter = emitter
return q
}
func (q *RelaysQuery) SetSequence(sequence string) *RelaysQuery {
q.sequence = sequence
return q
}
func Query() *RelaysQuery {
return &RelaysQuery{}
}