github.com/diadata-org/diadata@v1.4.593/pkg/dia/scraper/blockchain-scrapers/scrapers/blockchain-scrapers.go (about)

     1  package blockchainscrapers
     2  
     3  import (
     4  	"log"
     5  	"time"
     6  
     7  	"github.com/blockstatecom/go-bitcoind"
     8  	"github.com/diadata-org/diadata/pkg/dia"
     9  )
    10  
    11  const (
    12  	USESSL = false
    13  )
    14  
    15  type BlockchainScraper struct {
    16  	bitcoind    *bitcoind.Bitcoind
    17  	client      *dia.Client
    18  	symbol      string
    19  	elapsedTime time.Duration
    20  }
    21  
    22  func numberOfCoinsFor(blockNumber float64, subsidy float64, totalCoins float64, rewardModulo int64) float64 {
    23  	var i int64 = 1
    24  	for i < int64(blockNumber) {
    25  		if i%rewardModulo == 0 {
    26  			subsidy = subsidy / 2
    27  		}
    28  		totalCoins += subsidy
    29  		i++
    30  	}
    31  	return totalCoins
    32  }
    33  
    34  func (s *BlockchainScraper) numberOfCoinsFor(blockNumber float64) float64 {
    35  	switch s.symbol {
    36  	case "LTC":
    37  		return numberOfCoinsFor(blockNumber, 50.0, 50.0, 840000)
    38  	default:
    39  		return numberOfCoinsFor(blockNumber, 50.0, 50.0, 210000)
    40  	}
    41  }
    42  
    43  func NewScraper(client *dia.Client, symbol string, serverHost string, serverPort int, user string, passwd string, elapsedTime int) *BlockchainScraper {
    44  	bc, err := bitcoind.New(serverHost, serverPort, user, passwd, USESSL)
    45  	if err != nil {
    46  		log.Println(err)
    47  		return nil
    48  	}
    49  	t := &BlockchainScraper{
    50  		bitcoind:    bc,
    51  		client:      client,
    52  		symbol:      symbol,
    53  		elapsedTime: time.Duration(elapsedTime) * time.Second,
    54  	}
    55  	return t
    56  }
    57  
    58  func (s *BlockchainScraper) Run() {
    59  	for {
    60  		rinfo, err := s.bitcoind.GetBlockchainInfo()
    61  		if err == nil {
    62  			log.Println("GetBlockchainInfo:", rinfo)
    63  			m := time.Unix(rinfo.Mediantime, 0)
    64  			l := time.Since(m)
    65  			circulatingSupply := s.numberOfCoinsFor(rinfo.Blocks)
    66  			log.Println("ElapsedTime block:", l, circulatingSupply)
    67  			if l < s.elapsedTime {
    68  				err = s.client.SendSupply(&dia.Supply{
    69  					Asset:             dia.Asset{Symbol: s.symbol},
    70  					CirculatingSupply: circulatingSupply,
    71  				})
    72  				if err != nil {
    73  					log.Println("Err communicating with api:", err)
    74  				}
    75  			}
    76  		} else {
    77  			log.Println("Err communicating with node:", err)
    78  		}
    79  		time.Sleep(10 * time.Second)
    80  	}
    81  }