Add secondary currency picker to explorer
This commit is contained in:
parent
ea0391e03f
commit
aebc1c3495
19
blockbook.go
19
blockbook.go
@ -677,29 +677,30 @@ func computeFeeStats(stopCompute chan os.Signal, blockFrom, blockTo int, db *db.
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func initDownloaders(db *db.RocksDB, chain bchain.BlockChain, configfile string) {
|
func initDownloaders(db *db.RocksDB, chain bchain.BlockChain, configFile string) {
|
||||||
data, err := ioutil.ReadFile(configfile)
|
data, err := ioutil.ReadFile(configFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error reading file %v, %v", configfile, err)
|
glog.Errorf("Error reading file %v, %v", configFile, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var config struct {
|
var config struct {
|
||||||
FiatRates string `json:"fiat_rates"`
|
FiatRates string `json:"fiat_rates"`
|
||||||
FiatRatesParams string `json:"fiat_rates_params"`
|
FiatRatesParams string `json:"fiat_rates_params"`
|
||||||
FourByteSignatures string `json:"fourByteSignatures"`
|
FiatRatesVsCurrencies string `json:"fiat_rates_vs_currencies"`
|
||||||
|
FourByteSignatures string `json:"fourByteSignatures"`
|
||||||
}
|
}
|
||||||
|
|
||||||
err = json.Unmarshal(data, &config)
|
err = json.Unmarshal(data, &config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error parsing config file %v, %v", configfile, err)
|
glog.Errorf("Error parsing config file %v, %v", configFile, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.FiatRates == "" || config.FiatRatesParams == "" {
|
if config.FiatRates == "" || config.FiatRatesParams == "" {
|
||||||
glog.Infof("FiatRates config (%v) is empty, not downloading fiat rates", configfile)
|
glog.Infof("FiatRates config (%v) is empty, not downloading fiat rates", configFile)
|
||||||
} else {
|
} else {
|
||||||
fiatRates, err := fiat.NewFiatRatesDownloader(db, config.FiatRates, config.FiatRatesParams, onNewFiatRatesTicker)
|
fiatRates, err := fiat.NewFiatRatesDownloader(db, config.FiatRates, config.FiatRatesParams, config.FiatRatesVsCurrencies, onNewFiatRatesTicker)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("NewFiatRatesDownloader Init error: %v", err)
|
glog.Errorf("NewFiatRatesDownloader Init error: %v", err)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -56,6 +56,7 @@
|
|||||||
"slip44": 145,
|
"slip44": 145,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bitcoin-cash\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bitcoin-cash\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -252,6 +252,7 @@
|
|||||||
"slip44": 156,
|
"slip44": 156,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bitcoin-gold\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bitcoin-gold\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,6 +66,7 @@
|
|||||||
"alternative_estimate_fee": "whatthefee-disabled",
|
"alternative_estimate_fee": "whatthefee-disabled",
|
||||||
"alternative_estimate_fee_params": "{\"url\": \"https://whatthefee.io/data.json\", \"periodSeconds\": 60}",
|
"alternative_estimate_fee_params": "{\"url\": \"https://whatthefee.io/data.json\", \"periodSeconds\": 60}",
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bitcoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bitcoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,6 +60,7 @@
|
|||||||
"block_addresses_to_keep": 300,
|
"block_addresses_to_keep": 300,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bitcore\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"bitcore\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,6 +58,7 @@
|
|||||||
"slip44": 5,
|
"slip44": 5,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"dash\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"dash\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -59,6 +59,7 @@
|
|||||||
"slip44": 20,
|
"slip44": 20,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"digibyte\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"digibyte\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,6 +67,7 @@
|
|||||||
"slip44": 3,
|
"slip44": 3,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"dogecoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"dogecoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,6 +60,7 @@
|
|||||||
"slip44": 899,
|
"slip44": 899,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"ecash\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"ecash\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,6 +54,7 @@
|
|||||||
"mempoolTxTimeoutHours": 48,
|
"mempoolTxTimeoutHours": 48,
|
||||||
"queryBackendOnMempoolResync": true,
|
"queryBackendOnMempoolResync": true,
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"ethereum-classic\", \"periodSeconds\": 900}",
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"ethereum-classic\", \"periodSeconds\": 900}",
|
||||||
"fourByteSignatures": "https://www.4byte.directory/api/v1/signatures/"
|
"fourByteSignatures": "https://www.4byte.directory/api/v1/signatures/"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -61,6 +61,7 @@
|
|||||||
"mempoolTxTimeoutHours": 48,
|
"mempoolTxTimeoutHours": 48,
|
||||||
"queryBackendOnMempoolResync": false,
|
"queryBackendOnMempoolResync": false,
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"ethereum\",\"platformIdentifier\": \"ethereum\",\"platformVsCurrency\": \"eth\",\"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"ethereum\",\"platformIdentifier\": \"ethereum\",\"platformVsCurrency\": \"eth\",\"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -63,6 +63,7 @@
|
|||||||
"processInternalTransactions": true,
|
"processInternalTransactions": true,
|
||||||
"queryBackendOnMempoolResync": false,
|
"queryBackendOnMempoolResync": false,
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"ethereum\",\"platformIdentifier\": \"ethereum\",\"platformVsCurrency\": \"eth\",\"periodSeconds\": 900}",
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"ethereum\",\"platformIdentifier\": \"ethereum\",\"platformVsCurrency\": \"eth\",\"periodSeconds\": 900}",
|
||||||
"fourByteSignatures": "https://www.4byte.directory/api/v1/signatures/"
|
"fourByteSignatures": "https://www.4byte.directory/api/v1/signatures/"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,9 +27,7 @@
|
|||||||
"verification_type": "sha256",
|
"verification_type": "sha256",
|
||||||
"verification_source": "8aa699f3fbd6681391b90f744a25155d21a94f5ca63d6cc3b85172f3aca6e2a0",
|
"verification_source": "8aa699f3fbd6681391b90f744a25155d21a94f5ca63d6cc3b85172f3aca6e2a0",
|
||||||
"extract_command": "tar -C backend --strip 1 -xf",
|
"extract_command": "tar -C backend --strip 1 -xf",
|
||||||
"exclude_files": [
|
"exclude_files": ["bin/fujicoin-qt"],
|
||||||
"bin/fujicoin-qt"
|
|
||||||
],
|
|
||||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/fujicoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/fujicoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/*.log",
|
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/*.log",
|
||||||
"postinst_script_template": "",
|
"postinst_script_template": "",
|
||||||
@ -61,6 +59,7 @@
|
|||||||
"slip44": 75,
|
"slip44": 75,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"fujicoin\", \"periodSeconds\": 600}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"fujicoin\", \"periodSeconds\": 600}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,4 +68,4 @@
|
|||||||
"package_maintainer": "Motty",
|
"package_maintainer": "Motty",
|
||||||
"package_maintainer_email": "fujicoin@gmail.com"
|
"package_maintainer_email": "fujicoin@gmail.com"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,6 +60,7 @@
|
|||||||
"slip44": 17,
|
"slip44": 17,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"groestlcoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"groestlcoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,9 +27,7 @@
|
|||||||
"verification_type": "sha256",
|
"verification_type": "sha256",
|
||||||
"verification_source": "4b69743190e2697d7b7772bf6f63cde595d590ff6664abf15a7201dab2a6098b",
|
"verification_source": "4b69743190e2697d7b7772bf6f63cde595d590ff6664abf15a7201dab2a6098b",
|
||||||
"extract_command": "tar -C backend --strip 1 -xf",
|
"extract_command": "tar -C backend --strip 1 -xf",
|
||||||
"exclude_files": [
|
"exclude_files": ["bin/groestlcoin-qt"],
|
||||||
"bin/groestlcoin-qt"
|
|
||||||
],
|
|
||||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/regtest/*.log",
|
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/regtest/*.log",
|
||||||
"postinst_script_template": "",
|
"postinst_script_template": "",
|
||||||
@ -65,11 +63,7 @@
|
|||||||
"xpub_magic": 70617039,
|
"xpub_magic": 70617039,
|
||||||
"xpub_magic_segwit_p2sh": 71979618,
|
"xpub_magic_segwit_p2sh": 71979618,
|
||||||
"xpub_magic_segwit_native": 73342198,
|
"xpub_magic_segwit_native": 73342198,
|
||||||
"slip44": 1,
|
"slip44": 1
|
||||||
"additional_params": {
|
|
||||||
"fiat_rates": "coingecko",
|
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"groestlcoin\", \"periodSeconds\": 60}"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
|
|||||||
@ -27,9 +27,7 @@
|
|||||||
"verification_type": "sha256",
|
"verification_type": "sha256",
|
||||||
"verification_source": "4b69743190e2697d7b7772bf6f63cde595d590ff6664abf15a7201dab2a6098b",
|
"verification_source": "4b69743190e2697d7b7772bf6f63cde595d590ff6664abf15a7201dab2a6098b",
|
||||||
"extract_command": "tar -C backend --strip 1 -xf",
|
"extract_command": "tar -C backend --strip 1 -xf",
|
||||||
"exclude_files": [
|
"exclude_files": ["bin/groestlcoin-qt"],
|
||||||
"bin/groestlcoin-qt"
|
|
||||||
],
|
|
||||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/signet/*.log",
|
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/signet/*.log",
|
||||||
"postinst_script_template": "",
|
"postinst_script_template": "",
|
||||||
@ -59,11 +57,7 @@
|
|||||||
"xpub_magic": 70617039,
|
"xpub_magic": 70617039,
|
||||||
"xpub_magic_segwit_p2sh": 71979618,
|
"xpub_magic_segwit_p2sh": 71979618,
|
||||||
"xpub_magic_segwit_native": 73342198,
|
"xpub_magic_segwit_native": 73342198,
|
||||||
"slip44": 1,
|
"slip44": 1
|
||||||
"additional_params": {
|
|
||||||
"fiat_rates": "coingecko",
|
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"groestlcoin\", \"periodSeconds\": 60}"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
|
|||||||
@ -27,9 +27,7 @@
|
|||||||
"verification_type": "sha256",
|
"verification_type": "sha256",
|
||||||
"verification_source": "4b69743190e2697d7b7772bf6f63cde595d590ff6664abf15a7201dab2a6098b",
|
"verification_source": "4b69743190e2697d7b7772bf6f63cde595d590ff6664abf15a7201dab2a6098b",
|
||||||
"extract_command": "tar -C backend --strip 1 -xf",
|
"extract_command": "tar -C backend --strip 1 -xf",
|
||||||
"exclude_files": [
|
"exclude_files": ["bin/groestlcoin-qt"],
|
||||||
"bin/groestlcoin-qt"
|
|
||||||
],
|
|
||||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/groestlcoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/testnet3/*.log",
|
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/testnet3/*.log",
|
||||||
"postinst_script_template": "",
|
"postinst_script_template": "",
|
||||||
@ -59,11 +57,7 @@
|
|||||||
"xpub_magic": 70617039,
|
"xpub_magic": 70617039,
|
||||||
"xpub_magic_segwit_p2sh": 71979618,
|
"xpub_magic_segwit_p2sh": 71979618,
|
||||||
"xpub_magic_segwit_native": 73342198,
|
"xpub_magic_segwit_native": 73342198,
|
||||||
"slip44": 1,
|
"slip44": 1
|
||||||
"additional_params": {
|
|
||||||
"fiat_rates": "coingecko",
|
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"groestlcoin\", \"periodSeconds\": 60}"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
|
|||||||
@ -65,6 +65,7 @@
|
|||||||
"slip44": 2,
|
"slip44": 2,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"litecoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"litecoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -59,6 +59,7 @@
|
|||||||
"slip44": 22,
|
"slip44": 22,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"monacoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"monacoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -62,6 +62,7 @@
|
|||||||
"slip44": 7,
|
"slip44": 7,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"namecoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"namecoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,6 +57,7 @@
|
|||||||
"slip44": 341,
|
"slip44": 341,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"omotenashicoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"omotenashicoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,70 +1,64 @@
|
|||||||
{
|
{
|
||||||
"coin": {
|
"coin": {
|
||||||
"name": "Omotenashicoin Testnet",
|
"name": "Omotenashicoin Testnet",
|
||||||
"shortcut": "tMTNS",
|
"shortcut": "tMTNS",
|
||||||
"label": "Omotenashicoin Testnet",
|
"label": "Omotenashicoin Testnet",
|
||||||
"alias": "omotenashicoin_testnet"
|
"alias": "omotenashicoin_testnet"
|
||||||
},
|
},
|
||||||
"ports": {
|
"ports": {
|
||||||
"blockbook_internal": 19089,
|
"blockbook_internal": 19089,
|
||||||
"blockbook_public": 19189,
|
"blockbook_public": 19189,
|
||||||
"backend_rpc": 18089,
|
"backend_rpc": 18089,
|
||||||
"backend_message_queue": 48389
|
"backend_message_queue": 48389
|
||||||
},
|
},
|
||||||
"ipc": {
|
"ipc": {
|
||||||
"rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}",
|
"rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}",
|
||||||
"rpc_user": "rpc",
|
"rpc_user": "rpc",
|
||||||
"rpc_pass": "mtnsrpc",
|
"rpc_pass": "mtnsrpc",
|
||||||
"rpc_timeout": 25,
|
"rpc_timeout": 25,
|
||||||
"message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}"
|
"message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}"
|
||||||
},
|
},
|
||||||
"backend": {
|
"backend": {
|
||||||
"package_name": "backend-mtns-testnet",
|
"package_name": "backend-mtns-testnet",
|
||||||
"package_revision": "satoshilabs-1",
|
"package_revision": "satoshilabs-1",
|
||||||
"system_user": "mtns",
|
"system_user": "mtns",
|
||||||
"version": "1.7.3",
|
"version": "1.7.3",
|
||||||
"binary_url": "https://github.com/omotenashicoin-project/OmotenashiCoin-HDwalletbinaries/raw/master/stable/omotenashicoin-x86_64-linux-gnu.tar.gz",
|
"binary_url": "https://github.com/omotenashicoin-project/OmotenashiCoin-HDwalletbinaries/raw/master/stable/omotenashicoin-x86_64-linux-gnu.tar.gz",
|
||||||
"verification_type": "",
|
"verification_type": "",
|
||||||
"verification_source": "",
|
"verification_source": "",
|
||||||
"extract_command": "tar -C backend --strip 1 -xf",
|
"extract_command": "tar -C backend --strip 1 -xf",
|
||||||
"exclude_files": [
|
"exclude_files": ["bin/omotenashicoin-qt"],
|
||||||
"bin/omotenashicoin-qt"
|
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/omotenashicoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
||||||
],
|
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/testnet4/*.log",
|
||||||
"exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/omotenashicoind -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid",
|
"postinst_script_template": "",
|
||||||
"logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/testnet4/*.log",
|
"service_type": "forking",
|
||||||
"postinst_script_template": "",
|
"service_additional_params_template": "",
|
||||||
"service_type": "forking",
|
"protect_memory": true,
|
||||||
"service_additional_params_template": "",
|
"mainnet": false,
|
||||||
"protect_memory": true,
|
"server_config_file": "bitcoin_like.conf",
|
||||||
"mainnet": false,
|
"client_config_file": "bitcoin_like_client.conf",
|
||||||
"server_config_file": "bitcoin_like.conf",
|
"additional_params": {
|
||||||
"client_config_file": "bitcoin_like_client.conf",
|
"whitelist": "127.0.0.1"
|
||||||
"additional_params": {
|
}
|
||||||
"whitelist": "127.0.0.1"
|
},
|
||||||
}
|
"blockbook": {
|
||||||
},
|
"package_name": "blockbook-mtns-testnet",
|
||||||
"blockbook": {
|
"system_user": "blockbook-mtns",
|
||||||
"package_name": "blockbook-mtns-testnet",
|
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
||||||
"system_user": "blockbook-mtns",
|
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
||||||
"internal_binding_template": ":{{.Ports.BlockbookInternal}}",
|
"explorer_url": "",
|
||||||
"public_binding_template": ":{{.Ports.BlockbookPublic}}",
|
"additional_params": "",
|
||||||
"explorer_url": "",
|
"block_chain": {
|
||||||
"additional_params": "",
|
"parse": true,
|
||||||
"block_chain": {
|
"mempool_workers": 8,
|
||||||
"parse": true,
|
"mempool_sub_workers": 2,
|
||||||
"mempool_workers": 8,
|
"block_addresses_to_keep": 300,
|
||||||
"mempool_sub_workers": 2,
|
"xpub_magic": 70544129,
|
||||||
"block_addresses_to_keep": 300,
|
"slip44": 1
|
||||||
"xpub_magic": 70544129,
|
}
|
||||||
"slip44": 1,
|
},
|
||||||
"additional_params": {
|
"meta": {
|
||||||
"fiat_rates": "coingecko",
|
"package_maintainer": "omotenashicoin dev",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"omotenashicoin\", \"periodSeconds\": 60}"
|
"package_maintainer_email": "git@omotenashicoin.site"
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
"package_maintainer": "omotenashicoin dev",
|
|
||||||
"package_maintainer_email": "git@omotenashicoin.site"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,6 +57,7 @@
|
|||||||
"slip44": 232,
|
"slip44": 232,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"trezarcoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"trezarcoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -59,6 +59,7 @@
|
|||||||
"slip44": 28,
|
"slip44": 28,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"vertcoin\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"vertcoin\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,6 +57,7 @@
|
|||||||
"slip44": 133,
|
"slip44": 133,
|
||||||
"additional_params": {
|
"additional_params": {
|
||||||
"fiat_rates": "coingecko",
|
"fiat_rates": "coingecko",
|
||||||
|
"fiat_rates_vs_currencies": "AED,ARS,AUD,BDT,BHD,BMD,BRL,CAD,CHF,CLP,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,JPY,KRW,KWD,LKR,MMK,MXN,MYR,NGN,NOK,NZD,PHP,PKR,PLN,RUB,SAR,SEK,SGD,THB,TRY,TWD,UAH,USD,VEF,VND,ZAR,BTC,ETH",
|
||||||
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"zcash\", \"periodSeconds\": 900}"
|
"fiat_rates_params": "{\"url\": \"https://api.coingecko.com/api/v3\", \"coin\": \"zcash\", \"periodSeconds\": 900}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,17 +18,18 @@ import (
|
|||||||
|
|
||||||
// Coingecko is a structure that implements RatesDownloaderInterface
|
// Coingecko is a structure that implements RatesDownloaderInterface
|
||||||
type Coingecko struct {
|
type Coingecko struct {
|
||||||
url string
|
url string
|
||||||
coin string
|
coin string
|
||||||
platformIdentifier string
|
platformIdentifier string
|
||||||
platformVsCurrency string
|
platformVsCurrency string
|
||||||
httpTimeoutSeconds time.Duration
|
allowedVsCurrencies map[string]struct{}
|
||||||
throttlingDelay time.Duration
|
httpTimeout time.Duration
|
||||||
timeFormat string
|
throttlingDelay time.Duration
|
||||||
httpClient *http.Client
|
timeFormat string
|
||||||
db *db.RocksDB
|
httpClient *http.Client
|
||||||
updatingCurrent bool
|
db *db.RocksDB
|
||||||
updatingTokens bool
|
updatingCurrent bool
|
||||||
|
updatingTokens bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// simpleSupportedVSCurrencies https://api.coingecko.com/api/v3/simple/supported_vs_currencies
|
// simpleSupportedVSCurrencies https://api.coingecko.com/api/v3/simple/supported_vs_currencies
|
||||||
@ -50,21 +51,28 @@ type marketChartPrices struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewCoinGeckoDownloader creates a coingecko structure that implements the RatesDownloaderInterface
|
// NewCoinGeckoDownloader creates a coingecko structure that implements the RatesDownloaderInterface
|
||||||
func NewCoinGeckoDownloader(db *db.RocksDB, url string, coin string, platformIdentifier string, platformVsCurrency string, timeFormat string, throttleDown bool) RatesDownloaderInterface {
|
func NewCoinGeckoDownloader(db *db.RocksDB, url string, coin string, platformIdentifier string, platformVsCurrency string, allowedVsCurrencies string, timeFormat string, throttleDown bool) RatesDownloaderInterface {
|
||||||
var throttlingDelayMs int
|
var throttlingDelayMs int
|
||||||
if throttleDown {
|
if throttleDown {
|
||||||
throttlingDelayMs = 100
|
throttlingDelayMs = 100
|
||||||
}
|
}
|
||||||
httpTimeoutSeconds := 15 * time.Second
|
httpTimeout := 15 * time.Second
|
||||||
|
allowedVsCurrenciesMap := make(map[string]struct{})
|
||||||
|
if len(allowedVsCurrencies) > 0 {
|
||||||
|
for _, c := range strings.Split(strings.ToLower(allowedVsCurrencies), ",") {
|
||||||
|
allowedVsCurrenciesMap[c] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
return &Coingecko{
|
return &Coingecko{
|
||||||
url: url,
|
url: url,
|
||||||
coin: coin,
|
coin: coin,
|
||||||
platformIdentifier: platformIdentifier,
|
platformIdentifier: platformIdentifier,
|
||||||
platformVsCurrency: platformVsCurrency,
|
platformVsCurrency: platformVsCurrency,
|
||||||
httpTimeoutSeconds: httpTimeoutSeconds,
|
allowedVsCurrencies: allowedVsCurrenciesMap,
|
||||||
timeFormat: timeFormat,
|
httpTimeout: httpTimeout,
|
||||||
|
timeFormat: timeFormat,
|
||||||
httpClient: &http.Client{
|
httpClient: &http.Client{
|
||||||
Timeout: httpTimeoutSeconds,
|
Timeout: httpTimeout,
|
||||||
},
|
},
|
||||||
db: db,
|
db: db,
|
||||||
throttlingDelay: time.Duration(throttlingDelayMs) * time.Millisecond,
|
throttlingDelay: time.Duration(throttlingDelayMs) * time.Millisecond,
|
||||||
@ -123,7 +131,16 @@ func (cg *Coingecko) simpleSupportedVSCurrencies() (simpleSupportedVSCurrencies,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return data, nil
|
if len(cg.allowedVsCurrencies) == 0 {
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
filtered := make([]string, 0, len(cg.allowedVsCurrencies))
|
||||||
|
for _, c := range data {
|
||||||
|
if _, found := cg.allowedVsCurrencies[c]; found {
|
||||||
|
filtered = append(filtered, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filtered, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SimplePrice /simple/price Multiple ID and Currency (ids, vs_currencies)
|
// SimplePrice /simple/price Multiple ID and Currency (ids, vs_currencies)
|
||||||
|
|||||||
@ -33,7 +33,7 @@ type RatesDownloader struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewFiatRatesDownloader initializes the downloader for FiatRates API.
|
// NewFiatRatesDownloader initializes the downloader for FiatRates API.
|
||||||
func NewFiatRatesDownloader(db *db.RocksDB, apiType string, params string, callback OnNewFiatRatesTicker) (*RatesDownloader, error) {
|
func NewFiatRatesDownloader(db *db.RocksDB, apiType string, params string, allowedVsCurrencies string, callback OnNewFiatRatesTicker) (*RatesDownloader, error) {
|
||||||
var rd = &RatesDownloader{}
|
var rd = &RatesDownloader{}
|
||||||
type fiatRatesParams struct {
|
type fiatRatesParams struct {
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
@ -65,7 +65,7 @@ func NewFiatRatesDownloader(db *db.RocksDB, apiType string, params string, callb
|
|||||||
// a small hack - in tests the callback is not used, therefore there is no delay slowing the test
|
// a small hack - in tests the callback is not used, therefore there is no delay slowing the test
|
||||||
throttle = false
|
throttle = false
|
||||||
}
|
}
|
||||||
rd.downloader = NewCoinGeckoDownloader(db, rdParams.URL, rdParams.Coin, rdParams.PlatformIdentifier, rdParams.PlatformVsCurrency, rd.timeFormat, throttle)
|
rd.downloader = NewCoinGeckoDownloader(db, rdParams.URL, rdParams.Coin, rdParams.PlatformIdentifier, rdParams.PlatformVsCurrency, allowedVsCurrencies, rd.timeFormat, throttle)
|
||||||
if is != nil {
|
if is != nil {
|
||||||
is.HasFiatRates = true
|
is.HasFiatRates = true
|
||||||
is.HasTokenFiatRates = rd.downloadTokens
|
is.HasTokenFiatRates = rd.downloadTokens
|
||||||
|
|||||||
@ -148,7 +148,7 @@ func TestFiatRates(t *testing.T) {
|
|||||||
t.Fatalf("Error parsing FiatRates config - empty parameter")
|
t.Fatalf("Error parsing FiatRates config - empty parameter")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fiatRates, err := NewFiatRatesDownloader(d, config.FiatRates, config.FiatRatesParams, nil)
|
fiatRates, err := NewFiatRatesDownloader(d, config.FiatRates, config.FiatRatesParams, "", nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("FiatRates init error: %v", err)
|
t.Fatalf("FiatRates init error: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -373,6 +374,11 @@ func (s *PublicServer) newTemplateData(r *http.Request) *TemplateData {
|
|||||||
t.SecondaryCoin = strings.ToUpper(secondary)
|
t.SecondaryCoin = strings.ToUpper(secondary)
|
||||||
t.CurrentSecondaryCoinRate = float64(ticker.Rates[secondary])
|
t.CurrentSecondaryCoinRate = float64(ticker.Rates[secondary])
|
||||||
t.CurrentTicker = ticker
|
t.CurrentTicker = ticker
|
||||||
|
t.SecondaryCurrencies = make([]string, 0, len(ticker.Rates))
|
||||||
|
for k := range ticker.Rates {
|
||||||
|
t.SecondaryCurrencies = append(t.SecondaryCurrencies, strings.ToUpper(k))
|
||||||
|
}
|
||||||
|
sort.Strings(t.SecondaryCurrencies) // sort to get deterministic results
|
||||||
t.UseSecondaryCoin, _ = strconv.ParseBool(r.URL.Query().Get("use_secondary"))
|
t.UseSecondaryCoin, _ = strconv.ParseBool(r.URL.Query().Get("use_secondary"))
|
||||||
if !t.UseSecondaryCoin {
|
if !t.UseSecondaryCoin {
|
||||||
t.UseSecondaryCoin = cookieUseSecondary
|
t.UseSecondaryCoin = cookieUseSecondary
|
||||||
@ -501,6 +507,7 @@ type TemplateData struct {
|
|||||||
UseSecondaryCoin bool
|
UseSecondaryCoin bool
|
||||||
CurrentSecondaryCoinRate float64
|
CurrentSecondaryCoinRate float64
|
||||||
CurrentTicker *common.CurrencyRatesTicker
|
CurrentTicker *common.CurrencyRatesTicker
|
||||||
|
SecondaryCurrencies []string
|
||||||
TxDate string
|
TxDate string
|
||||||
TxSecondaryCoinRate float64
|
TxSecondaryCoinRate float64
|
||||||
TxTicker *common.CurrencyRatesTicker
|
TxTicker *common.CurrencyRatesTicker
|
||||||
@ -724,6 +731,13 @@ func appendAmountWrapperSpan(rv *strings.Builder, primary, symbol, classes strin
|
|||||||
rv.WriteString(`">`)
|
rv.WriteString(`">`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func formatSecondaryAmount(a float64, td *TemplateData) string {
|
||||||
|
if td.SecondaryCoin == "BTC" || td.SecondaryCoin == "ETH" {
|
||||||
|
return strconv.FormatFloat(a, 'f', 6, 64)
|
||||||
|
}
|
||||||
|
return strconv.FormatFloat(a, 'f', 2, 64)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *PublicServer) amountSpan(a *api.Amount, td *TemplateData, classes string) template.HTML {
|
func (s *PublicServer) amountSpan(a *api.Amount, td *TemplateData, classes string) template.HTML {
|
||||||
primary := s.formatAmount(a)
|
primary := s.formatAmount(a)
|
||||||
var rv strings.Builder
|
var rv strings.Builder
|
||||||
@ -732,7 +746,7 @@ func (s *PublicServer) amountSpan(a *api.Amount, td *TemplateData, classes strin
|
|||||||
if td.SecondaryCoin != "" {
|
if td.SecondaryCoin != "" {
|
||||||
p, err := strconv.ParseFloat(primary, 64)
|
p, err := strconv.ParseFloat(primary, 64)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
currentSecondary := strconv.FormatFloat(p*td.CurrentSecondaryCoinRate, 'f', 2, 64)
|
currentSecondary := formatSecondaryAmount(p*td.CurrentSecondaryCoinRate, td)
|
||||||
txSecondary := ""
|
txSecondary := ""
|
||||||
// if tx is specified, compute secondary amount is at the time of tx and amount with current rate is returned with class "csec-amt"
|
// if tx is specified, compute secondary amount is at the time of tx and amount with current rate is returned with class "csec-amt"
|
||||||
if td.Tx != nil {
|
if td.Tx != nil {
|
||||||
@ -748,7 +762,7 @@ func (s *PublicServer) amountSpan(a *api.Amount, td *TemplateData, classes strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if td.TxSecondaryCoinRate != 0 {
|
if td.TxSecondaryCoinRate != 0 {
|
||||||
txSecondary = strconv.FormatFloat(p*td.TxSecondaryCoinRate, 'f', 2, 64)
|
txSecondary = formatSecondaryAmount(p*td.TxSecondaryCoinRate, td)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if txSecondary != "" {
|
if txSecondary != "" {
|
||||||
@ -798,13 +812,13 @@ func (s *PublicServer) tokenAmountSpan(t *api.TokenTransfer, td *TemplateData, c
|
|||||||
if found {
|
if found {
|
||||||
base := p * baseRate
|
base := p * baseRate
|
||||||
currentBase = strconv.FormatFloat(base, 'f', 6, 64)
|
currentBase = strconv.FormatFloat(base, 'f', 6, 64)
|
||||||
currentSecondary = strconv.FormatFloat(base*td.CurrentSecondaryCoinRate, 'f', 2, 64)
|
currentSecondary = formatSecondaryAmount(base*td.CurrentSecondaryCoinRate, td)
|
||||||
}
|
}
|
||||||
baseRate, found = s.api.GetContractBaseRate(td.TxTicker, t.Contract, td.Tx.Blocktime)
|
baseRate, found = s.api.GetContractBaseRate(td.TxTicker, t.Contract, td.Tx.Blocktime)
|
||||||
if found {
|
if found {
|
||||||
base := p * baseRate
|
base := p * baseRate
|
||||||
txBase = strconv.FormatFloat(base, 'f', 6, 64)
|
txBase = strconv.FormatFloat(base, 'f', 6, 64)
|
||||||
txSecondary = strconv.FormatFloat(base*td.TxSecondaryCoinRate, 'f', 2, 64)
|
txSecondary = formatSecondaryAmount(base*td.TxSecondaryCoinRate, td)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if txBase != "" {
|
if txBase != "" {
|
||||||
@ -843,7 +857,7 @@ func (s *PublicServer) formattedAmountSpan(a *api.Amount, d int, symbol string,
|
|||||||
func (s *PublicServer) summaryValuesSpan(baseValue float64, secondaryValue float64, td *TemplateData) template.HTML {
|
func (s *PublicServer) summaryValuesSpan(baseValue float64, secondaryValue float64, td *TemplateData) template.HTML {
|
||||||
var rv strings.Builder
|
var rv strings.Builder
|
||||||
if secondaryValue > 0 {
|
if secondaryValue > 0 {
|
||||||
appendAmountSpan(&rv, "", strconv.FormatFloat(secondaryValue, 'f', 2, 64), td.SecondaryCoin, "")
|
appendAmountSpan(&rv, "", formatSecondaryAmount(secondaryValue, td), td.SecondaryCoin, "")
|
||||||
if baseValue > 0 && s.chainParser.GetChainType() == bchain.ChainEthereumType {
|
if baseValue > 0 && s.chainParser.GetChainType() == bchain.ChainEthereumType {
|
||||||
rv.WriteString(`<span class="base-value">(`)
|
rv.WriteString(`<span class="base-value">(`)
|
||||||
appendAmountSpan(&rv, "", strconv.FormatFloat(baseValue, 'f', 6, 64), td.CoinShortcut, "")
|
appendAmountSpan(&rv, "", strconv.FormatFloat(baseValue, 'f', 6, 64), td.CoinShortcut, "")
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -38,7 +38,7 @@ select {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#header {
|
#header {
|
||||||
position: absolute;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -46,10 +46,18 @@ select {
|
|||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
border: 0;
|
border-bottom: 1px solid #f6f6f6;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#header a {
|
||||||
|
color: var(--bs-navbar-brand-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#header a:hover {
|
||||||
|
color: var(--bs-navbar-brand-hover-color);
|
||||||
|
}
|
||||||
|
|
||||||
#header .navbar {
|
#header .navbar {
|
||||||
--bs-navbar-padding-y: 0.7rem;
|
--bs-navbar-padding-y: 0.7rem;
|
||||||
}
|
}
|
||||||
@ -63,6 +71,23 @@ select {
|
|||||||
min-height: 50px;
|
min-height: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#header .btn.dropdown-toggle {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header .dropdown-menu {
|
||||||
|
--bs-dropdown-min-width: 13rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header .dropdown-menu[data-bs-popper] {
|
||||||
|
left: initial;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header .dropdown-menu.show {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
.form-control:focus {
|
.form-control:focus {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
@ -77,7 +102,6 @@ select {
|
|||||||
|
|
||||||
.badge {
|
.badge {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.15));
|
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.15em;
|
letter-spacing: 0.15em;
|
||||||
--bs-badge-padding-x: 0.8rem;
|
--bs-badge-padding-x: 0.8rem;
|
||||||
@ -478,19 +502,18 @@ span.btn-paging:hover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.txerror {
|
.txerror {
|
||||||
background-color: #c51f13a0;
|
color: #c51f13;
|
||||||
color: white !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.txerror a,
|
.txerror a,
|
||||||
.txerror .txvalue {
|
.txerror .txvalue {
|
||||||
color: white;
|
color: #c51f13;
|
||||||
}
|
}
|
||||||
|
|
||||||
.txerror .copyable::before,
|
.txerror .copyable::before,
|
||||||
.txerror .copied::before {
|
.txerror .copied::before {
|
||||||
/* turn svg stroke to white */
|
/* turn svg stroke to red */
|
||||||
filter: hue-rotate(180deg) brightness(1000%) contrast(100%);
|
filter: invert(86%) sepia(43%) saturate(732%) hue-rotate(367deg) brightness(84%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tx-amt .amt:hover,
|
.tx-amt .amt:hover,
|
||||||
@ -619,6 +642,11 @@ span.btn-paging:hover {
|
|||||||
min-height: 40px;
|
min-height: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#header .dropdown-menu[data-bs-popper] {
|
||||||
|
left: 0;
|
||||||
|
right: initial;
|
||||||
|
}
|
||||||
|
|
||||||
.trezor-logo {
|
.trezor-logo {
|
||||||
top: 10px;
|
top: 10px;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,6 +48,12 @@
|
|||||||
<label class="btn" for="primary-coin">{{.CoinShortcut}}</label>
|
<label class="btn" for="primary-coin">{{.CoinShortcut}}</label>
|
||||||
<input type="radio" class="btn-check" name="btnradio" id="secondary-coin" autocomplete="off"{{if .UseSecondaryCoin}} checked{{end}}>
|
<input type="radio" class="btn-check" name="btnradio" id="secondary-coin" autocomplete="off"{{if .UseSecondaryCoin}} checked{{end}}>
|
||||||
<label class="btn" for="secondary-coin">{{.SecondaryCoin}}</label>
|
<label class="btn" for="secondary-coin">{{.SecondaryCoin}}</label>
|
||||||
|
<button type="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"></button>
|
||||||
|
<div class="dropdown-menu row">
|
||||||
|
{{range $c := .SecondaryCurrencies}}
|
||||||
|
<div class="col-3"><a href="?secondary={{$c}}&use_secondary=true">{{$c}}</a></div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -143,4 +143,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span class="text-muted">{{$bb.About}}</span>
|
<span class="text-muted">{{$bb.About}}</span>
|
||||||
|
{{if .SecondaryCoin}}<span class="text-muted">Exchange rates provided by Coingecko.</span>{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
@ -1,17 +1,17 @@
|
|||||||
{{define "txdetail"}}{{$cs := .CoinShortcut}}{{$addr := .AddrStr}}{{$tx := .Tx}}{{$data := .}}
|
{{define "txdetail"}}{{$cs := .CoinShortcut}}{{$addr := .AddrStr}}{{$tx := .Tx}}{{$data := .}}
|
||||||
<div class="tx-detail">
|
<div class="tx-detail">
|
||||||
<div class="row head{{if eq $tx.EthereumSpecific.Status 0}} txerror{{end}}">
|
<div class="row head">
|
||||||
<div class="col-xs-7 col-md-8">
|
<div class="col-xs-7 col-md-8{{if eq $tx.EthereumSpecific.Status 0}} txerror{{end}}">
|
||||||
<a href="/tx/{{$tx.Txid}}" class="ellipsis copyable txid">{{$tx.Txid}}</a>
|
<a href="/tx/{{$tx.Txid}}" class="ellipsis copyable txid">{{$tx.Txid}}</a>
|
||||||
{{if $tx.Rbf}}<span class="ps-1" tt="Replace-by-Fee (RBF) transaction, could be overridden"> RBF</span>{{end}}
|
{{if $tx.Rbf}}<span class="ps-1" tt="Replace-by-Fee (RBF) transaction, could be overridden"> RBF</span>{{end}}
|
||||||
</div>
|
</div>
|
||||||
{{if $tx.Blocktime}}<div class="col-xs-5 col-md-4 text-end">{{if $tx.Confirmations}}mined{{else}}first seen{{end}} <span class="txvalue ms-1">{{unixTimeSpan $tx.Blocktime}}</span></div>{{end}}
|
{{if $tx.Blocktime}}<div class="col-xs-5 col-md-4 text-end">{{if $tx.Confirmations}}mined{{else}}first seen{{end}} <span class="txvalue ms-1">{{unixTimeSpan $tx.Blocktime}}</span></div>{{end}}
|
||||||
|
{{if eq $tx.EthereumSpecific.Status 0}}<div class="col-12 txerror pb-1"><span class="badge bg-danger">Failed</span>{{if $tx.EthereumSpecific.Error}}<span class="small ms-1">{{$tx.EthereumSpecific.Error}}</span>{{end}}</div>{{end}}
|
||||||
{{if $tx.EthereumSpecific.ParsedData}}
|
{{if $tx.EthereumSpecific.ParsedData}}
|
||||||
{{if $tx.EthereumSpecific.ParsedData.Name}}<div class="col-12 small"><span class="txvalue">{{$tx.EthereumSpecific.ParsedData.Name}}</span>{{if $tx.EthereumSpecific.ParsedData.MethodId}}<span class="ms-1" tt="4-byte signature"> ({{$tx.EthereumSpecific.ParsedData.MethodId}})</span>{{end}}</div>{{else}}
|
{{if $tx.EthereumSpecific.ParsedData.Name}}<div class="col-12 small"><span class="txvalue">{{$tx.EthereumSpecific.ParsedData.Name}}</span>{{if $tx.EthereumSpecific.ParsedData.MethodId}}<span class="ms-1" tt="4-byte signature"> ({{$tx.EthereumSpecific.ParsedData.MethodId}})</span>{{end}}</div>{{else}}
|
||||||
{{if $tx.EthereumSpecific.ParsedData.MethodId}}<div class="col-12 small txvalue"><span tt="4-byte signature">{{$tx.EthereumSpecific.ParsedData.MethodId}}</span></div>{{end}}
|
{{if $tx.EthereumSpecific.ParsedData.MethodId}}<div class="col-12 small txvalue"><span tt="4-byte signature">{{$tx.EthereumSpecific.ParsedData.MethodId}}</span></div>{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if eq $tx.EthereumSpecific.Status 0}}<div col-12><span class="badge bg-danger">Failed</span>{{if $tx.EthereumSpecific.Error}}<span class="small ms-1">{{$tx.EthereumSpecific.Error}}</span>{{end}}</div>{{end}}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row body">
|
<div class="row body">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
@ -184,12 +184,12 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
<div class="row footer">
|
<div class="row footer">
|
||||||
<div class="col-sm-12 col-md-4">
|
<div class="col-sm-12 col-md-6">
|
||||||
{{if $tx.FeesSat}}
|
{{if $tx.FeesSat}}
|
||||||
Fee {{amountSpan $tx.FeesSat $data "txvalue copyable ms-3"}}
|
Fee {{amountSpan $tx.FeesSat $data "txvalue copyable ms-3"}} <span class="fw-normal small">({{amountSatsSpan $tx.EthereumSpecific.GasPrice $data ""}} Gwei/gas)</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-8 text-end">
|
<div class="col-sm-12 col-md-6 text-end">
|
||||||
<span class="me-4">
|
<span class="me-4">
|
||||||
{{if $tx.Confirmations}}
|
{{if $tx.Confirmations}}
|
||||||
<span class="txvalue">{{formatUint32 $tx.Confirmations}}</span> confirmations
|
<span class="txvalue">{{formatUint32 $tx.Confirmations}}</span> confirmations
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user