Fix timestamp and blockNumber for EVM and Solana blochains (#199)
This commit is contained in:
parent
5527268969
commit
cbeeba1681
|
@ -2,6 +2,7 @@ package solana
|
|||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/gagliardetto/solana-go"
|
||||
"github.com/gagliardetto/solana-go/rpc"
|
||||
|
@ -17,6 +18,7 @@ type SolanaSDK struct {
|
|||
type GetBlockResult struct {
|
||||
IsConfirmed bool
|
||||
Transactions []rpc.TransactionWithMeta
|
||||
BlockTime *time.Time
|
||||
}
|
||||
|
||||
func NewSolanaSDK(url string, rl ratelimit.Limiter) *SolanaSDK {
|
||||
|
@ -50,7 +52,12 @@ func (s *SolanaSDK) GetBlock(ctx context.Context, block uint64) (*GetBlockResult
|
|||
// Per the API, nil just means the block is not confirmed.
|
||||
return &GetBlockResult{IsConfirmed: false}, nil
|
||||
}
|
||||
return &GetBlockResult{IsConfirmed: true, Transactions: out.Transactions}, nil
|
||||
var blockTime *time.Time
|
||||
if out.BlockTime != nil {
|
||||
t := out.BlockTime.Time()
|
||||
blockTime = &t
|
||||
}
|
||||
return &GetBlockResult{IsConfirmed: true, Transactions: out.Transactions, BlockTime: blockTime}, nil
|
||||
}
|
||||
|
||||
func (s *SolanaSDK) GetSignaturesForAddress(ctx context.Context, address solana.PublicKey) ([]*rpc.TransactionSignature, error) {
|
||||
|
|
|
@ -168,16 +168,6 @@ func (w *EVMWatcher) processBlock(ctx context.Context, currentBlock int64, lastB
|
|||
continue
|
||||
}
|
||||
|
||||
// get the timestamp.
|
||||
unixTime, err := strconv.ParseInt(remove0x(tx.Timestamp), 16, 64)
|
||||
var timestamp *time.Time
|
||||
if err != nil {
|
||||
w.logger.Error("cannot convert to timestamp", zap.Error(err), zap.String("tx", tx.Hash))
|
||||
} else {
|
||||
tm := time.Unix(unixTime, 0)
|
||||
timestamp = &tm
|
||||
}
|
||||
|
||||
// create global transaction.
|
||||
updatedAt := time.Now()
|
||||
globalTx := storage.TransactionUpdate{
|
||||
|
@ -189,8 +179,8 @@ func (w *EVMWatcher) processBlock(ctx context.Context, currentBlock int64, lastB
|
|||
TxHash: remove0x(tx.Hash),
|
||||
To: tx.To,
|
||||
From: tx.From,
|
||||
BlockNumber: tx.BlockNumber,
|
||||
Timestamp: timestamp,
|
||||
BlockNumber: w.getBlockNumber(tx.BlockNumber, tx.Hash),
|
||||
Timestamp: w.getTimestamp(tx.Timestamp, tx.Hash),
|
||||
UpdatedAt: &updatedAt,
|
||||
},
|
||||
}
|
||||
|
@ -298,6 +288,25 @@ func (w *EVMWatcher) parseInput(input string) (*vaa.VAA, error) {
|
|||
return vaa, nil
|
||||
}
|
||||
|
||||
func (w *EVMWatcher) getBlockNumber(s string, txHash string) string {
|
||||
value, err := strconv.ParseInt(remove0x(s), 16, 64)
|
||||
if err != nil {
|
||||
w.logger.Error("cannot convert to int", zap.Error(err), zap.String("tx", txHash))
|
||||
return s
|
||||
}
|
||||
return strconv.FormatInt(value, 10)
|
||||
}
|
||||
|
||||
func (w *EVMWatcher) getTimestamp(s string, txHash string) *time.Time {
|
||||
value, err := strconv.ParseInt(remove0x(s), 16, 64)
|
||||
if err != nil {
|
||||
w.logger.Error("cannot convert to timestamp", zap.Error(err), zap.String("tx", txHash))
|
||||
return nil
|
||||
}
|
||||
tm := time.Unix(value, 0)
|
||||
return &tm
|
||||
}
|
||||
|
||||
func remove0x(input string) string {
|
||||
return strings.Replace(input, "0x", "", -1)
|
||||
}
|
||||
|
|
|
@ -186,7 +186,7 @@ func (w *SolanaWatcher) processBlock(ctx context.Context, fromBlock uint64, toBl
|
|||
return errors.New("block not confirmed")
|
||||
}
|
||||
for txNum, txRpc := range result.Transactions {
|
||||
w.processTransaction(ctx, txRpc, block, txNum)
|
||||
w.processTransaction(ctx, txRpc, block, txNum, result.BlockTime)
|
||||
}
|
||||
// update the last block number processed in the database.
|
||||
watcherBlock := storage.WatcherBlock{
|
||||
|
@ -202,7 +202,7 @@ func (w *SolanaWatcher) processBlock(ctx context.Context, fromBlock uint64, toBl
|
|||
}
|
||||
}
|
||||
|
||||
func (w *SolanaWatcher) processTransaction(ctx context.Context, txRpc rpc.TransactionWithMeta, block uint64, txNum int) {
|
||||
func (w *SolanaWatcher) processTransaction(ctx context.Context, txRpc rpc.TransactionWithMeta, block uint64, txNum int, blockTime *time.Time) {
|
||||
if txRpc.Meta.Err != nil {
|
||||
w.logger.Debug("Transaction failed, skipping it",
|
||||
zap.Uint64("block", block),
|
||||
|
@ -311,12 +311,6 @@ func (w *SolanaWatcher) processTransaction(ctx context.Context, txRpc rpc.Transa
|
|||
continue
|
||||
}
|
||||
|
||||
// create global transaction.
|
||||
var timestamp *time.Time
|
||||
if txRpc.BlockTime != nil {
|
||||
tm := time.Unix(int64(*txRpc.BlockTime), 0)
|
||||
timestamp = &tm
|
||||
}
|
||||
updatedAt := time.Now()
|
||||
globalTx := storage.TransactionUpdate{
|
||||
ID: data.MessageID(),
|
||||
|
@ -326,7 +320,7 @@ func (w *SolanaWatcher) processTransaction(ctx context.Context, txRpc rpc.Transa
|
|||
Method: instruccionID.Name(),
|
||||
TxHash: txSignature.String(),
|
||||
BlockNumber: strconv.FormatUint(block, 10),
|
||||
Timestamp: timestamp,
|
||||
Timestamp: blockTime,
|
||||
UpdatedAt: &updatedAt,
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue