Browse Source

Current price

master
yuriy0803 5 years ago
parent
commit
e5f907c914
  1. 10
      api.json
  2. 5
      api/server.go
  3. 11
      main.go
  4. 12
      proxy/config.go
  5. 52
      storage/redis.go
  6. 12
      www/app/controllers/application.js
  7. 1
      www/app/templates/index.hbs

10
api.json

@ -2,8 +2,9 @@
"threads": 4, "threads": 4,
"coin": "etc", "coin": "etc",
"name": "main", "name": "main",
"pplns": 9000, "pplns": 9000,
"network": "classic", "network": "classic",
"coin-name":"etc",
"proxy": { "proxy": {
"enabled": true, "enabled": true,
@ -87,6 +88,13 @@
"password": "" "password": ""
}, },
"exchange": {
"enabled": true,
"url": "https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=ethereum-classic",
"timeout": "50s",
"refreshInterval": "900s"
},
"unlocker": { "unlocker": {
"enabled": true, "enabled": true,
"poolFee": 1.0, "poolFee": 1.0,

5
api/server.go

@ -257,6 +257,7 @@ func (s *ApiServer) StatsIndex(w http.ResponseWriter, r *http.Request) {
reply["maturedTotal"] = stats["maturedTotal"] reply["maturedTotal"] = stats["maturedTotal"]
reply["immatureTotal"] = stats["immatureTotal"] reply["immatureTotal"] = stats["immatureTotal"]
reply["candidatesTotal"] = stats["candidatesTotal"] reply["candidatesTotal"] = stats["candidatesTotal"]
reply["exchangedata"] = stats["exchangedata"]
} }
err = json.NewEncoder(w).Encode(reply) err = json.NewEncoder(w).Encode(reply)
@ -322,6 +323,7 @@ func (s *ApiServer) PaymentsIndex(w http.ResponseWriter, r *http.Request) {
if stats != nil { if stats != nil {
reply["payments"] = stats["payments"] reply["payments"] = stats["payments"]
reply["paymentsTotal"] = stats["paymentsTotal"] reply["paymentsTotal"] = stats["paymentsTotal"]
reply["exchangedata"] = stats["exchangedata"]
} }
err := json.NewEncoder(w).Encode(reply) err := json.NewEncoder(w).Encode(reply)
@ -339,6 +341,8 @@ func (s *ApiServer) AccountIndex(w http.ResponseWriter, r *http.Request) {
s.minersMu.Lock() s.minersMu.Lock()
defer s.minersMu.Unlock() defer s.minersMu.Unlock()
generalstats := s.getStats()
reply, ok := s.miners[login] reply, ok := s.miners[login]
now := util.MakeTimestamp() now := util.MakeTimestamp()
cacheIntv := int64(s.statsIntv / time.Millisecond) cacheIntv := int64(s.statsIntv / time.Millisecond)
@ -371,6 +375,7 @@ func (s *ApiServer) AccountIndex(w http.ResponseWriter, r *http.Request) {
stats[key] = value stats[key] = value
} }
stats["pageSize"] = s.config.Payments stats["pageSize"] = s.config.Payments
stats["exchangedata"] = generalstats["exchangedata"]
stats["minerCharts"], err = s.backend.GetMinerCharts(s.config.MinerChartsNum, login) stats["minerCharts"], err = s.backend.GetMinerCharts(s.config.MinerChartsNum, login)
stats["paymentCharts"], err = s.backend.GetPaymentCharts(login) stats["paymentCharts"], err = s.backend.GetPaymentCharts(login)
reply = &Entry{stats: stats, updatedAt: now} reply = &Entry{stats: stats, updatedAt: now}

11
main.go

@ -14,6 +14,7 @@ import (
"github.com/yvasiyarov/gorelic" "github.com/yvasiyarov/gorelic"
"github.com/yuriy0803/open-etc-pool-friends/api" "github.com/yuriy0803/open-etc-pool-friends/api"
"github.com/yuriy0803/open-etc-pool-friends/exchange"
"github.com/yuriy0803/open-etc-pool-friends/payouts" "github.com/yuriy0803/open-etc-pool-friends/payouts"
"github.com/yuriy0803/open-etc-pool-friends/proxy" "github.com/yuriy0803/open-etc-pool-friends/proxy"
"github.com/yuriy0803/open-etc-pool-friends/storage" "github.com/yuriy0803/open-etc-pool-friends/storage"
@ -42,6 +43,11 @@ func startPayoutsProcessor() {
u.Start() u.Start()
} }
func startExchangeProcessor() {
u := exchange.StartExchangeProcessor(&cfg.Exchange, backend)
u.Start()
}
func startNewrelic() { func startNewrelic() {
if cfg.NewrelicEnabled { if cfg.NewrelicEnabled {
nr := gorelic.NewAgent() nr := gorelic.NewAgent()
@ -82,7 +88,7 @@ func main() {
startNewrelic() startNewrelic()
backend = storage.NewRedisClient(&cfg.Redis, cfg.Coin, cfg.Pplns) backend = storage.NewRedisClient(&cfg.Redis, cfg.Coin, cfg.Pplns, cfg.CoinName)
pong, err := backend.Check() pong, err := backend.Check()
if err != nil { if err != nil {
log.Printf("Can't establish connection to backend: %v", err) log.Printf("Can't establish connection to backend: %v", err)
@ -102,6 +108,9 @@ func main() {
if cfg.Payouts.Enabled { if cfg.Payouts.Enabled {
go startPayoutsProcessor() go startPayoutsProcessor()
} }
if cfg.Exchange.Enabled {
go startExchangeProcessor()
}
quit := make(chan bool) quit := make(chan bool)
<-quit <-quit
} }

12
proxy/config.go

@ -2,6 +2,7 @@ package proxy
import ( import (
"github.com/yuriy0803/open-etc-pool-friends/api" "github.com/yuriy0803/open-etc-pool-friends/api"
"github.com/yuriy0803/open-etc-pool-friends/exchange"
"github.com/yuriy0803/open-etc-pool-friends/payouts" "github.com/yuriy0803/open-etc-pool-friends/payouts"
"github.com/yuriy0803/open-etc-pool-friends/policy" "github.com/yuriy0803/open-etc-pool-friends/policy"
"github.com/yuriy0803/open-etc-pool-friends/storage" "github.com/yuriy0803/open-etc-pool-friends/storage"
@ -16,14 +17,17 @@ type Config struct {
Threads int `json:"threads"` Threads int `json:"threads"`
Network string `json:"network"` Network string `json:"network"`
Coin string `json:"coin"` Coin string `json:"coin"`
Pplns int64 `json:"pplns"` Pplns int64 `json:"pplns"`
Redis storage.Config `json:"redis"` Redis storage.Config `json:"redis"`
CoinName string `json:"coin-name"`
BlockUnlocker payouts.UnlockerConfig `json:"unlocker"` BlockUnlocker payouts.UnlockerConfig `json:"unlocker"`
Payouts payouts.PayoutsConfig `json:"payouts"` Payouts payouts.PayoutsConfig `json:"payouts"`
Exchange exchange.ExchangeConfig `json:"exchange"`
NewrelicName string `json:"newrelicName"` NewrelicName string `json:"newrelicName"`
NewrelicKey string `json:"newrelicKey"` NewrelicKey string `json:"newrelicKey"`
NewrelicVerbose bool `json:"newrelicVerbose"` NewrelicVerbose bool `json:"newrelicVerbose"`

52
storage/redis.go

@ -2,6 +2,7 @@ package storage
import ( import (
"fmt" "fmt"
"log"
"math" "math"
"math/big" "math/big"
"sort" "sort"
@ -22,9 +23,10 @@ type Config struct {
} }
type RedisClient struct { type RedisClient struct {
client *redis.Client client *redis.Client
prefix string prefix string
pplns int64 pplns int64
CoinName string
} }
type PoolCharts struct { type PoolCharts struct {
@ -137,14 +139,14 @@ type Worker struct {
WorkerStatushas int64 `json:"w_stat_s"` WorkerStatushas int64 `json:"w_stat_s"`
} }
func NewRedisClient(cfg *Config, prefix string, pplns int64) *RedisClient { func NewRedisClient(cfg *Config, prefix string, pplns int64, CoinName string) *RedisClient {
client := redis.NewClient(&redis.Options{ client := redis.NewClient(&redis.Options{
Addr: cfg.Endpoint, Addr: cfg.Endpoint,
Password: cfg.Password, Password: cfg.Password,
DB: cfg.Database, DB: cfg.Database,
PoolSize: cfg.PoolSize, PoolSize: cfg.PoolSize,
}) })
return &RedisClient{client: client, prefix: prefix, pplns: pplns} return &RedisClient{client: client, prefix: prefix, pplns: pplns, CoinName: CoinName}
} }
func (r *RedisClient) Client() *redis.Client { func (r *RedisClient) Client() *redis.Client {
@ -949,6 +951,7 @@ func (r *RedisClient) CollectStats(smallWindow time.Duration, maxBlocks, maxPaym
tx.ZRevRangeWithScores(r.formatKey("payments", "all"), 0, maxPayments-1) tx.ZRevRangeWithScores(r.formatKey("payments", "all"), 0, maxPayments-1)
tx.LLen(r.formatKey("lastshares")) tx.LLen(r.formatKey("lastshares"))
tx.ZRevRangeWithScores(r.formatKey("finders"), 0, -1) tx.ZRevRangeWithScores(r.formatKey("finders"), 0, -1)
tx.HGetAllMap(r.formatKey("exchange", r.CoinName))
return nil return nil
}) })
@ -982,6 +985,10 @@ func (r *RedisClient) CollectStats(smallWindow time.Duration, maxBlocks, maxPaym
stats["miners"] = miners stats["miners"] = miners
stats["minersTotal"] = len(miners) stats["minersTotal"] = len(miners)
stats["hashrate"] = totalHashrate stats["hashrate"] = totalHashrate
exchangedata, _ := cmds[13].(*redis.StringStringMapCmd).Result()
stats["exchangedata"] = exchangedata
return stats, nil return stats, nil
} }
@ -1583,3 +1590,38 @@ func (r *RedisClient) NumberStratumWorker(count int) {
return nil return nil
}) })
} }
func (r *RedisClient) StoreExchangeData(ExchangeData []map[string]interface{}) {
tx := r.client.Multi()
defer tx.Close()
log.Printf("ExchangeData: %s", ExchangeData)
for _, coindata := range ExchangeData {
for key, value := range coindata {
cmd := tx.HSet(r.formatKey("exchange", coindata["symbol"]), fmt.Sprintf("%v", key), fmt.Sprintf("%v", value))
err := cmd.Err()
if err != nil {
log.Printf("Error while Storing %s : Key-%s , value-%s , Error : %v", coindata["symbol"], key, value, err)
}
}
}
log.Printf("Writing Exchange Data ")
return
}
func (r *RedisClient) GetExchangeData(coinsymbol string) (map[string]string, error) {
cmd := r.client.HGetAllMap(r.formatKey("exchange", coinsymbol))
result, err := cmd.Result()
if err != nil {
return nil, err
}
return result, err
}

12
www/app/controllers/application.js

@ -32,6 +32,18 @@ export default Ember.Controller.extend({
} }
}), }),
ethinr: Ember.computed('stats', {
get() {
return parseFloat(this.get('model.exchangedata.price_inr'));
}
}),
ethusd: Ember.computed('stats', {
get() {
return parseFloat(this.get('model.exchangedata.current_price'));
}
}),
hashrate: Ember.computed('difficulty', { hashrate: Ember.computed('difficulty', {
get() { get() {
return this.getWithDefault('difficulty', 0) / config.APP.BlockTime; return this.getWithDefault('difficulty', 0) / config.APP.BlockTime;

1
www/app/templates/index.hbs

@ -28,6 +28,7 @@
<div><i class="fa fa-tachometer"></i> Network Hash Rate: <span>{{format-hashrate stats.hashrate}}</span></div> <div><i class="fa fa-tachometer"></i> Network Hash Rate: <span>{{format-hashrate stats.hashrate}}</span></div>
<div><i class="fa fa-bars"></i> Blockchain Height: <span>{{format-number stats.height}}</span></div> <div><i class="fa fa-bars"></i> Blockchain Height: <span>{{format-number stats.height}}</span></div>
<div><i class="fa fa-clock-o"></i> Current Round Variance: <span>{{format-number stats.roundVariance style='percent'}}</span></div> <div><i class="fa fa-clock-o"></i> Current Round Variance: <span>{{format-number stats.roundVariance style='percent'}}</span></div>
<div><i class="fa fa-credit-card-alt fa-fw"></i> Current price: <span>$ {{model.exchangedata.current_price}}</span></div>
</div> </div>
</div> </div>
</div> </div>

Loading…
Cancel
Save