services/scribe/graphql/server/graph/queries.resolvers.go
package graph
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.36
import (
"context"
"fmt"
"math/big"
"time"
"github.com/ethereum/go-ethereum/common"
ethCore "github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/synapsecns/sanguine/services/scribe/db"
"github.com/synapsecns/sanguine/services/scribe/graphql/server/graph/model"
resolvers "github.com/synapsecns/sanguine/services/scribe/graphql/server/graph/resolver"
scribeTypes "github.com/synapsecns/sanguine/services/scribe/types"
)
// Logs is the resolver for the logs field.
func (r *queryResolver) Logs(ctx context.Context, contractAddress *string, chainID int, blockNumber *int, txHash *string, txIndex *int, blockHash *string, index *int, confirmed *bool, page int) ([]*model.Log, error) {
logsFilter := db.BuildLogFilter(contractAddress, blockNumber, txHash, txIndex, blockHash, index, confirmed)
logsFilter.ChainID = uint32(chainID)
logs, err := r.DB.RetrieveLogsWithFilter(ctx, logsFilter, page)
if err != nil {
return nil, fmt.Errorf("error retrieving logs: %w", err)
}
return r.logsToModelLogs(logs, logsFilter.ChainID), nil
}
// LogsRange is the resolver for the logsRange field.
func (r *queryResolver) LogsRange(ctx context.Context, contractAddress *string, chainID int, blockNumber *int, txHash *string, txIndex *int, blockHash *string, index *int, confirmed *bool, startBlock int, endBlock int, page int, asc *bool) ([]*model.Log, error) {
logsFilter := db.BuildLogFilter(contractAddress, blockNumber, txHash, txIndex, blockHash, index, confirmed)
logsFilter.ChainID = uint32(chainID)
var logs []*types.Log
var err error
// Get logs in ascending order if asc is set to true.
if asc != nil && *asc {
logs, err = r.DB.RetrieveLogsInRangeAsc(ctx, logsFilter, uint64(startBlock), uint64(endBlock), page)
} else {
logs, err = r.DB.RetrieveLogsInRange(ctx, logsFilter, uint64(startBlock), uint64(endBlock), page)
}
if err != nil {
return nil, fmt.Errorf("error retrieving logs: %w", err)
}
return r.logsToModelLogs(logs, logsFilter.ChainID), nil
}
// Receipts is the resolver for the receipts field.
func (r *queryResolver) Receipts(ctx context.Context, chainID int, txHash *string, contractAddress *string, blockHash *string, blockNumber *int, txIndex *int, confirmed *bool, page int) ([]*model.Receipt, error) {
receiptsFilter := db.BuildReceiptFilter(txHash, contractAddress, blockHash, blockNumber, txIndex, confirmed)
receiptsFilter.ChainID = uint32(chainID)
receipts, err := r.DB.RetrieveReceiptsWithFilter(ctx, receiptsFilter, page)
if err != nil {
return nil, fmt.Errorf("error retrieving receipts: %w", err)
}
return r.receiptsToModelReceipts(receipts, receiptsFilter.ChainID), nil
}
// ReceiptsRange is the resolver for the receiptsRange field.
func (r *queryResolver) ReceiptsRange(ctx context.Context, chainID int, txHash *string, contractAddress *string, blockHash *string, blockNumber *int, txIndex *int, confirmed *bool, startBlock int, endBlock int, page int) ([]*model.Receipt, error) {
receiptsFilter := db.BuildReceiptFilter(txHash, contractAddress, blockHash, blockNumber, txIndex, confirmed)
receiptsFilter.ChainID = uint32(chainID)
receipts, err := r.DB.RetrieveReceiptsInRange(ctx, receiptsFilter, uint64(startBlock), uint64(endBlock), page)
if err != nil {
return nil, fmt.Errorf("error retrieving receipts: %w", err)
}
return r.receiptsToModelReceipts(receipts, receiptsFilter.ChainID), nil
}
// Transactions is the resolver for the transactions field.
func (r *queryResolver) Transactions(ctx context.Context, txHash *string, chainID int, blockNumber *int, blockHash *string, confirmed *bool, page int) ([]*model.Transaction, error) {
transactionsFilter := db.BuildEthTxFilter(txHash, blockNumber, blockHash, confirmed)
transactionsFilter.ChainID = uint32(chainID)
transactions, err := r.DB.RetrieveEthTxsWithFilter(ctx, transactionsFilter, page)
if err != nil {
return nil, fmt.Errorf("error retrieving transactions: %w", err)
}
return r.ethTxsToModelTransactions(ctx, transactions, transactionsFilter.ChainID), nil
}
// TransactionsRange is the resolver for the transactionsRange field.
func (r *queryResolver) TransactionsRange(ctx context.Context, txHash *string, chainID int, blockNumber *int, blockHash *string, confirmed *bool, startBlock int, endBlock int, page int) ([]*model.Transaction, error) {
transactionsFilter := db.BuildEthTxFilter(txHash, blockNumber, blockHash, confirmed)
transactionsFilter.ChainID = uint32(chainID)
transactions, err := r.DB.RetrieveEthTxsInRange(ctx, transactionsFilter, uint64(startBlock), uint64(endBlock), page)
if err != nil {
return nil, fmt.Errorf("error retrieving transactions: %w", err)
}
return r.ethTxsToModelTransactions(ctx, transactions, transactionsFilter.ChainID), nil
}
// BlockTime is the resolver for the blockTime field.
func (r *queryResolver) BlockTime(ctx context.Context, chainID int, blockNumber int) (*int, error) {
blockTime, err := r.DB.RetrieveBlockTime(ctx, uint32(chainID), uint64(blockNumber))
if err != nil {
fmt.Println(err, "TESTING")
blockTimeRaw, err := r.getBlockTime(ctx, uint32(chainID), uint64(blockNumber))
if err != nil {
return nil, fmt.Errorf("error retrieving block time: %w", err)
}
blockTime = *blockTimeRaw
go func() {
// we create a new context here to allow async storage and allow for quick returns
// TODO: this is a hotfix and should be undone once reindexed
storeCtx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
storeErr := r.DB.StoreBlockTime(storeCtx, uint32(chainID), uint64(blockNumber), blockTime)
if storeErr != nil {
logger.Error(storeErr)
}
}()
}
blockTimeInt := int(blockTime)
return &blockTimeInt, nil
}
// LastStoredBlockNumber is the resolver for the lastStoredBlockNumber field.
func (r *queryResolver) LastStoredBlockNumber(ctx context.Context, chainID int) (*int, error) {
blockNumber, err := r.DB.RetrieveLastBlockStored(ctx, uint32(chainID))
if err != nil {
return nil, fmt.Errorf("error retrieving last block: %w", err)
}
blockNumberInt := int(blockNumber)
return &blockNumberInt, nil
}
// FirstStoredBlockNumber is the resolver for the firstStoredBlockNumber field.
func (r *queryResolver) FirstStoredBlockNumber(ctx context.Context, chainID int) (*int, error) {
blockNumber, err := r.DB.RetrieveFirstBlockStored(ctx, uint32(chainID))
if err != nil {
return nil, fmt.Errorf("error retrieving first block: %w", err)
}
blockNumberInt := int(blockNumber)
return &blockNumberInt, nil
}
// LastConfirmedBlockNumber is the resolver for the lastConfirmedBlockNumber field.
func (r *queryResolver) LastConfirmedBlockNumber(ctx context.Context, chainID int) (*int, error) {
blockNumber, err := r.DB.RetrieveLastConfirmedBlock(ctx, uint32(chainID))
if err != nil {
return nil, fmt.Errorf("error retrieving first block: %w", err)
}
blockNumberInt := int(blockNumber)
return &blockNumberInt, nil
}
// TxSender is the resolver for the txSender field.
func (r *queryResolver) TxSender(ctx context.Context, txHash string, chainID int) (*string, error) {
filter := db.EthTxFilter{
TxHash: txHash,
ChainID: uint32(chainID),
}
ethTx, err := r.DB.RetrieveEthTxsWithFilter(ctx, filter, 1)
if err != nil || len(ethTx) == 0 {
return nil, fmt.Errorf("error retrieving transaction: %w", err)
}
msgFrom, err := ethCore.TransactionToMessage(ðTx[0].Tx, types.LatestSignerForChainID(ethTx[0].Tx.ChainId()), big.NewInt(1))
if err != nil {
return nil, fmt.Errorf("error retrieving ethtx: %w", err)
}
sender := msgFrom.From.String()
return &sender, nil
}
// LastIndexed is the resolver for the lastIndexed field.
func (r *queryResolver) LastIndexed(ctx context.Context, contractAddress string, chainID int) (*int, error) {
blockNumber, err := r.DB.RetrieveLastIndexed(ctx, common.HexToAddress(contractAddress), uint32(chainID), scribeTypes.IndexingConfirmed)
if err != nil {
return nil, fmt.Errorf("error retrieving contract last block: %w", err)
}
blockNumberInt := int(blockNumber)
return &blockNumberInt, nil
}
// LogCount is the resolver for the logCount field.
func (r *queryResolver) LogCount(ctx context.Context, contractAddress string, chainID int) (*int, error) {
logCount, err := r.DB.RetrieveLogCountForContract(ctx, common.HexToAddress(contractAddress), uint32(chainID))
if err != nil {
return nil, fmt.Errorf("error retrieving log count: %w", err)
}
logCountInt := int(logCount)
return &logCountInt, nil
}
// ReceiptCount is the resolver for the receiptCount field.
func (r *queryResolver) ReceiptCount(ctx context.Context, chainID int) (*int, error) {
receiptCount, err := r.DB.RetrieveReceiptCountForChain(ctx, uint32(chainID))
if err != nil {
return nil, fmt.Errorf("error retrieving receipt count: %w", err)
}
logCountInt := int(receiptCount)
return &logCountInt, nil
}
// BlockTimeCount is the resolver for the blockTimeCount field.
func (r *queryResolver) BlockTimeCount(ctx context.Context, chainID int) (*int, error) {
blockTimesCount, err := r.DB.RetrieveBlockTimesCountForChain(ctx, uint32(chainID))
if err != nil {
return nil, fmt.Errorf("error retrieving contract last block: %w", err)
}
blockTimesCountInt := int(blockTimesCount)
return &blockTimesCountInt, nil
}
// LogsAtHeadRange is the resolver for the logsAtHeadRange field.
func (r *queryResolver) LogsAtHeadRange(ctx context.Context, contractAddress *string, chainID int, blockNumber *int, txHash *string, txIndex *int, blockHash *string, index *int, confirmed *bool, startBlock int, endBlock int, page int) ([]*model.Log, error) {
logsFilter := db.BuildLogFilter(contractAddress, blockNumber, txHash, txIndex, blockHash, index, confirmed)
logsFilter.ChainID = uint32(chainID)
logs, err := r.DB.RetrieveLogsFromHeadRangeQuery(ctx, logsFilter, uint64(startBlock), uint64(endBlock), page)
if err != nil {
return nil, fmt.Errorf("error retrieving logs: %w", err)
}
return r.logsToModelLogs(logs, logsFilter.ChainID), nil
}
// ReceiptsAtHeadRange is the resolver for the receiptsAtHeadRange field.
func (r *queryResolver) ReceiptsAtHeadRange(ctx context.Context, chainID int, txHash *string, contractAddress *string, blockHash *string, blockNumber *int, txIndex *int, confirmed *bool, startBlock int, endBlock int, page int) ([]*model.Receipt, error) {
receiptsFilter := db.BuildReceiptFilter(txHash, contractAddress, blockHash, blockNumber, txIndex, confirmed)
receiptsFilter.ChainID = uint32(chainID)
receipts, err := r.DB.RetrieveReceiptsFromHeadRangeQuery(ctx, receiptsFilter, uint64(startBlock), uint64(endBlock), page)
if err != nil {
return nil, fmt.Errorf("error retrieving receipts: %w", err)
}
return r.receiptsToModelReceipts(receipts, receiptsFilter.ChainID), nil
}
// TransactionsAtHeadRange is the resolver for the transactionsAtHeadRange field.
func (r *queryResolver) TransactionsAtHeadRange(ctx context.Context, txHash *string, chainID int, blockNumber *int, blockHash *string, confirmed *bool, startBlock int, endBlock int, lastIndexed int, page int) ([]*model.Transaction, error) {
transactionsFilter := db.BuildEthTxFilter(txHash, blockNumber, blockHash, confirmed)
transactionsFilter.ChainID = uint32(chainID)
transactions, err := r.DB.RetrieveUnconfirmedEthTxsFromHeadRangeQuery(ctx, transactionsFilter, uint64(startBlock), uint64(endBlock), uint64(lastIndexed), page)
if err != nil {
return nil, fmt.Errorf("error retrieving transactions: %w", err)
}
return r.ethTxsToModelTransactions(ctx, transactions, transactionsFilter.ChainID), nil
}
// Query returns resolvers.QueryResolver implementation.
func (r *Resolver) Query() resolvers.QueryResolver { return &queryResolver{r} }
type queryResolver struct{ *Resolver }