diff --git a/api/worker.go b/api/worker.go
index 6954c99b..d478f85c 100644
--- a/api/worker.go
+++ b/api/worker.go
@@ -207,6 +207,11 @@ func (w *Worker) GetTransaction(txid string, spendingTxs bool, specificJSON bool
return tx, nil
}
+// GetRawTransaction gets raw transaction data in hex format from txid
+func (w *Worker) GetRawTransaction(txid string) (string, error) {
+ return w.chain.EthereumTypeGetRawTransaction(txid)
+}
+
// getTransaction reads transaction data from txid
func (w *Worker) getTransaction(txid string, spendingTxs bool, specificJSON bool, addresses map[string]struct{}) (*Tx, error) {
bchainTx, height, err := w.txCache.GetTransaction(txid)
diff --git a/bchain/basechain.go b/bchain/basechain.go
index c84f907f..e6da4281 100644
--- a/bchain/basechain.go
+++ b/bchain/basechain.go
@@ -81,3 +81,7 @@ func (b *BaseChain) EthereumTypeGetStakingPoolsData(addrDesc AddressDescriptor)
func (b *BaseChain) EthereumTypeRpcCall(data, to, from string) (string, error) {
return "", errors.New("not supported")
}
+
+func (b *BaseChain) EthereumTypeGetRawTransaction(txid string) (string, error) {
+ return "", errors.New("not supported")
+}
diff --git a/bchain/coins/blockchain.go b/bchain/coins/blockchain.go
index f3dac986..77e7206a 100644
--- a/bchain/coins/blockchain.go
+++ b/bchain/coins/blockchain.go
@@ -354,6 +354,11 @@ func (c *blockChainWithMetrics) EthereumTypeRpcCall(data, to, from string) (v st
return c.b.EthereumTypeRpcCall(data, to, from)
}
+func (c *blockChainWithMetrics) EthereumTypeGetRawTransaction(txid string) (v string, err error) {
+ defer func(s time.Time) { c.observeRPCLatency("EthereumTypeGetRawTransaction", s, err) }(time.Now())
+ return c.b.EthereumTypeGetRawTransaction(txid)
+}
+
type mempoolWithMetrics struct {
mempool bchain.Mempool
m *common.Metrics
diff --git a/bchain/coins/eth/ethrpc.go b/bchain/coins/eth/ethrpc.go
index c2c5b111..1412b0e7 100644
--- a/bchain/coins/eth/ethrpc.go
+++ b/bchain/coins/eth/ethrpc.go
@@ -40,6 +40,7 @@ const (
type Configuration struct {
CoinName string `json:"coin_name"`
CoinShortcut string `json:"coin_shortcut"`
+ Network string `json:"network"`
RPCURL string `json:"rpc_url"`
RPCTimeout int `json:"rpc_timeout"`
BlockAddressesToKeep int `json:"block_addresses_to_keep"`
@@ -159,7 +160,12 @@ func (b *EthereumRPC) Initialize() error {
return errors.Errorf("Unknown network id %v", id)
}
- err = b.initStakingPools(b.ChainConfig.CoinShortcut)
+ networkConfig := b.ChainConfig.Network
+ if networkConfig == "" {
+ networkConfig = b.ChainConfig.CoinShortcut
+ }
+
+ err = b.initStakingPools(networkConfig)
if err != nil {
return err
}
@@ -988,21 +994,31 @@ func (b *EthereumRPC) EthereumTypeEstimateGas(params map[string]interface{}) (ui
// SendRawTransaction sends raw transaction
func (b *EthereumRPC) SendRawTransaction(hex string) (string, error) {
+ return b.callRpcStringResult("eth_sendRawTransaction", hex)
+}
+
+// EthereumTypeGetRawTransaction gets raw transaction in hex format
+func (b *EthereumRPC) EthereumTypeGetRawTransaction(txid string) (string, error) {
+ return b.callRpcStringResult("eth_getRawTransactionByHash", txid)
+}
+
+// Helper function for calling ETH RPC with parameters and getting string result
+func (b *EthereumRPC) callRpcStringResult(rpcMethod string, args ...interface{}) (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), b.Timeout)
defer cancel()
var raw json.RawMessage
- err := b.RPC.CallContext(ctx, &raw, "eth_sendRawTransaction", hex)
+ err := b.RPC.CallContext(ctx, &raw, rpcMethod, args...)
if err != nil {
return "", err
} else if len(raw) == 0 {
- return "", errors.New("SendRawTransaction: failed")
+ return "", errors.New(rpcMethod + " : failed")
}
var result string
if err := json.Unmarshal(raw, &result); err != nil {
return "", errors.Annotatef(err, "raw result %v", raw)
}
if result == "" {
- return "", errors.New("SendRawTransaction: failed, empty result")
+ return "", errors.New(rpcMethod + " : failed, empty result")
}
return result, nil
}
diff --git a/bchain/coins/eth/stakingpool.go b/bchain/coins/eth/stakingpool.go
index 8b7cf7b8..f773dae9 100644
--- a/bchain/coins/eth/stakingpool.go
+++ b/bchain/coins/eth/stakingpool.go
@@ -11,9 +11,9 @@ import (
"github.com/trezor/blockbook/bchain"
)
-func (b *EthereumRPC) initStakingPools(coinShortcut string) error {
+func (b *EthereumRPC) initStakingPools(network string) error {
// for now only single staking pool
- envVar := strings.ToUpper(coinShortcut) + "_STAKING_POOL_CONTRACT"
+ envVar := strings.ToUpper(network) + "_STAKING_POOL_CONTRACT"
envValue := os.Getenv(envVar)
if envValue != "" {
parts := strings.Split(envValue, "/")
diff --git a/bchain/types.go b/bchain/types.go
index b33a5834..8f1c2543 100644
--- a/bchain/types.go
+++ b/bchain/types.go
@@ -337,6 +337,7 @@ type BlockChain interface {
EthereumTypeGetSupportedStakingPools() []string
EthereumTypeGetStakingPoolsData(addrDesc AddressDescriptor) ([]StakingPoolData, error)
EthereumTypeRpcCall(data, to, from string) (string, error)
+ EthereumTypeGetRawTransaction(txid string) (string, error)
GetTokenURI(contractDesc AddressDescriptor, tokenID *big.Int) (string, error)
}
diff --git a/blockbook.go b/blockbook.go
index a0065ec6..6675aec3 100644
--- a/blockbook.go
+++ b/blockbook.go
@@ -507,7 +507,7 @@ func newInternalState(config *common.Config, d *db.RocksDB, enableSubNewTx bool)
is.Host = name
}
- is.WsGetAccountInfoLimit, _ = strconv.Atoi(os.Getenv(strings.ToUpper(is.CoinShortcut) + "_WS_GETACCOUNTINFO_LIMIT"))
+ is.WsGetAccountInfoLimit, _ = strconv.Atoi(os.Getenv(strings.ToUpper(is.GetNetwork()) + "_WS_GETACCOUNTINFO_LIMIT"))
if is.WsGetAccountInfoLimit > 0 {
glog.Info("WsGetAccountInfoLimit enabled with limit ", is.WsGetAccountInfoLimit)
is.WsLimitExceedingIPs = make(map[string]int)
diff --git a/configs/coins/arbitrum.json b/configs/coins/arbitrum.json
index 223fa6f9..b1f01711 100644
--- a/configs/coins/arbitrum.json
+++ b/configs/coins/arbitrum.json
@@ -1,65 +1,66 @@
{
- "coin": {
- "name": "Arbitrum",
- "shortcut": "ETH",
- "label": "Arbitrum",
- "alias": "arbitrum"
- },
- "ports": {
- "backend_rpc": 8205,
- "backend_p2p": 38405,
- "backend_http": 8305,
- "blockbook_internal": 9205,
- "blockbook_public": 9305
- },
- "ipc": {
- "rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
- "rpc_timeout": 25
- },
- "backend": {
- "package_name": "backend-arbitrum",
- "package_revision": "satoshilabs-1",
- "system_user": "arbitrum",
- "version": "3.2.1",
- "docker_image": "offchainlabs/nitro-node:v3.2.1-d81324d",
- "verification_type": "docker",
- "verification_source": "724ebdcca39cd0c28ffd025ecea8d1622a376f41344201b729afb60352cbc306",
- "extract_command": "docker cp extract:/home/user/target backend/target; docker cp extract:/home/user/nitro-legacy backend/nitro-legacy; docker cp extract:/usr/local/bin/nitro backend/nitro",
- "exclude_files": [],
- "exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/arbitrum_exec.sh 2>> {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
- "exec_script": "arbitrum.sh",
- "logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
- "postinst_script_template": "openssl rand -hex 32 > {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/jwtsecret",
- "service_type": "simple",
- "service_additional_params_template": "",
- "protect_memory": true,
- "mainnet": true,
- "server_config_file": "",
- "client_config_file": ""
- },
- "blockbook": {
- "package_name": "blockbook-arbitrum",
- "system_user": "blockbook-arbitrum",
- "internal_binding_template": ":{{.Ports.BlockbookInternal}}",
- "public_binding_template": ":{{.Ports.BlockbookPublic}}",
- "explorer_url": "",
- "additional_params": "",
- "block_chain": {
- "parse": true,
- "mempool_workers": 8,
- "mempool_sub_workers": 2,
- "block_addresses_to_keep": 300,
- "additional_params": {
- "mempoolTxTimeoutHours": 48,
- "queryBackendOnMempoolResync": false,
- "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}"
- }
+ "coin": {
+ "name": "Arbitrum",
+ "shortcut": "ETH",
+ "network": "ARB",
+ "label": "Arbitrum",
+ "alias": "arbitrum"
+ },
+ "ports": {
+ "backend_rpc": 8205,
+ "backend_p2p": 38405,
+ "backend_http": 8305,
+ "blockbook_internal": 9205,
+ "blockbook_public": 9305
+ },
+ "ipc": {
+ "rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
+ "rpc_timeout": 25
+ },
+ "backend": {
+ "package_name": "backend-arbitrum",
+ "package_revision": "satoshilabs-1",
+ "system_user": "arbitrum",
+ "version": "3.2.1",
+ "docker_image": "offchainlabs/nitro-node:v3.2.1-d81324d",
+ "verification_type": "docker",
+ "verification_source": "724ebdcca39cd0c28ffd025ecea8d1622a376f41344201b729afb60352cbc306",
+ "extract_command": "docker cp extract:/home/user/target backend/target; docker cp extract:/home/user/nitro-legacy backend/nitro-legacy; docker cp extract:/usr/local/bin/nitro backend/nitro",
+ "exclude_files": [],
+ "exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/arbitrum_exec.sh 2>> {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
+ "exec_script": "arbitrum.sh",
+ "logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
+ "postinst_script_template": "openssl rand -hex 32 > {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/jwtsecret",
+ "service_type": "simple",
+ "service_additional_params_template": "",
+ "protect_memory": true,
+ "mainnet": true,
+ "server_config_file": "",
+ "client_config_file": ""
+ },
+ "blockbook": {
+ "package_name": "blockbook-arbitrum",
+ "system_user": "blockbook-arbitrum",
+ "internal_binding_template": ":{{.Ports.BlockbookInternal}}",
+ "public_binding_template": ":{{.Ports.BlockbookPublic}}",
+ "explorer_url": "",
+ "additional_params": "",
+ "block_chain": {
+ "parse": true,
+ "mempool_workers": 8,
+ "mempool_sub_workers": 2,
+ "block_addresses_to_keep": 300,
+ "additional_params": {
+ "mempoolTxTimeoutHours": 48,
+ "queryBackendOnMempoolResync": false,
+ "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}"
+ }
+ }
+ },
+ "meta": {
+ "package_maintainer": "IT",
+ "package_maintainer_email": "it@satoshilabs.com"
}
- },
- "meta": {
- "package_maintainer": "IT",
- "package_maintainer_email": "it@satoshilabs.com"
- }
}
diff --git a/configs/coins/arbitrum_archive.json b/configs/coins/arbitrum_archive.json
index 4d672f80..f01d6c67 100644
--- a/configs/coins/arbitrum_archive.json
+++ b/configs/coins/arbitrum_archive.json
@@ -1,67 +1,68 @@
{
- "coin": {
- "name": "Arbitrum Archive",
- "shortcut": "ETH",
- "label": "Arbitrum",
- "alias": "arbitrum_archive"
- },
- "ports": {
- "backend_rpc": 8306,
- "backend_p2p": 38406,
- "blockbook_internal": 9206,
- "blockbook_public": 9306
- },
- "ipc": {
- "rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
- "rpc_timeout": 25
- },
- "backend": {
- "package_name": "backend-arbitrum-archive",
- "package_revision": "satoshilabs-1",
- "system_user": "arbitrum",
- "version": "3.2.1",
- "docker_image": "offchainlabs/nitro-node:v3.2.1-d81324d",
- "verification_type": "docker",
- "verification_source": "724ebdcca39cd0c28ffd025ecea8d1622a376f41344201b729afb60352cbc306",
- "extract_command": "docker cp extract:/home/user/target backend/target; docker cp extract:/home/user/nitro-legacy backend/nitro-legacy; docker cp extract:/usr/local/bin/nitro backend/nitro",
- "exclude_files": [],
- "exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/arbitrum_archive_exec.sh 2>> {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
- "exec_script": "arbitrum_archive.sh",
- "logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
- "postinst_script_template": "openssl rand -hex 32 > {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/jwtsecret",
- "service_type": "simple",
- "service_additional_params_template": "",
- "protect_memory": true,
- "mainnet": true,
- "server_config_file": "",
- "client_config_file": ""
- },
- "blockbook": {
- "package_name": "blockbook-arbitrum-archive",
- "system_user": "blockbook-arbitrum",
- "internal_binding_template": ":{{.Ports.BlockbookInternal}}",
- "public_binding_template": ":{{.Ports.BlockbookPublic}}",
- "explorer_url": "",
- "additional_params": "-workers=16",
- "block_chain": {
- "parse": true,
- "mempool_workers": 8,
- "mempool_sub_workers": 2,
- "block_addresses_to_keep": 600,
- "additional_params": {
- "address_aliases": true,
- "mempoolTxTimeoutHours": 48,
- "processInternalTransactions": true,
- "queryBackendOnMempoolResync": false,
- "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}",
- "fourByteSignatures": "https://www.4byte.directory/api/v1/signatures/"
- }
+ "coin": {
+ "name": "Arbitrum Archive",
+ "shortcut": "ETH",
+ "network": "ARB",
+ "label": "Arbitrum",
+ "alias": "arbitrum_archive"
+ },
+ "ports": {
+ "backend_rpc": 8306,
+ "backend_p2p": 38406,
+ "blockbook_internal": 9206,
+ "blockbook_public": 9306
+ },
+ "ipc": {
+ "rpc_url_template": "ws://127.0.0.1:{{.Ports.BackendRPC}}",
+ "rpc_timeout": 25
+ },
+ "backend": {
+ "package_name": "backend-arbitrum-archive",
+ "package_revision": "satoshilabs-1",
+ "system_user": "arbitrum",
+ "version": "3.2.1",
+ "docker_image": "offchainlabs/nitro-node:v3.2.1-d81324d",
+ "verification_type": "docker",
+ "verification_source": "724ebdcca39cd0c28ffd025ecea8d1622a376f41344201b729afb60352cbc306",
+ "extract_command": "docker cp extract:/home/user/target backend/target; docker cp extract:/home/user/nitro-legacy backend/nitro-legacy; docker cp extract:/usr/local/bin/nitro backend/nitro",
+ "exclude_files": [],
+ "exec_command_template": "/bin/sh -c '{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/arbitrum_archive_exec.sh 2>> {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log'",
+ "exec_script": "arbitrum_archive.sh",
+ "logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/{{.Coin.Alias}}.log",
+ "postinst_script_template": "openssl rand -hex 32 > {{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/jwtsecret",
+ "service_type": "simple",
+ "service_additional_params_template": "",
+ "protect_memory": true,
+ "mainnet": true,
+ "server_config_file": "",
+ "client_config_file": ""
+ },
+ "blockbook": {
+ "package_name": "blockbook-arbitrum-archive",
+ "system_user": "blockbook-arbitrum",
+ "internal_binding_template": ":{{.Ports.BlockbookInternal}}",
+ "public_binding_template": ":{{.Ports.BlockbookPublic}}",
+ "explorer_url": "",
+ "additional_params": "-workers=16",
+ "block_chain": {
+ "parse": true,
+ "mempool_workers": 8,
+ "mempool_sub_workers": 2,
+ "block_addresses_to_keep": 600,
+ "additional_params": {
+ "address_aliases": true,
+ "mempoolTxTimeoutHours": 48,
+ "processInternalTransactions": true,
+ "queryBackendOnMempoolResync": false,
+ "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}",
+ "fourByteSignatures": "https://www.4byte.directory/api/v1/signatures/"
+ }
+ }
+ },
+ "meta": {
+ "package_maintainer": "IT",
+ "package_maintainer_email": "it@satoshilabs.com"
}
- },
- "meta": {
- "package_maintainer": "IT",
- "package_maintainer_email": "it@satoshilabs.com"
- }
}
diff --git a/configs/coins/bsc.json b/configs/coins/bsc.json
index 8d15e80d..db599b3a 100644
--- a/configs/coins/bsc.json
+++ b/configs/coins/bsc.json
@@ -2,7 +2,7 @@
"coin": {
"name": "BNB Smart Chain",
"shortcut": "BNB",
- "network": "BNB",
+ "network": "BSC",
"label": "BNB Smart Chain",
"alias": "bsc"
},
diff --git a/configs/coins/bsc_archive.json b/configs/coins/bsc_archive.json
index df80c6d0..0b460876 100644
--- a/configs/coins/bsc_archive.json
+++ b/configs/coins/bsc_archive.json
@@ -2,7 +2,7 @@
"coin": {
"name": "BNB Smart Chain Archive",
"shortcut": "BNB",
- "network": "BNB",
+ "network": "BSC",
"label": "BNB Smart Chain",
"alias": "bsc_archive"
},
diff --git a/fiat/coingecko.go b/fiat/coingecko.go
index b7e89708..68c7722c 100644
--- a/fiat/coingecko.go
+++ b/fiat/coingecko.go
@@ -59,7 +59,7 @@ type marketChartPrices struct {
}
// NewCoinGeckoDownloader creates a coingecko structure that implements the RatesDownloaderInterface
-func NewCoinGeckoDownloader(db *db.RocksDB, coinShortcut string, url string, coin string, platformIdentifier string, platformVsCurrency string, allowedVsCurrencies string, timeFormat string, metrics *common.Metrics, throttleDown bool) RatesDownloaderInterface {
+func NewCoinGeckoDownloader(db *db.RocksDB, network string, url string, coin string, platformIdentifier string, platformVsCurrency string, allowedVsCurrencies string, timeFormat string, metrics *common.Metrics, throttleDown bool) RatesDownloaderInterface {
throttlingDelayMs := 0 // No delay by default
if throttleDown {
throttlingDelayMs = DefaultThrottleDelayMs
@@ -67,7 +67,7 @@ func NewCoinGeckoDownloader(db *db.RocksDB, coinShortcut string, url string, coi
allowedVsCurrenciesMap := getAllowedVsCurrenciesMap(allowedVsCurrencies)
- apiKey := os.Getenv(strings.ToUpper(coinShortcut) + "_COINGECKO_API_KEY")
+ apiKey := os.Getenv(strings.ToUpper(network) + "_COINGECKO_API_KEY")
if apiKey == "" {
apiKey = os.Getenv("COINGECKO_API_KEY")
}
diff --git a/server/public.go b/server/public.go
index 05e8f477..e2d8c119 100644
--- a/server/public.go
+++ b/server/public.go
@@ -186,6 +186,7 @@ func (s *PublicServer) ConnectFullPublicInterface() {
serveMux.HandleFunc(path+"api/block-filters/", s.jsonHandler(s.apiBlockFilters, apiDefault))
serveMux.HandleFunc(path+"api/tx-specific/", s.jsonHandler(s.apiTxSpecific, apiDefault))
serveMux.HandleFunc(path+"api/tx/", s.jsonHandler(s.apiTx, apiDefault))
+ serveMux.HandleFunc(path+"api/rawtx/", s.jsonHandler(s.apiRawTx, apiDefault))
serveMux.HandleFunc(path+"api/address/", s.jsonHandler(s.apiAddress, apiDefault))
serveMux.HandleFunc(path+"api/xpub/", s.jsonHandler(s.apiXpub, apiDefault))
serveMux.HandleFunc(path+"api/utxo/", s.jsonHandler(s.apiUtxo, apiDefault))
@@ -303,7 +304,7 @@ func (s *PublicServer) newTemplateData(r *http.Request) *TemplateData {
t.MultiTokenName = bchain.EthereumTokenTypeMap[bchain.MultiToken]
}
if !s.debug {
- t.Minified = ".min.3"
+ t.Minified = ".min.4"
}
if s.is.HasFiatRates {
// get the secondary coin and if it should be shown either from query parameters "secondary" and "use_secondary"
@@ -1288,6 +1289,19 @@ func (s *PublicServer) apiTx(r *http.Request, apiVersion int) (interface{}, erro
return tx, err
}
+func (s *PublicServer) apiRawTx(r *http.Request, apiVersion int) (interface{}, error) {
+ var txid string
+ i := strings.LastIndexByte(r.URL.Path, '/')
+ if i > 0 {
+ txid = r.URL.Path[i+1:]
+ }
+ if len(txid) == 0 {
+ return "", api.NewAPIError("Missing txid", true)
+ }
+ s.metrics.ExplorerViews.With(common.Labels{"action": "api-raw-tx"}).Inc()
+ return s.api.GetRawTransaction(txid)
+}
+
func (s *PublicServer) apiTxSpecific(r *http.Request, apiVersion int) (interface{}, error) {
var txid string
i := strings.LastIndexByte(r.URL.Path, '/')
diff --git a/server/public_ethereumtype_test.go b/server/public_ethereumtype_test.go
index 5a953533..a0714f47 100644
--- a/server/public_ethereumtype_test.go
+++ b/server/public_ethereumtype_test.go
@@ -26,7 +26,7 @@ func httpTestsEthereumType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `
Trezor Fake Coin ExplorerAddress address7b.eth
0x7B62EB7fe80350DC7EC945C0B73242cb9877FB1b
0.000000000123450123 FAKE
0.00 USD
Confirmed | |
| Balance | 0.000000000123450123 FAKE0.00 USD |
| Transactions | 2 |
| Non-contract Transactions | 0 |
| Internal Transactions | 0 |
| Nonce | 123 |
Transactions
ERC20 Token Transfers
7.675000000000000001 S13-
7.674999999999991915 S13-
`,
+ `Trezor Fake Coin ExplorerAddress address7b.eth
0x7B62EB7fe80350DC7EC945C0B73242cb9877FB1b
0.000000000123450123 FAKE
0.00 USD
Confirmed | |
| Balance | 0.000000000123450123 FAKE0.00 USD |
| Transactions | 2 |
| Non-contract Transactions | 0 |
| Internal Transactions | 0 |
| Nonce | 123 |
Transactions
ERC20 Token Transfers
7.675000000000000001 S13-
7.674999999999991915 S13-
`,
},
},
{
@@ -35,7 +35,7 @@ func httpTestsEthereumType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerAddress
0x5Dc6288b35E0807A3d6fEB89b3a2Ff4aB773168e
0.000000000123450093 FAKE
0.00 USD
Confirmed | |
| Balance | 0.000000000123450093 FAKE0.00 USD |
| Transactions | 1 |
| Non-contract Transactions | 1 |
| Internal Transactions | 0 |
| Nonce | 93 |
Transactions
0x5Dc6288b35E0807A3d6fEB89b3a2Ff4aB773168e
0 FAKE0.00 USD0.00 USD
ERC1155 Token Transfers
0x5Dc6288b35E0807A3d6fEB89b3a2Ff4aB773168e
`,
+ `Trezor Fake Coin ExplorerAddress
0x5Dc6288b35E0807A3d6fEB89b3a2Ff4aB773168e
0.000000000123450093 FAKE
0.00 USD
Confirmed | |
| Balance | 0.000000000123450093 FAKE0.00 USD |
| Transactions | 1 |
| Non-contract Transactions | 1 |
| Internal Transactions | 0 |
| Nonce | 93 |
Transactions
0x5Dc6288b35E0807A3d6fEB89b3a2Ff4aB773168e
0 FAKE0.00 USD0.00 USD
ERC1155 Token Transfers
0x5Dc6288b35E0807A3d6fEB89b3a2Ff4aB773168e
`,
},
},
{
@@ -44,14 +44,14 @@ func httpTestsEthereumType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerTransaction
0xa9cd088aba2131000da6f38a33c20169baee476218deea6b78720700b895b101
| In Block | Unconfirmed |
| Status | Success |
| Value | 0 FAKE0.00 USD0.00 USD |
| Gas Used / Limit | 52025 / 78037 |
| Gas Price | 0.00000004 FAKE0.00 USD0.00 USD (40 Gwei) |
| Fees | 0.002081 FAKE4.16 USD18.55 USD |
| RBF | ON |
| Nonce | 208 |
`,
+ `Trezor Fake Coin ExplorerTransaction
0xa9cd088aba2131000da6f38a33c20169baee476218deea6b78720700b895b101
| In Block | Unconfirmed |
| Status | Success |
| Value | 0 FAKE0.00 USD0.00 USD |
| Gas Used / Limit | 52025 / 78037 |
| Gas Price | 0.00000004 FAKE0.00 USD0.00 USD (40 Gwei) |
| Fees | 0.002081 FAKE4.16 USD18.55 USD |
| RBF | ON |
| Nonce | 208 |
`,
},
}, {
name: "explorerTokenDetail " + dbtestdata.EthAddr7b,
r: newGetRequest(ts.URL + "/nft/" + dbtestdata.EthAddrContractCd + "/" + "1"),
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
- body: []string{`Trezor Fake Coin Explorer`},
+ body: []string{`Trezor Fake Coin Explorer`},
},
{
name: "apiIndex",
diff --git a/server/public_test.go b/server/public_test.go
index 01e34e9b..550afefe 100644
--- a/server/public_test.go
+++ b/server/public_test.go
@@ -283,7 +283,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerTransaction
fdd824a780cbb718eeb766eb05d83fdefc793a27082cd5e67f856d69798cf7db
| Mined Time | 1639 days 11 hours ago |
| In Block | 00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6 |
| In Block Height | 225494 |
| Total Input | 0 FAKE |
| Total Output | 13.60030331 FAKE |
| Fees | 0 FAKE |
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
+ `Trezor Fake Coin ExplorerTransaction
fdd824a780cbb718eeb766eb05d83fdefc793a27082cd5e67f856d69798cf7db
| Mined Time | 1639 days 11 hours ago |
| In Block | 00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6 |
| In Block Height | 225494 |
| Total Input | 0 FAKE |
| Total Output | 13.60030331 FAKE |
| Fees | 0 FAKE |
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
},
},
{
@@ -292,7 +292,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerAddress
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz
0.00012345 FAKE
Confirmed | |
| Total Received | 0.00024690 FAKE |
| Total Sent | 0.00012345 FAKE |
| Final Balance | 0.00012345 FAKE |
| No. Transactions | 2 |
Transactions
mined 1639 days 11 hours ago
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE
OP_RETURN 2020f1686f6a200 FAKE×
mined 1640 days 9 hours ago
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE→ mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE×
`,
+ `Trezor Fake Coin ExplorerAddress
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz
0.00012345 FAKE
Confirmed | |
| Total Received | 0.00024690 FAKE |
| Total Sent | 0.00012345 FAKE |
| Final Balance | 0.00012345 FAKE |
| No. Transactions | 2 |
Transactions
mined 1639 days 11 hours ago
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE
OP_RETURN 2020f1686f6a200 FAKE×
mined 1640 days 9 hours ago
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE→ mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE×
`,
},
},
{
@@ -301,7 +301,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerTransaction
3d90d15ed026dc45e19ffb52875ed18fa9e8012ad123d7f7212176e2b0ebdb71
| Mined Time | 1639 days 11 hours ago |
| In Block | 00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6 |
| In Block Height | 225494 |
| Total Input | 3172.83951062 FAKE |
| Total Output | 3172.83951000 FAKE |
| Fees | 0.00000062 FAKE |
mined 1639 days 11 hours ago
`,
+ `Trezor Fake Coin ExplorerTransaction
3d90d15ed026dc45e19ffb52875ed18fa9e8012ad123d7f7212176e2b0ebdb71
| Mined Time | 1639 days 11 hours ago |
| In Block | 00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6 |
| In Block Height | 225494 |
| Total Input | 3172.83951062 FAKE |
| Total Output | 3172.83951000 FAKE |
| Fees | 0.00000062 FAKE |
mined 1639 days 11 hours ago
`,
},
},
{
@@ -310,7 +310,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerError
Transaction not found
`,
+ `Trezor Fake Coin ExplorerError
Transaction not found
`,
},
},
{
@@ -319,7 +319,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerBlocks
| Height | Hash | Timestamp | Transactions | Size |
|---|
| 225494 | 00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6 | 1639 days 11 hours ago | 4 | 2345678 |
| 225493 | 0000000076fbbed90fd75b0e18856aa35baa984e9c9d444cf746ad85e94e2997 | 1640 days 9 hours ago | 2 | 1234567 |
`,
+ `
Trezor Fake Coin ExplorerBlocks
| Height | Hash | Timestamp | Transactions | Size |
|---|
| 225494 | 00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6 | 1639 days 11 hours ago | 4 | 2345678 |
| 225493 | 0000000076fbbed90fd75b0e18856aa35baa984e9c9d444cf746ad85e94e2997 | 1640 days 9 hours ago | 2 | 1234567 |
`,
},
},
{
@@ -328,7 +328,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `
Trezor Fake Coin Explorer225494
00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6
| Transactions | 4 |
| Height | 225494 |
| Confirmations | 1 |
| Timestamp | 1639 days 11 hours ago |
| Size (bytes) | 2345678 |
| Version | |
| Merkle Root | |
| Nonce | |
| Bits | |
| Difficulty | |
mined 1639 days 11 hours ago
OP_RETURN 2020f1686f6a200 FAKE×
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
+ `
Trezor Fake Coin Explorer225494
00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6
| Transactions | 4 |
| Height | 225494 |
| Confirmations | 1 |
| Timestamp | 1639 days 11 hours ago |
| Size (bytes) | 2345678 |
| Version | |
| Merkle Root | |
| Nonce | |
| Bits | |
| Difficulty | |
mined 1639 days 11 hours ago
OP_RETURN 2020f1686f6a200 FAKE×
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
},
},
{
@@ -337,7 +337,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `
Trezor Fake Coin ExplorerApplication status
Synchronization with backend is disabled, the state of index is not up to date.
Blockbook | |
| Coin | Fakecoin |
| Host | |
| Version / Commit / Build | unknown / unknown / unknown |
| Synchronized | true |
| Last Block | 225494 |
| Last Block Update | `,
+ `Trezor Fake Coin ExplorerApplication statusSynchronization with backend is disabled, the state of index is not up to date.Blockbook | | | Coin | Fakecoin | | Host | | | Version / Commit / Build | unknown / unknown / unknown | | Synchronized | true | | Last Block | 225494 | | Last Block Update | `,
` | | Mempool in Sync | false | | Last Mempool Update | | | Transactions in Mempool | 0 | | Current Fiat rates | `,
`
Backend | | | Chain | fakecoin | | Version | 001001 | | Subversion | /Fakecoin:0.0.1/ | | Last Block | 2 | | Difficulty | |
Blockbook - blockchain indexer for Trezor Suite https://trezor.io/trezor-suite. Do not use for any other purpose. `,
},
@@ -348,7 +348,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin Explorer22549400000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6| Transactions | 4 | | Height | 225494 | | Confirmations | 1 | | Timestamp | 1639 days 11 hours ago | | Size (bytes) | 2345678 |
| Version | | | Merkle Root | | | Nonce | | | Bits | | | Difficulty | |
mined 1639 days 11 hours ago | OP_RETURN 2020f1686f6a200 FAKE×
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
+ `Trezor Fake Coin Explorer225494
00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6
| Transactions | 4 |
| Height | 225494 |
| Confirmations | 1 |
| Timestamp | 1639 days 11 hours ago |
| Size (bytes) | 2345678 |
| Version | |
| Merkle Root | |
| Nonce | |
| Bits | |
| Difficulty | |
mined 1639 days 11 hours ago
OP_RETURN 2020f1686f6a200 FAKE×
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
},
},
{
@@ -357,7 +357,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin Explorer225494
00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6
| Transactions | 4 |
| Height | 225494 |
| Confirmations | 1 |
| Timestamp | 1639 days 11 hours ago |
| Size (bytes) | 2345678 |
| Version | |
| Merkle Root | |
| Nonce | |
| Bits | |
| Difficulty | |
mined 1639 days 11 hours ago
OP_RETURN 2020f1686f6a200 FAKE×
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
+ `Trezor Fake Coin Explorer225494
00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6
| Transactions | 4 |
| Height | 225494 |
| Confirmations | 1 |
| Timestamp | 1639 days 11 hours ago |
| Size (bytes) | 2345678 |
| Version | |
| Merkle Root | |
| Nonce | |
| Bits | |
| Difficulty | |
mined 1639 days 11 hours ago
OP_RETURN 2020f1686f6a200 FAKE×
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
},
},
{
@@ -366,7 +366,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerTransaction
fdd824a780cbb718eeb766eb05d83fdefc793a27082cd5e67f856d69798cf7db
| Mined Time | 1639 days 11 hours ago |
| In Block | 00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6 |
| In Block Height | 225494 |
| Total Input | 0 FAKE |
| Total Output | 13.60030331 FAKE |
| Fees | 0 FAKE |
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
+ `Trezor Fake Coin ExplorerTransaction
fdd824a780cbb718eeb766eb05d83fdefc793a27082cd5e67f856d69798cf7db
| Mined Time | 1639 days 11 hours ago |
| In Block | 00000000eb0443fd7dc4a1ed5c686a8e995057805f9a161d9a5a77a95e72b7b6 |
| In Block Height | 225494 |
| Total Input | 0 FAKE |
| Total Output | 13.60030331 FAKE |
| Fees | 0 FAKE |
mined 1639 days 11 hours ago
No Inputs (Newly Generated Coins)
`,
},
},
{
@@ -375,7 +375,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerAddress
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz
0.00012345 FAKE
Confirmed | |
| Total Received | 0.00024690 FAKE |
| Total Sent | 0.00012345 FAKE |
| Final Balance | 0.00012345 FAKE |
| No. Transactions | 2 |
Transactions
mined 1639 days 11 hours ago
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE
OP_RETURN 2020f1686f6a200 FAKE×
mined 1640 days 9 hours ago
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE→ mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE×
`,
+ `Trezor Fake Coin ExplorerAddress
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz
0.00012345 FAKE
Confirmed | |
| Total Received | 0.00024690 FAKE |
| Total Sent | 0.00012345 FAKE |
| Final Balance | 0.00012345 FAKE |
| No. Transactions | 2 |
Transactions
mined 1639 days 11 hours ago
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE
OP_RETURN 2020f1686f6a200 FAKE×
mined 1640 days 9 hours ago
mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE→ mtGXQvBowMkBpnhLckhxhbwYK44Gs9eEtz0.00012345 FAKE×
`,
},
},
{
@@ -384,7 +384,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerXPUB
upub5E1xjDmZ7Hhej6LPpS8duATdKXnRYui7bDYj6ehfFGzWDZtmCmQkZhc3Zb7kgRLtHWd16QFxyP86JKL3ShZEBFX88aciJ3xyocuyhZZ8g6q
1186.419755 FAKE
Confirmed | |
| Total Received | 1186.41975501 FAKE |
| Total Sent | 0.00000001 FAKE |
| Final Balance | 1186.41975500 FAKE |
| No. Transactions | 2 |
| Used XPUB Addresses | 2 |
Transactions
mined 1639 days 11 hours ago
mined 1640 days 9 hours ago
`,
+ `Trezor Fake Coin ExplorerXPUB
upub5E1xjDmZ7Hhej6LPpS8duATdKXnRYui7bDYj6ehfFGzWDZtmCmQkZhc3Zb7kgRLtHWd16QFxyP86JKL3ShZEBFX88aciJ3xyocuyhZZ8g6q
1186.419755 FAKE
Confirmed | |
| Total Received | 1186.41975501 FAKE |
| Total Sent | 0.00000001 FAKE |
| Final Balance | 1186.41975500 FAKE |
| No. Transactions | 2 |
| Used XPUB Addresses | 2 |
Transactions
mined 1639 days 11 hours ago
mined 1640 days 9 hours ago
`,
},
},
{
@@ -393,7 +393,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerXPUB
tr([5c9e228d/86'/1'/0']tpubDC88gkaZi5HvJGxGDNLADkvtdpni3mLmx6vr2KnXmWMG8zfkBRggsxHVBkUpgcwPe2KKpkyvTJCdXHb1UHEWE64vczyyPQfHr1skBcsRedN/{0,1}/*)#4rqwxvej
0 FAKE
Confirmed | |
| Total Received | 0 FAKE |
| Total Sent | 0 FAKE |
| Final Balance | 0 FAKE |
| No. Transactions | 0 |
| Used XPUB Addresses | 0 |
XPUB Addresses with Balance | |
| No addresses |
`,
+ `Trezor Fake Coin ExplorerXPUB
tr([5c9e228d/86'/1'/0']tpubDC88gkaZi5HvJGxGDNLADkvtdpni3mLmx6vr2KnXmWMG8zfkBRggsxHVBkUpgcwPe2KKpkyvTJCdXHb1UHEWE64vczyyPQfHr1skBcsRedN/{0,1}/*)#4rqwxvej
0 FAKE
Confirmed | |
| Total Received | 0 FAKE |
| Total Sent | 0 FAKE |
| Final Balance | 0 FAKE |
| No. Transactions | 0 |
| Used XPUB Addresses | 0 |
XPUB Addresses with Balance | |
| No addresses |
`,
},
},
{
@@ -402,7 +402,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerError
No matching records found for '1234'
`,
+ `Trezor Fake Coin ExplorerError
No matching records found for '1234'
`,
},
},
{
@@ -411,7 +411,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin Explorer`,
+ `Trezor Fake Coin ExplorerSend Raw Transaction
`,
},
},
{
@@ -420,7 +420,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK,
contentType: "text/html; charset=utf-8",
body: []string{
- `Trezor Fake Coin ExplorerSend Raw Transaction
Invalid data
`,
+ `Trezor Fake Coin ExplorerSend Raw Transaction
Invalid data
`,
},
},
{
diff --git a/server/websocket.go b/server/websocket.go
index f9093eeb..c782adea 100644
--- a/server/websocket.go
+++ b/server/websocket.go
@@ -107,7 +107,7 @@ func NewWebsocketServer(db *db.RocksDB, chain bchain.BlockChain, mempool bchain.
fiatRatesSubscriptions: make(map[string]map[*websocketChannel]string),
fiatRatesTokenSubscriptions: make(map[*websocketChannel][]string),
}
- envRpcCall := os.Getenv(strings.ToUpper(is.CoinShortcut) + "_ALLOWED_RPC_CALL_TO")
+ envRpcCall := os.Getenv(strings.ToUpper(is.GetNetwork()) + "_ALLOWED_RPC_CALL_TO")
if envRpcCall != "" {
s.allowedRpcCallTo = make(map[string]struct{})
for _, c := range strings.Split(envRpcCall, ",") {
diff --git a/static/css/main.css b/static/css/main.css
index b02f915c..e708ac18 100644
--- a/static/css/main.css
+++ b/static/css/main.css
@@ -200,6 +200,10 @@ span.btn-paging:hover {
color: #757575;
}
+.btn-paging.active:hover {
+ background-color: white;
+}
+
.paging-group {
border: 1px solid #e2e2e2;
border-radius: 0.5rem;
@@ -694,4 +698,4 @@ span.btn-paging:hover {
.btn {
--bs-btn-font-size: 1rem;
}
-}
\ No newline at end of file
+}
diff --git a/static/css/main.min.3.css b/static/css/main.min.3.css
deleted file mode 100644
index dbafe084..00000000
--- a/static/css/main.min.3.css
+++ /dev/null
@@ -1 +0,0 @@
-@import "TTHoves/TTHoves.css";* {margin: 0;padding: 0;outline: none;font-family: "TT Hoves", -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;}html, body {height: 100%;}body {min-height: 100%;margin: 0;background: linear-gradient(to bottom, #f6f6f6 360px, #e5e5e5 0), #e5e5e5;background-repeat: no-repeat;}a {color: #00854d;text-decoration: none;}a:hover {color: #00854d;text-decoration: underline;}select {border-radius: 0.5rem;padding-left: 0.5rem;border: 1px solid #ced4da;color: var(--bs-body-color);min-height: 45px;}#header {position: fixed;top: 0;left: 0;width: 100%;margin: 0;padding-bottom: 0;padding-top: 0;background-color: white;border-bottom: 1px solid #f6f6f6;z-index: 10;}#header a {color: var(--bs-navbar-brand-color);}#header a:hover {color: var(--bs-navbar-brand-hover-color);}#header .navbar {--bs-navbar-padding-y: 0.7rem;}#header .form-control-lg {font-size: 1rem;padding: 0.75rem 1rem;}#header .container {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 {outline: 0;box-shadow: none;border-color: #00854d;}.base-value {color: #757575 !important;padding-left: 0.5rem;font-weight: normal;}.badge {vertical-align: middle;text-transform: uppercase;letter-spacing: 0.15em;--bs-badge-padding-x: 0.8rem;--bs-badge-font-weight: normal;--bs-badge-border-radius: 0.6rem;}.bg-secondary {background-color: #757575 !important;}.accordion {--bs-accordion-border-radius: 10px;--bs-accordion-inner-border-radius: calc(10px - 1px);--bs-accordion-color: var(--bs-body-color);--bs-accordion-active-color: var(--bs-body-color);--bs-accordion-active-bg: white;--bs-accordion-btn-active-icon: url("data:image/svg+xml,");}.accordion-button:focus {outline: 0;box-shadow: none;}.accordion-body {letter-spacing: -0.01em;}.bb-group {border: 0.6rem solid #f6f6f6;background-color: #f6f6f6;border-radius: 0.5rem;position: relative;display: inline-flex;vertical-align: middle;}.bb-group>.btn {--bs-btn-padding-x: 0.5rem;--bs-btn-padding-y: 0.22rem;--bs-btn-border-radius: 0.3rem;--bs-btn-border-width: 0;color: #545454;}.bb-group>.btn-check:checked+.btn, .bb-group .btn.active {color: black;font-weight: bold;background-color: white;}.paging {display: flex;}.paging .bb-group>.btn {min-width: 2rem;margin-left: 0.1rem;margin-right: 0.1rem;}.paging .bb-group>.btn:hover {background-color: white;}.paging a {text-decoration: none;}.btn-paging {--bs-btn-color: #757575;--bs-btn-border-color: #e2e2e2;--bs-btn-hover-color: black;--bs-btn-hover-bg: #f6f6f6;--bs-btn-hover-border-color: #e2e2e2;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e2e2e2;--bs-btn-active-border-color: #e2e2e2;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-gradient: none;--bs-btn-padding-y: 0.75rem;--bs-btn-padding-x: 1.1rem;--bs-btn-border-radius: 0.5rem;--bs-btn-font-weight: bold;background-color: #f6f6f6;}span.btn-paging {cursor: initial;}span.btn-paging:hover {color: #757575;}.paging-group {border: 1px solid #e2e2e2;border-radius: 0.5rem;}.paging-group>.bb-group {border: 0.53rem solid #f6f6f6;}#wrap {min-height: 100%;height: auto;padding: 112px 0 75px 0;margin: 0 auto -56px;}#footer {background-color: black;color: #757575;height: 56px;overflow: hidden;}.navbar-form {width: 60%;}.navbar-form button {margin-left: -50px;position: relative;}.search-icon {width: 16px;height: 16px;position: absolute;top: 16px;background-size: cover;background-image: url("data:image/svg+xml, %3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.24976 12.5C10.1493 12.5 12.4998 10.1495 12.4998 7.25C12.4998 4.35051 10.1493 2 7.24976 2C4.35026 2 1.99976 4.35051 1.99976 7.25C1.99976 10.1495 4.35026 12.5 7.24976 12.5Z' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' /%3E%3Cpath d='M10.962 10.9625L13.9996 14.0001' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' /%3E%3C/svg%3E");}.navbar-form ::placeholder {color: #e2e2e2;}.ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}.data-table {table-layout: fixed;overflow-wrap: anywhere;margin-left: 8px;margin-top: 2rem;margin-bottom: 2rem;width: calc(100% - 16px);}.data-table thead {padding-bottom: 20px;}.table.data-table> :not(caption)>*>* {padding: 0.8rem 0.8rem;background-color: var(--bs-table-bg);border-bottom-width: 1px;box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);}.table.data-table>thead>*>* {padding-bottom: 1.5rem;}.table.data-table>*>*:last-child>* {border-bottom: none;}.data-table thead, .data-table thead tr, .data-table thead th {color: #757575;border: none;font-weight: normal;}.data-table tbody th {color: #757575;font-weight: normal;}.data-table tbody {background: white;border-radius: 8px;box-shadow: 0 0 0 8px white;}.data-table h3, .data-table h5, .data-table h6 {margin-bottom: 0;}.data-table h3, .data-table h5 {color: var(--bs-body-color);}.accordion .table.data-table>thead>*>* {padding-bottom: 0;}.info-table tbody {display: inline-table;width: 100%;}.info-table td {font-weight: bold;}.info-table tr>td:first-child {font-weight: normal;color: #757575;}.ns:before {content: " ";}.nc:before {content: ",";}.trezor-logo {width: 128px;height: 32px;position: absolute;top: 16px;background-size: cover;background-image: url("data:image/svg+xml,%3Csvg style='width: 128px%3B' version='1.1' xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 163.7 41.9' space='preserve'%3E%3Cpolygon points='101.1 12.8 118.2 12.8 118.2 17.3 108.9 29.9 118.2 29.9 118.2 35.2 101.1 35.2 101.1 30.7 110.4 18.1 101.1 18.1'%3E%3C/polygon%3E%3Cpath d='M158.8 26.9c2.1-0.8 4.3-2.9 4.3-6.6c0-4.5-3.1-7.4-7.7-7.4h-10.5v22.3h5.8v-7.5h2.2l4.1 7.5h6.7L158.8 26.9z M154.7 22.5h-4V18h4c1.5 0 2.5 0.9 2.5 2.2C157.2 21.6 156.2 22.5 154.7 22.5z'%3E%3C/path%3E%3Cpath d='M130.8 12.5c-6.8 0-11.6 4.9-11.6 11.5s4.9 11.5 11.6 11.5s11.7-4.9 11.7-11.5S137.6 12.5 130.8 12.5z M130.8 30.3c-3.4 0-5.7-2.6-5.7-6.3c0-3.8 2.3-6.3 5.7-6.3c3.4 0 5.8 2.6 5.8 6.3C136.6 27.7 134.2 30.3 130.8 30.3z'%3E%3C/path%3E%3Cpolygon points='82.1 12.8 98.3 12.8 98.3 18 87.9 18 87.9 21.3 98 21.3 98 26.4 87.9 26.4 87.9 30 98.3 30 98.3 35.2 82.1 35.2'%3E%3C/polygon%3E%3Cpath d='M24.6 9.7C24.6 4.4 20 0 14.4 0S4.2 4.4 4.2 9.7v3.1H0v22.3h0l14.4 6.7l14.4-6.7h0V12.9h-4.2V9.7z M9.4 9.7c0-2.5 2.2-4.5 5-4.5s5 2 5 4.5v3.1H9.4V9.7z M23 31.5l-8.6 4l-8.6-4V18.1H23V31.5z'%3E%3C/path%3E%3Cpath d='M79.4 20.3c0-4.5-3.1-7.4-7.7-7.4H61.2v22.3H67v-7.5h2.2l4.1 7.5H80l-4.9-8.3C77.2 26.1 79.4 24 79.4 20.3z M71 22.5h-4V18h4c1.5 0 2.5 0.9 2.5 2.2C73.5 21.6 72.5 22.5 71 22.5z'%3E%3C/path%3E%3Cpolygon points='40.5 12.8 58.6 12.8 58.6 18.1 52.4 18.1 52.4 35.2 46.6 35.2 46.6 18.1 40.5 18.1'%3E%3C/polygon%3E%3C/svg%3E");}.copyable::before, .copied::before {width: 18px;height: 16px;margin: 3px -18px;content: "";position: absolute;background-size: cover;}.copyable::before {display: none;cursor: copy;background-image: url("data:image/svg+xml,%3Csvg width='18' height='16' viewBox='0 0 18 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.5 10.4996H13.5V2.49963H5.5V5.49963' stroke='%2300854D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M10.4998 5.49976H2.49976V13.4998H10.4998V5.49976Z' stroke='%2300854D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}.copyable:hover::before {display: inline-block;}.copied::before {transition: all 0.4s ease;transform: scale(1.2);background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='16' viewBox='-30 -30 330 330'%3E%3Cpath d='M 30,180 90,240 240,30' style='stroke:%2300854D;stroke-width:32;fill:none'/%3E%3C/svg%3E");}.h-data {letter-spacing: 0.12em;font-weight: normal !important;}.tx-detail {background: #f6f6f6;color: #757575;border-radius: 10px;box-shadow: 0 0 0 10px white;width: calc(100% - 20px);margin-left: 10px;margin-top: 3rem;overflow-wrap: break-word;}.tx-detail:first-child {margin-top: 1rem;}.tx-detail:last-child {margin-bottom: 2rem;}.tx-detail span.ellipsis, .tx-detail a.ellipsis {display: block;float: left;max-width: 100%;}.tx-detail>.head, .tx-detail>.footer {padding: 1.5rem;--bs-gutter-x: 0;}.tx-detail>.head {border-radius: 10px 10px 0 0;}.tx-detail .txid {font-size: 106%;letter-spacing: -0.01em;}.tx-detail>.body {padding: 0 1.5rem;--bs-gutter-x: 0;letter-spacing: -0.01em;}.tx-detail>.subhead {padding: 1.5rem 1.5rem 0.4rem 1.5rem;--bs-gutter-x: 0;letter-spacing: 0.1em;text-transform: uppercase;color: var(--bs-body-color);}.tx-detail>.subhead-2 {padding: 0.3rem 1.5rem 0 1.5rem;--bs-gutter-x: 0;font-size: .875em;color: var(--bs-body-color);}.tx-in .col-12, .tx-out .col-12, .tx-addr .col-12 {background-color: white;padding: 1.2rem 1.3rem;border-bottom: 1px solid #f6f6f6;}.amt-out {padding: 1.2rem 0 1.2rem 1rem;text-align: right;overflow-wrap: break-word;}.tx-in .col-12:last-child, .tx-out .col-12:last-child {border-bottom: none;}.tx-own {background-color: #fff9e3 !important;}.tx-amt {float: right !important;}.spent {color: #dc3545 !important;}.unspent {color: #28a745 !important;}.outpoint {color: #757575 !important;}.spent, .unspent, .outpoint {display: inline-block;text-align: right;min-width: 18px;text-decoration: none !important;}.octicon {height: 24px;width: 24px;margin-left: -12px;margin-top: 19px;position: absolute;background-size: cover;background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 4.5L16.5 12L9 19.5' stroke='%23AFAFAF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");}.txvalue {color: var(--bs-body-color);font-weight: bold;}.txerror {color: #c51f13;}.txerror a, .txerror .txvalue {color: #c51f13;}.txerror .copyable::before, .txerror .copied::before {filter: invert(86%) sepia(43%) saturate(732%) hue-rotate(367deg) brightness(84%);}.tx-amt .amt:hover, .tx-amt.amt:hover, .amt-out>.amt:hover {color: var(--bs-body-color);}.prim-amt {display: initial;}.sec-amt {display: none;}.csec-amt {display: none;}.base-amt {display: none;}.cbase-amt {display: none;}.tooltip {--bs-tooltip-opacity: 1;--bs-tooltip-max-width: 380px;--bs-tooltip-bg: #fff;--bs-tooltip-color: var(--bs-body-color);--bs-tooltip-padding-x: 1rem;--bs-tooltip-padding-y: 0.8rem;filter: drop-shadow(0px 24px 64px rgba(22, 27, 45, 0.25));}.l-tooltip {text-align: start;display: inline-block;}.l-tooltip .prim-amt, .l-tooltip .sec-amt, .l-tooltip .csec-amt, .l-tooltip .base-amt, .l-tooltip .cbase-amt {display: initial;float: right;}.l-tooltip .amt-time {padding-right: 3rem;float: left;}.amt-dec {font-size: 95%;}.unconfirmed {color: white;background-color: #c51e13;padding: 0.7rem 1.2rem;border-radius: 1.4rem;}.json {word-wrap: break-word;font-size: smaller;background: #002b31;border-radius: 8px;}#raw {padding: 1.5rem 2rem;color: #ffffff;letter-spacing: 0.02em;}#raw .string {color: #2bca87;}#raw .number, #raw .boolean {color: #efc941;}#raw .null {color: red;}@media (max-width: 768px) {body {font-size: 0.8rem;background: linear-gradient(to bottom, #f6f6f6 500px, #e5e5e5 0), #e5e5e5;}.container {padding-left: 2px;padding-right: 2px;}.accordion-body {padding: var(--bs-accordion-body-padding-y) 0;}.octicon {scale: 60% !important;margin-top: -2px;}.unconfirmed {padding: 0.1rem 0.8rem;}.btn {--bs-btn-font-size: 0.8rem;}}@media (max-width: 991px) {#header .container {min-height: 40px;}#header .dropdown-menu[data-bs-popper] {left: 0;right: initial;}.trezor-logo {top: 10px;}.octicon {scale: 80%;}.table.data-table>:not(caption)>*>* {padding: 0.8rem 0.4rem;}.tx-in .col-12, .tx-out .col-12, .tx-addr .col-12 {padding: 0.7rem 1.1rem;}.amt-out {padding: 0.7rem 0 0.7rem 1rem }}@media (min-width: 769px) {body {font-size: 0.9rem;}.btn {--bs-btn-font-size: 0.9rem;}}@media (min-width: 1200px) {.h1, h1 {font-size: 2.4rem;}body {font-size: 1rem;}.btn {--bs-btn-font-size: 1rem;}}
\ No newline at end of file
diff --git a/static/css/main.min.4.css b/static/css/main.min.4.css
new file mode 100644
index 00000000..54dd88a2
--- /dev/null
+++ b/static/css/main.min.4.css
@@ -0,0 +1 @@
+@import "TTHoves/TTHoves.css";* {margin: 0;padding: 0;outline: none;font-family: "TT Hoves", -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;}html, body {height: 100%;}body {min-height: 100%;margin: 0;background: linear-gradient(to bottom, #f6f6f6 360px, #e5e5e5 0), #e5e5e5;background-repeat: no-repeat;}a {color: #00854d;text-decoration: none;}a:hover {color: #00854d;text-decoration: underline;}select {border-radius: 0.5rem;padding-left: 0.5rem;border: 1px solid #ced4da;color: var(--bs-body-color);min-height: 45px;}#header {position: fixed;top: 0;left: 0;width: 100%;margin: 0;padding-bottom: 0;padding-top: 0;background-color: white;border-bottom: 1px solid #f6f6f6;z-index: 10;}#header a {color: var(--bs-navbar-brand-color);}#header a:hover {color: var(--bs-navbar-brand-hover-color);}#header .navbar {--bs-navbar-padding-y: 0.7rem;}#header .form-control-lg {font-size: 1rem;padding: 0.75rem 1rem;}#header .container {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 {outline: 0;box-shadow: none;border-color: #00854d;}.base-value {color: #757575 !important;padding-left: 0.5rem;font-weight: normal;}.badge {vertical-align: middle;text-transform: uppercase;letter-spacing: 0.15em;--bs-badge-padding-x: 0.8rem;--bs-badge-font-weight: normal;--bs-badge-border-radius: 0.6rem;}.bg-secondary {background-color: #757575 !important;}.accordion {--bs-accordion-border-radius: 10px;--bs-accordion-inner-border-radius: calc(10px - 1px);--bs-accordion-color: var(--bs-body-color);--bs-accordion-active-color: var(--bs-body-color);--bs-accordion-active-bg: white;--bs-accordion-btn-active-icon: url("data:image/svg+xml,");}.accordion-button:focus {outline: 0;box-shadow: none;}.accordion-body {letter-spacing: -0.01em;}.bb-group {border: 0.6rem solid #f6f6f6;background-color: #f6f6f6;border-radius: 0.5rem;position: relative;display: inline-flex;vertical-align: middle;}.bb-group>.btn {--bs-btn-padding-x: 0.5rem;--bs-btn-padding-y: 0.22rem;--bs-btn-border-radius: 0.3rem;--bs-btn-border-width: 0;color: #545454;}.bb-group>.btn-check:checked+.btn, .bb-group .btn.active {color: black;font-weight: bold;background-color: white;}.paging {display: flex;}.paging .bb-group>.btn {min-width: 2rem;margin-left: 0.1rem;margin-right: 0.1rem;}.paging .bb-group>.btn:hover {background-color: white;}.paging a {text-decoration: none;}.btn-paging {--bs-btn-color: #757575;--bs-btn-border-color: #e2e2e2;--bs-btn-hover-color: black;--bs-btn-hover-bg: #f6f6f6;--bs-btn-hover-border-color: #e2e2e2;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e2e2e2;--bs-btn-active-border-color: #e2e2e2;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-gradient: none;--bs-btn-padding-y: 0.75rem;--bs-btn-padding-x: 1.1rem;--bs-btn-border-radius: 0.5rem;--bs-btn-font-weight: bold;background-color: #f6f6f6;}span.btn-paging {cursor: initial;}span.btn-paging:hover {color: #757575;}.btn-paging.active:hover {background-color: white;}.paging-group {border: 1px solid #e2e2e2;border-radius: 0.5rem;}.paging-group>.bb-group {border: 0.53rem solid #f6f6f6;}#wrap {min-height: 100%;height: auto;padding: 112px 0 75px 0;margin: 0 auto -56px;}#footer {background-color: black;color: #757575;height: 56px;overflow: hidden;}.navbar-form {width: 60%;}.navbar-form button {margin-left: -50px;position: relative;}.search-icon {width: 16px;height: 16px;position: absolute;top: 16px;background-size: cover;background-image: url("data:image/svg+xml, %3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.24976 12.5C10.1493 12.5 12.4998 10.1495 12.4998 7.25C12.4998 4.35051 10.1493 2 7.24976 2C4.35026 2 1.99976 4.35051 1.99976 7.25C1.99976 10.1495 4.35026 12.5 7.24976 12.5Z' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' /%3E%3Cpath d='M10.962 10.9625L13.9996 14.0001' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' /%3E%3C/svg%3E");}.navbar-form ::placeholder {color: #e2e2e2;}.ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}.data-table {table-layout: fixed;overflow-wrap: anywhere;margin-left: 8px;margin-top: 2rem;margin-bottom: 2rem;width: calc(100% - 16px);}.data-table thead {padding-bottom: 20px;}.table.data-table> :not(caption)>*>* {padding: 0.8rem 0.8rem;background-color: var(--bs-table-bg);border-bottom-width: 1px;box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);}.table.data-table>thead>*>* {padding-bottom: 1.5rem;}.table.data-table>*>*:last-child>* {border-bottom: none;}.data-table thead, .data-table thead tr, .data-table thead th {color: #757575;border: none;font-weight: normal;}.data-table tbody th {color: #757575;font-weight: normal;}.data-table tbody {background: white;border-radius: 8px;box-shadow: 0 0 0 8px white;}.data-table h3, .data-table h5, .data-table h6 {margin-bottom: 0;}.data-table h3, .data-table h5 {color: var(--bs-body-color);}.accordion .table.data-table>thead>*>* {padding-bottom: 0;}.info-table tbody {display: inline-table;width: 100%;}.info-table td {font-weight: bold;}.info-table tr>td:first-child {font-weight: normal;color: #757575;}.ns:before {content: " ";}.nc:before {content: ",";}.trezor-logo {width: 128px;height: 32px;position: absolute;top: 16px;background-size: cover;background-image: url("data:image/svg+xml,%3Csvg style='width: 128px%3B' version='1.1' xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 163.7 41.9' space='preserve'%3E%3Cpolygon points='101.1 12.8 118.2 12.8 118.2 17.3 108.9 29.9 118.2 29.9 118.2 35.2 101.1 35.2 101.1 30.7 110.4 18.1 101.1 18.1'%3E%3C/polygon%3E%3Cpath d='M158.8 26.9c2.1-0.8 4.3-2.9 4.3-6.6c0-4.5-3.1-7.4-7.7-7.4h-10.5v22.3h5.8v-7.5h2.2l4.1 7.5h6.7L158.8 26.9z M154.7 22.5h-4V18h4c1.5 0 2.5 0.9 2.5 2.2C157.2 21.6 156.2 22.5 154.7 22.5z'%3E%3C/path%3E%3Cpath d='M130.8 12.5c-6.8 0-11.6 4.9-11.6 11.5s4.9 11.5 11.6 11.5s11.7-4.9 11.7-11.5S137.6 12.5 130.8 12.5z M130.8 30.3c-3.4 0-5.7-2.6-5.7-6.3c0-3.8 2.3-6.3 5.7-6.3c3.4 0 5.8 2.6 5.8 6.3C136.6 27.7 134.2 30.3 130.8 30.3z'%3E%3C/path%3E%3Cpolygon points='82.1 12.8 98.3 12.8 98.3 18 87.9 18 87.9 21.3 98 21.3 98 26.4 87.9 26.4 87.9 30 98.3 30 98.3 35.2 82.1 35.2'%3E%3C/polygon%3E%3Cpath d='M24.6 9.7C24.6 4.4 20 0 14.4 0S4.2 4.4 4.2 9.7v3.1H0v22.3h0l14.4 6.7l14.4-6.7h0V12.9h-4.2V9.7z M9.4 9.7c0-2.5 2.2-4.5 5-4.5s5 2 5 4.5v3.1H9.4V9.7z M23 31.5l-8.6 4l-8.6-4V18.1H23V31.5z'%3E%3C/path%3E%3Cpath d='M79.4 20.3c0-4.5-3.1-7.4-7.7-7.4H61.2v22.3H67v-7.5h2.2l4.1 7.5H80l-4.9-8.3C77.2 26.1 79.4 24 79.4 20.3z M71 22.5h-4V18h4c1.5 0 2.5 0.9 2.5 2.2C73.5 21.6 72.5 22.5 71 22.5z'%3E%3C/path%3E%3Cpolygon points='40.5 12.8 58.6 12.8 58.6 18.1 52.4 18.1 52.4 35.2 46.6 35.2 46.6 18.1 40.5 18.1'%3E%3C/polygon%3E%3C/svg%3E");}.copyable::before, .copied::before {width: 18px;height: 16px;margin: 3px -18px;content: "";position: absolute;background-size: cover;}.copyable::before {display: none;cursor: copy;background-image: url("data:image/svg+xml,%3Csvg width='18' height='16' viewBox='0 0 18 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.5 10.4996H13.5V2.49963H5.5V5.49963' stroke='%2300854D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M10.4998 5.49976H2.49976V13.4998H10.4998V5.49976Z' stroke='%2300854D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");}.copyable:hover::before {display: inline-block;}.copied::before {transition: all 0.4s ease;transform: scale(1.2);background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='16' viewBox='-30 -30 330 330'%3E%3Cpath d='M 30,180 90,240 240,30' style='stroke:%2300854D;stroke-width:32;fill:none'/%3E%3C/svg%3E");}.h-data {letter-spacing: 0.12em;font-weight: normal !important;}.tx-detail {background: #f6f6f6;color: #757575;border-radius: 10px;box-shadow: 0 0 0 10px white;width: calc(100% - 20px);margin-left: 10px;margin-top: 3rem;overflow-wrap: break-word;}.tx-detail:first-child {margin-top: 1rem;}.tx-detail:last-child {margin-bottom: 2rem;}.tx-detail span.ellipsis, .tx-detail a.ellipsis {display: block;float: left;max-width: 100%;}.tx-detail>.head, .tx-detail>.footer {padding: 1.5rem;--bs-gutter-x: 0;}.tx-detail>.head {border-radius: 10px 10px 0 0;}.tx-detail .txid {font-size: 106%;letter-spacing: -0.01em;}.tx-detail>.body {padding: 0 1.5rem;--bs-gutter-x: 0;letter-spacing: -0.01em;}.tx-detail>.subhead {padding: 1.5rem 1.5rem 0.4rem 1.5rem;--bs-gutter-x: 0;letter-spacing: 0.1em;text-transform: uppercase;color: var(--bs-body-color);}.tx-detail>.subhead-2 {padding: 0.3rem 1.5rem 0 1.5rem;--bs-gutter-x: 0;font-size: .875em;color: var(--bs-body-color);}.tx-in .col-12, .tx-out .col-12, .tx-addr .col-12 {background-color: white;padding: 1.2rem 1.3rem;border-bottom: 1px solid #f6f6f6;}.amt-out {padding: 1.2rem 0 1.2rem 1rem;text-align: right;overflow-wrap: break-word;}.tx-in .col-12:last-child, .tx-out .col-12:last-child {border-bottom: none;}.tx-own {background-color: #fff9e3 !important;}.tx-amt {float: right !important;}.spent {color: #dc3545 !important;}.unspent {color: #28a745 !important;}.outpoint {color: #757575 !important;}.spent, .unspent, .outpoint {display: inline-block;text-align: right;min-width: 18px;text-decoration: none !important;}.octicon {height: 24px;width: 24px;margin-left: -12px;margin-top: 19px;position: absolute;background-size: cover;background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 4.5L16.5 12L9 19.5' stroke='%23AFAFAF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");}.txvalue {color: var(--bs-body-color);font-weight: bold;}.txerror {color: #c51f13;}.txerror a, .txerror .txvalue {color: #c51f13;}.txerror .copyable::before, .txerror .copied::before {filter: invert(86%) sepia(43%) saturate(732%) hue-rotate(367deg) brightness(84%);}.tx-amt .amt:hover, .tx-amt.amt:hover, .amt-out>.amt:hover {color: var(--bs-body-color);}.prim-amt {display: initial;}.sec-amt {display: none;}.csec-amt {display: none;}.base-amt {display: none;}.cbase-amt {display: none;}.tooltip {--bs-tooltip-opacity: 1;--bs-tooltip-max-width: 380px;--bs-tooltip-bg: #fff;--bs-tooltip-color: var(--bs-body-color);--bs-tooltip-padding-x: 1rem;--bs-tooltip-padding-y: 0.8rem;filter: drop-shadow(0px 24px 64px rgba(22, 27, 45, 0.25));}.l-tooltip {text-align: start;display: inline-block;}.l-tooltip .prim-amt, .l-tooltip .sec-amt, .l-tooltip .csec-amt, .l-tooltip .base-amt, .l-tooltip .cbase-amt {display: initial;float: right;}.l-tooltip .amt-time {padding-right: 3rem;float: left;}.amt-dec {font-size: 95%;}.unconfirmed {color: white;background-color: #c51e13;padding: 0.7rem 1.2rem;border-radius: 1.4rem;}.json {word-wrap: break-word;font-size: smaller;background: #002b31;border-radius: 8px;}#raw {padding: 1.5rem 2rem;color: #ffffff;letter-spacing: 0.02em;}#raw .string {color: #2bca87;}#raw .number, #raw .boolean {color: #efc941;}#raw .null {color: red;}@media (max-width: 768px) {body {font-size: 0.8rem;background: linear-gradient(to bottom, #f6f6f6 500px, #e5e5e5 0), #e5e5e5;}.container {padding-left: 2px;padding-right: 2px;}.accordion-body {padding: var(--bs-accordion-body-padding-y) 0;}.octicon {scale: 60% !important;margin-top: -2px;}.unconfirmed {padding: 0.1rem 0.8rem;}.btn {--bs-btn-font-size: 0.8rem;}}@media (max-width: 991px) {#header .container {min-height: 40px;}#header .dropdown-menu[data-bs-popper] {left: 0;right: initial;}.trezor-logo {top: 10px;}.octicon {scale: 80%;}.table.data-table>:not(caption)>*>* {padding: 0.8rem 0.4rem;}.tx-in .col-12, .tx-out .col-12, .tx-addr .col-12 {padding: 0.7rem 1.1rem;}.amt-out {padding: 0.7rem 0 0.7rem 1rem }}@media (min-width: 769px) {body {font-size: 0.9rem;}.btn {--bs-btn-font-size: 0.9rem;}}@media (min-width: 1200px) {.h1, h1 {font-size: 2.4rem;}body {font-size: 1rem;}.btn {--bs-btn-font-size: 1rem;}}
\ No newline at end of file
diff --git a/static/js/main.js b/static/js/main.js
index d729efc9..b1d31408 100644
--- a/static/js/main.js
+++ b/static/js/main.js
@@ -85,6 +85,79 @@ function addressAliasTooltip() {
return `${type}
${address}`;
}
+function handleTxPage(rawData, txId) {
+ const rawOutput = document.getElementById('raw');
+ const rawButton = document.getElementById('raw-button');
+ const rawHexButton = document.getElementById('raw-hex-button');
+
+ rawOutput.innerHTML = syntaxHighlight(rawData);
+
+ let isShowingHexData = false;
+
+ const memoizedResponses = {};
+
+ async function getTransactionHex(txId) {
+ // BTC-like coins have a 'hex' field in the raw data
+ if (rawData['hex']) {
+ return rawData['hex'];
+ }
+ if (memoizedResponses[txId]) {
+ return memoizedResponses[txId];
+ }
+ const fetchedData = await fetchTransactionHex(txId);
+ memoizedResponses[txId] = fetchedData;
+ return fetchedData;
+ }
+
+ async function fetchTransactionHex(txId) {
+ const response = await fetch(`/api/rawtx/${txId}`);
+ if (!response.ok) {
+ throw new Error(`Error fetching data: ${response.status}`);
+ }
+ const txHex = await response.text();
+ const hexWithoutQuotes = txHex.replace(/"/g, '');
+ return hexWithoutQuotes;
+ }
+
+ function updateButtonStyles() {
+ if (isShowingHexData) {
+ rawButton.classList.add('active');
+ rawButton.style.fontWeight = 'normal';
+ rawHexButton.classList.remove('active');
+ rawHexButton.style.fontWeight = 'bold';
+ } else {
+ rawButton.classList.remove('active');
+ rawButton.style.fontWeight = 'bold';
+ rawHexButton.classList.add('active');
+ rawHexButton.style.fontWeight = 'normal';
+ }
+ }
+
+ updateButtonStyles();
+
+ rawHexButton.addEventListener('click', async () => {
+ if (!isShowingHexData) {
+ try {
+ const txHex = await getTransactionHex(txId);
+ rawOutput.textContent = txHex;
+ } catch (error) {
+ console.error('Error fetching raw transaction hex:', error);
+ rawOutput.textContent = `Error fetching raw transaction hex: ${error.message}`;
+ }
+ isShowingHexData = true;
+ updateButtonStyles();
+ }
+ });
+
+ rawButton.addEventListener('click', () => {
+ if (isShowingHexData) {
+ rawOutput.innerHTML = syntaxHighlight(rawData);
+ isShowingHexData = false;
+ updateButtonStyles();
+ }
+ });
+}
+
window.addEventListener("DOMContentLoaded", () => {
const a = getCoinCookie();
if (a?.length === 3) {
@@ -127,7 +200,8 @@ window.addEventListener("DOMContentLoaded", () => {
if (e.clientX < e.target.getBoundingClientRect().x) {
let t = e.target.getAttribute("cc");
if (!t) t = e.target.innerText;
- navigator.clipboard.writeText(t);
+ const textToCopy = t.trim();
+ navigator.clipboard.writeText(textToCopy);
e.target.className = e.target.className.replace("copyable", "copied");
setTimeout(
() =>
diff --git a/static/js/main.min.3.js b/static/js/main.min.3.js
deleted file mode 100644
index 72a9ffe0..00000000
--- a/static/js/main.min.3.js
+++ /dev/null
@@ -1 +0,0 @@
-function syntaxHighlight(t){return(t=(t=JSON.stringify(t,void 0,2)).replace(/&/g,"&").replace(//g,">")).length>1e6?`${t}`:t.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,t=>{let e="number";return/^"/.test(t)?e=/:$/.test(t)?"key":"string":/true|false/.test(t)?e="boolean":/null/.test(t)&&(e="null"),`${t}`})}function getCoinCookie(){if(hasSecondary)return document.cookie.split("; ").find(t=>t.startsWith("secondary_coin="))?.split("=")}function changeCSSStyle(t,e,l){let a=document.all?"rules":"cssRules";for(i=0,len=document.styleSheets[1][a].length;i`;if(a){let n=a.getAttribute("tm");n||(n="now"),r+=`${n}${a.outerHTML}
`}if(s&&(r+=`now${s.outerHTML}
`),e){let o=e.getAttribute("tm");o||(o="now"),r+=`${o}${e.outerHTML}
`}return l&&(r+=`now${l.outerHTML}
`),`${r}`}function addressAliasTooltip(){let t=this.getAttribute("alias-type"),e=this.getAttribute("cc");return`${t}
${e}`}window.addEventListener("DOMContentLoaded",()=>{let t=getCoinCookie();t?.length===3&&("true"===t[2]&&(changeCSSStyle(".prim-amt","display","none"),changeCSSStyle(".sec-amt","display","initial")),document.querySelectorAll(".amt").forEach(t=>new bootstrap.Tooltip(t,{title:amountTooltip,html:!0}))),document.querySelectorAll("[alias-type]").forEach(t=>new bootstrap.Tooltip(t,{title:addressAliasTooltip,html:!0})),document.querySelectorAll("[tt]").forEach(t=>new bootstrap.Tooltip(t,{title:t.getAttribute("tt")})),document.querySelectorAll("#header .bb-group>.btn-check").forEach(t=>t.addEventListener("click",t=>{let e=getCoinCookie(),l="secondary-coin"===t.target.id;e?.length===3&&"true"===e[2]!==l&&(document.cookie=`${e[0]}=${e[1]}=${l}; Path=/`,changeCSSStyle(".prim-amt","display",l?"none":"initial"),changeCSSStyle(".sec-amt","display",l?"initial":"none"))})),document.querySelectorAll(".copyable").forEach(t=>t.addEventListener("click",t=>{if(t.clientXt.target.className=t.target.className.replace("copied","copyable"),1e3),t.preventDefault()}}))});
\ No newline at end of file
diff --git a/static/js/main.min.4.js b/static/js/main.min.4.js
new file mode 100644
index 00000000..5e237185
--- /dev/null
+++ b/static/js/main.min.4.js
@@ -0,0 +1 @@
+function syntaxHighlight(t){return(t=(t=JSON.stringify(t,void 0,2)).replace(/&/g,"&").replace(//g,">")).length>1e6?`${t}`:t.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,(t=>{let e="number";return/^"/.test(t)?e=/:$/.test(t)?"key":"string":/true|false/.test(t)?e="boolean":/null/.test(t)&&(e="null"),`${t}`}))}function getCoinCookie(){if(hasSecondary)return document.cookie.split("; ").find((t=>t.startsWith("secondary_coin=")))?.split("=")}function changeCSSStyle(t,e,n){const a=document.all?"rules":"cssRules";for(i=0,len=document.styleSheets[1][a].length;i`;if(a){let t=a.getAttribute("tm");t||(t="now"),i+=`${t}${a.outerHTML}
`}if(o&&(i+=`now${o.outerHTML}
`),e){let t=e.getAttribute("tm");t||(t="now"),i+=`${t}${e.outerHTML}
`}return n&&(i+=`now${n.outerHTML}
`),`${i}`}function addressAliasTooltip(){return`${this.getAttribute("alias-type")}
${this.getAttribute("cc")}`}function handleTxPage(t,e){const n=document.getElementById("raw"),a=document.getElementById("raw-button"),o=document.getElementById("raw-hex-button");n.innerHTML=syntaxHighlight(t);let i=!1;const r={};async function s(e){if(t.hex)return t.hex;if(r[e])return r[e];const n=await async function(t){const e=await fetch(`/api/rawtx/${t}`);if(!e.ok)throw new Error(`Error fetching data: ${e.status}`);const n=await e.text();return n.replace(/"/g,"")}(e);return r[e]=n,n}function l(){i?(a.classList.add("active"),a.style.fontWeight="normal",o.classList.remove("active"),o.style.fontWeight="bold"):(a.classList.remove("active"),a.style.fontWeight="bold",o.classList.add("active"),o.style.fontWeight="normal")}l(),o.addEventListener("click",(async()=>{if(!i){try{const t=await s(e);n.textContent=t}catch(t){console.error("Error fetching raw transaction hex:",t),n.textContent=`Error fetching raw transaction hex: ${t.message}`}i=!0,l()}})),a.addEventListener("click",(()=>{i&&(n.innerHTML=syntaxHighlight(t),i=!1,l())}))}window.addEventListener("DOMContentLoaded",(()=>{const t=getCoinCookie();3===t?.length&&("true"===t[2]&&(changeCSSStyle(".prim-amt","display","none"),changeCSSStyle(".sec-amt","display","initial")),document.querySelectorAll(".amt").forEach((t=>new bootstrap.Tooltip(t,{title:amountTooltip,html:!0})))),document.querySelectorAll("[alias-type]").forEach((t=>new bootstrap.Tooltip(t,{title:addressAliasTooltip,html:!0}))),document.querySelectorAll("[tt]").forEach((t=>new bootstrap.Tooltip(t,{title:t.getAttribute("tt")}))),document.querySelectorAll("#header .bb-group>.btn-check").forEach((t=>t.addEventListener("click",(t=>{const e=getCoinCookie(),n="secondary-coin"===t.target.id;3===e?.length&&"true"===e[2]!==n&&(document.cookie=`${e[0]}=${e[1]}=${n}; Path=/`,changeCSSStyle(".prim-amt","display",n?"none":"initial"),changeCSSStyle(".sec-amt","display",n?"initial":"none"))})))),document.querySelectorAll(".copyable").forEach((t=>t.addEventListener("click",(t=>{if(t.clientXt.target.className=t.target.className.replace("copied","copyable")),1e3),t.preventDefault()}}))))}));
\ No newline at end of file
diff --git a/static/templates/tx.html b/static/templates/tx.html
index f148f984..5d518d70 100644
--- a/static/templates/tx.html
+++ b/static/templates/tx.html
@@ -182,13 +182,19 @@
{{end}}
{{end}}
-
Raw Transaction
-
-
+
+
+
-
{{end}}
diff --git a/tests/dbtestdata/fakechain_ethereumtype.go b/tests/dbtestdata/fakechain_ethereumtype.go
index a8469271..3722ef41 100644
--- a/tests/dbtestdata/fakechain_ethereumtype.go
+++ b/tests/dbtestdata/fakechain_ethereumtype.go
@@ -139,6 +139,11 @@ func (c *fakeBlockChainEthereumType) EthereumTypeRpcCall(data, to, from string)
return data + "abcd", nil
}
+// EthereumTypeGetRawTransaction returns simulated transaction hex data
+func (c *fakeBlockChainEthereumType) EthereumTypeGetRawTransaction(txid string) (string, error) {
+ return txid + "abcd", nil
+}
+
// GetTokenURI returns URI derived from the input contractDesc
func (c *fakeBlockChainEthereumType) GetTokenURI(contractDesc bchain.AddressDescriptor, tokenID *big.Int) (string, error) {
return "https://ipfs.io/ipfs/" + contractDesc.String()[3:] + ".json", nil