github.com/diadata-org/diadata@v1.4.593/pkg/dia/helpers/ethhelper/blockInfo.go (about) 1 package ethhelper 2 3 import ( 4 "context" 5 "math/big" 6 "time" 7 8 "github.com/diadata-org/diadata/pkg/dia" 9 models "github.com/diadata-org/diadata/pkg/model" 10 "github.com/ethereum/go-ethereum/ethclient" 11 "github.com/fatih/structs" 12 ) 13 14 // GetBlockData returns relevant block data from block with @blockNumber. 15 func GetBlockData(blockNumber int64, relDB *models.RelDB, client *ethclient.Client) (blockdata dia.BlockData, err error) { 16 blockdata, err = relDB.GetBlockData(dia.ETHEREUM, blockNumber) 17 if err != nil { 18 if err.Error() == "no rows in result set" { 19 blockdata, err = GetBlockDataOnChain(blockNumber, client) 20 if err != nil { 21 return 22 } 23 } 24 } 25 return blockdata, err 26 } 27 28 func GetBlockDataOnChain(blockNumber int64, client *ethclient.Client) (dia.BlockData, error) { 29 30 var ethblockdata dia.EthereumBlockData 31 var blockdata dia.BlockData 32 block, err := client.BlockByNumber(context.Background(), big.NewInt(blockNumber)) 33 if err != nil { 34 return dia.BlockData{}, err 35 } 36 37 ethblockdata.Coinbase = block.Coinbase() 38 ethblockdata.Difficulty = block.Difficulty() 39 ethblockdata.Extra = block.Extra() 40 ethblockdata.GasLimit = block.GasLimit() 41 ethblockdata.GasUsed = block.GasUsed() 42 ethblockdata.MixDigest = block.MixDigest() 43 ethblockdata.Nonce = block.Nonce() 44 ethblockdata.Number = block.NumberU64() 45 ethblockdata.ParentHash = block.ParentHash() 46 ethblockdata.ReceiptHash = block.ReceiptHash() 47 ethblockdata.Root = block.Root() 48 ethblockdata.Size = block.Size() 49 ethblockdata.Time = block.Time() 50 ethblockdata.TxHash = block.TxHash() 51 ethblockdata.UncleHash = block.UncleHash() 52 53 blockdata.BlockchainName = dia.ETHEREUM 54 blockdata.BlockNumber = int64(ethblockdata.Number) 55 blockdata.Data = structs.Map(ethblockdata) 56 57 return blockdata, nil 58 59 } 60 61 // GetBlockTimeEth returns the block time of @blockNumber on Ethereum mainnet. 62 func GetBlockTimeEth(blockNumber int64, relDB *models.RelDB, client *ethclient.Client) (blockTime time.Time, err error) { 63 blockData, err := GetBlockData(blockNumber, relDB, client) 64 if err != nil { 65 return 66 } 67 switch blockData.Data["Time"].(type) { 68 case float64: 69 blockTime = time.Unix(int64(blockData.Data["Time"].(float64)), 0) 70 case uint64: 71 blockTime = time.Unix(int64(blockData.Data["Time"].(uint64)), 0) 72 } 73 return 74 }