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 }