feat(explorer): dual-chain wallet metadata, native coin pricing, and UI refresh.
Some checks failed
Deploy Explorer Live / deploy (push) Failing after 20s
Validate Explorer / frontend (push) Failing after 24s
Validate Explorer / smoke-e2e (push) Has been skipped

Add Chain 138 wallet network metadata and stats coin-price enrichment; sync frontend explorer SPA, command center, and address/token pages with backend config.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
defiQUG
2026-06-19 16:16:17 -07:00
parent 0f02e6e54f
commit b87ebee6a1
94 changed files with 7648 additions and 1124 deletions

23
backend/.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,23 @@
{
"go.useLanguageServer": true,
"go.alternateTools": {
"go": "/home/intlc/sdk/go1.23.4/bin/go",
"gopls": "/home/intlc/go/bin/gopls"
},
"go.toolsEnvVars": {
"GO111MODULE": "on",
"GOWORK": "off",
"GOROOT": "/home/intlc/sdk/go1.23.4",
"GOPATH": "/home/intlc/go",
"GOMODCACHE": "/home/intlc/go/pkg/mod"
},
"gopls": {
"build.env": {
"GO111MODULE": "on",
"GOWORK": "off",
"GOROOT": "/home/intlc/sdk/go1.23.4",
"GOPATH": "/home/intlc/go",
"GOMODCACHE": "/home/intlc/go/pkg/mod"
}
}
}

View File

@@ -1,23 +1,52 @@
{
"name": "MetaMask Multi-Chain Networks (13 chains)",
"version": {"major": 1, "minor": 2, "patch": 0},
"version": {"major": 1, "minor": 2, "patch": 1},
"defaultChainId": 138,
"explorerUrl": "https://explorer.d-bis.org",
"tokenListUrl": "https://explorer.d-bis.org/api/v1/report/token-list?chainId=138",
"tokenListUrl": "https://explorer.d-bis.org/api/config/token-list",
"generatedBy": "DBIS Explorer",
"chains": [
{"chainId":"0x8a","chainIdDecimal":138,"chainName":"DeFi Oracle Meta Mainnet","shortName":"dbis","rpcUrls":["https://rpc-http-pub.d-bis.org","https://rpc.d-bis.org","https://rpc2.d-bis.org","https://rpc.defi-oracle.io"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://explorer.d-bis.org","https://blockscout.defi-oracle.io"],"iconUrls":["https://explorer.d-bis.org/token-icons/chain-138.png","https://explorer.d-bis.org/api/v1/report/logo/chain-138","https://explorer.d-bis.org/favicon.ico"],"infoURL":"https://explorer.d-bis.org","explorerApiUrl":"https://explorer.d-bis.org/api/v2","testnet":false},
{"chainId":"0x1","chainIdDecimal":1,"chainName":"Ethereum Mainnet","shortName":"eth","rpcUrls":["https://eth.llamarpc.com","https://rpc.ankr.com/eth","https://ethereum.publicnode.com","https://1rpc.io/eth"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://etherscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"],"infoURL":"https://ethereum.org","testnet":false},
{"chainId":"0x9f2c4","chainIdDecimal":651940,"chainName":"ALL Mainnet","shortName":"all","rpcUrls":["https://mainnet-rpc.alltra.global"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://alltra.global"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"],"infoURL":"https://alltra.global","testnet":false},
{"chainId":"0x19","chainIdDecimal":25,"chainName":"Cronos Mainnet","rpcUrls":["https://evm.cronos.org","https://cronos-rpc.publicnode.com"],"nativeCurrency":{"name":"CRO","symbol":"CRO","decimals":18},"blockExplorerUrls":["https://cronos.org/explorer"],"iconUrls":["https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong"]},
{"chainId":"0x38","chainIdDecimal":56,"chainName":"BNB Smart Chain","rpcUrls":["https://bsc-dataseed.binance.org","https://bsc-dataseed1.defibit.io","https://bsc-dataseed1.ninicoin.io"],"nativeCurrency":{"name":"BNB","symbol":"BNB","decimals":18},"blockExplorerUrls":["https://bscscan.com"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]},
{"chainId":"0x64","chainIdDecimal":100,"chainName":"Gnosis Chain","rpcUrls":["https://rpc.gnosischain.com","https://gnosis-rpc.publicnode.com","https://1rpc.io/gnosis"],"nativeCurrency":{"name":"xDAI","symbol":"xDAI","decimals":18},"blockExplorerUrls":["https://gnosisscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]},
{"chainId":"0x89","chainIdDecimal":137,"chainName":"Polygon","rpcUrls":["https://polygon-rpc.com","https://polygon.llamarpc.com","https://polygon-bor-rpc.publicnode.com"],"nativeCurrency":{"name":"MATIC","symbol":"MATIC","decimals":18},"blockExplorerUrls":["https://polygonscan.com"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]},
{"chainId":"0xa","chainIdDecimal":10,"chainName":"Optimism","rpcUrls":["https://mainnet.optimism.io","https://optimism.llamarpc.com","https://optimism-rpc.publicnode.com"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://optimistic.etherscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]},
{"chainId":"0xa4b1","chainIdDecimal":42161,"chainName":"Arbitrum One","rpcUrls":["https://arb1.arbitrum.io/rpc","https://arbitrum.llamarpc.com","https://arbitrum-one-rpc.publicnode.com"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://arbiscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]},
{"chainId":"0x2105","chainIdDecimal":8453,"chainName":"Base","rpcUrls":["https://mainnet.base.org","https://base.llamarpc.com","https://base-rpc.publicnode.com"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://basescan.org"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]},
{"chainId":"0xa86a","chainIdDecimal":43114,"chainName":"Avalanche C-Chain","rpcUrls":["https://api.avax.network/ext/bc/C/rpc","https://avalanche-c-chain-rpc.publicnode.com","https://1rpc.io/avax/c"],"nativeCurrency":{"name":"AVAX","symbol":"AVAX","decimals":18},"blockExplorerUrls":["https://snowtrace.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]},
{"chainId":"0xa4ec","chainIdDecimal":42220,"chainName":"Celo","rpcUrls":["https://forno.celo.org","https://celo-mainnet-rpc.publicnode.com","https://1rpc.io/celo"],"nativeCurrency":{"name":"CELO","symbol":"CELO","decimals":18},"blockExplorerUrls":["https://celoscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]},
{"chainId":"0x457","chainIdDecimal":1111,"chainName":"Wemix","rpcUrls":["https://api.wemix.com","https://wemix-mainnet-rpc.publicnode.com"],"nativeCurrency":{"name":"WEMIX","symbol":"WEMIX","decimals":18},"blockExplorerUrls":["https://scan.wemix.com"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}
{
"chainId": "0x8a",
"chainIdDecimal": 138,
"chainName": "DeFi Oracle Meta Mainnet",
"shortName": "dbis",
"rpcUrls": ["https://rpc-http-pub.d-bis.org"],
"nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18},
"blockExplorerUrls": ["https://explorer.d-bis.org"],
"infoURL": "https://d-bis.org",
"explorerApiUrl": "https://explorer.d-bis.org/api/v2",
"testnet": false,
"iconUrls": [
"https://explorer.d-bis.org/api/v1/report/logo/chain-138",
"https://explorer.d-bis.org/token-icons/chain-138.png",
"https://explorer.d-bis.org/favicon.ico"
],
"oracles": [
{"name": "ETH/USD (proxy)", "address": "0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6", "decimals": 8},
{"name": "ETH/USD (aggregator)", "address": "0x99b3511a2d315a497c8112c1fdd8d508d4b1e506", "decimals": 8}
]
},
{
"chainId": "0x1",
"chainIdDecimal": 1,
"chainName": "Ethereum Mainnet",
"rpcUrls": ["https://eth.llamarpc.com", "https://rpc.ankr.com/eth", "https://ethereum.publicnode.com", "https://1rpc.io/eth"],
"nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18},
"blockExplorerUrls": ["https://etherscan.io"],
"iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png"],
"oracles": [{"name": "ETH/USD", "address": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", "decimals": 8}]
},
{"chainId": "0x9f2c4", "chainIdDecimal": 651940, "chainName": "ALL Mainnet", "rpcUrls": ["https://mainnet-rpc.alltra.global"], "nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18}, "blockExplorerUrls": ["https://alltra.global"], "iconUrls": ["https://alltra.global/favicon.ico"], "oracles": []},
{"chainId": "0x19", "chainIdDecimal": 25, "chainName": "Cronos Mainnet", "rpcUrls": ["https://evm.cronos.org", "https://cronos-rpc.publicnode.com"], "nativeCurrency": {"name": "CRO", "symbol": "CRO", "decimals": 18}, "blockExplorerUrls": ["https://cronos.org/explorer"], "iconUrls": ["https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong"], "oracles": []},
{"chainId": "0x38", "chainIdDecimal": 56, "chainName": "BNB Smart Chain", "rpcUrls": ["https://bsc-dataseed.binance.org", "https://bsc-dataseed1.defibit.io", "https://bsc-dataseed1.ninicoin.io"], "nativeCurrency": {"name": "BNB", "symbol": "BNB", "decimals": 18}, "blockExplorerUrls": ["https://bscscan.com"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/smartchain/info/logo.png"], "oracles": []},
{"chainId": "0x64", "chainIdDecimal": 100, "chainName": "Gnosis Chain", "rpcUrls": ["https://rpc.gnosischain.com", "https://gnosis-rpc.publicnode.com", "https://1rpc.io/gnosis"], "nativeCurrency": {"name": "xDAI", "symbol": "xDAI", "decimals": 18}, "blockExplorerUrls": ["https://gnosisscan.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/xdai/info/logo.png"], "oracles": []},
{"chainId": "0x89", "chainIdDecimal": 137, "chainName": "Polygon", "rpcUrls": ["https://polygon-rpc.com", "https://polygon.llamarpc.com", "https://polygon-bor-rpc.publicnode.com"], "nativeCurrency": {"name": "MATIC", "symbol": "MATIC", "decimals": 18}, "blockExplorerUrls": ["https://polygonscan.com"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/polygon/info/logo.png"], "oracles": []},
{"chainId": "0xa", "chainIdDecimal": 10, "chainName": "Optimism", "rpcUrls": ["https://mainnet.optimism.io", "https://optimism.llamarpc.com", "https://optimism-rpc.publicnode.com"], "nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18}, "blockExplorerUrls": ["https://optimistic.etherscan.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/optimism/info/logo.png"], "oracles": []},
{"chainId": "0xa4b1", "chainIdDecimal": 42161, "chainName": "Arbitrum One", "rpcUrls": ["https://arb1.arbitrum.io/rpc", "https://arbitrum.llamarpc.com", "https://arbitrum-one-rpc.publicnode.com"], "nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18}, "blockExplorerUrls": ["https://arbiscan.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/arbitrum/info/logo.png"], "oracles": []},
{"chainId": "0x2105", "chainIdDecimal": 8453, "chainName": "Base", "rpcUrls": ["https://mainnet.base.org", "https://base.llamarpc.com", "https://base-rpc.publicnode.com"], "nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18}, "blockExplorerUrls": ["https://basescan.org"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/base/info/logo.png"], "oracles": []},
{"chainId": "0xa86a", "chainIdDecimal": 43114, "chainName": "Avalanche C-Chain", "rpcUrls": ["https://api.avax.network/ext/bc/C/rpc", "https://avalanche-c-chain-rpc.publicnode.com", "https://1rpc.io/avax/c"], "nativeCurrency": {"name": "AVAX", "symbol": "AVAX", "decimals": 18}, "blockExplorerUrls": ["https://snowtrace.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/avalanchec/info/logo.png"], "oracles": []},
{"chainId": "0xa4ec", "chainIdDecimal": 42220, "chainName": "Celo", "rpcUrls": ["https://forno.celo.org", "https://celo-mainnet-rpc.publicnode.com", "https://1rpc.io/celo"], "nativeCurrency": {"name": "CELO", "symbol": "CELO", "decimals": 18}, "blockExplorerUrls": ["https://celoscan.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/celo/info/logo.png"], "oracles": []},
{"chainId": "0x457", "chainIdDecimal": 1111, "chainName": "Wemix", "rpcUrls": ["https://api.wemix.com", "https://wemix-mainnet-rpc.publicnode.com"], "nativeCurrency": {"name": "WEMIX", "symbol": "WEMIX", "decimals": 18}, "blockExplorerUrls": ["https://scan.wemix.com"], "iconUrls": ["https://scan.wemix.com/favicon.ico"], "oracles": []}
]
}

View File

@@ -23,6 +23,8 @@ type explorerStats struct {
GasPrices *explorerGasPrices `json:"gas_prices,omitempty"`
NetworkUtilizationPercentage *float64 `json:"network_utilization_percentage,omitempty"`
TransactionsToday *int64 `json:"transactions_today,omitempty"`
CoinPrice *string `json:"coin_price,omitempty"`
CoinImage *string `json:"coin_image,omitempty"`
Freshness freshness.Snapshot `json:"freshness"`
Completeness freshness.SummaryCompleteness `json:"completeness"`
Sampling freshness.Sampling `json:"sampling"`
@@ -268,6 +270,8 @@ func (s *Server) handleStats(w http.ResponseWriter, r *http.Request) {
}
}
enrichNativeCoinMarket(ctx, &stats)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(stats)
}

View File

@@ -0,0 +1,150 @@
package rest
import (
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"strings"
"time"
)
const (
chain138WETHAddress = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
)
type blockscoutCoinStats struct {
CoinPrice *string `json:"coin_price"`
CoinImage *string `json:"coin_image"`
}
type tokenAggregationTokenResponse struct {
Token struct {
Market struct {
PriceUsd *float64 `json:"priceUsd"`
} `json:"market"`
} `json:"token"`
}
func enrichNativeCoinMarket(ctx context.Context, stats *explorerStats) {
if stats.CoinPrice != nil && strings.TrimSpace(*stats.CoinPrice) != "" {
return
}
// Prefer on-chain token-aggregation WETH/ETH oracle over Blockscout CoinGecko on Chain 138.
if price := fetchTokenAggregationEthUsd(ctx); price != "" {
stats.CoinPrice = &price
if image := fetchBlockscoutCoinImage(ctx); image != "" {
stats.CoinImage = &image
}
return
}
bsURL := strings.TrimSpace(os.Getenv("BLOCKSCOUT_STATS_URL"))
if bsURL == "" {
bsURL = "http://127.0.0.1:4000/api/v2/stats"
}
if price, image := fetchBlockscoutCoinMarket(ctx, bsURL); price != "" {
stats.CoinPrice = &price
if image != "" {
stats.CoinImage = &image
}
}
}
func fetchBlockscoutCoinImage(ctx context.Context) string {
bsURL := strings.TrimSpace(os.Getenv("BLOCKSCOUT_STATS_URL"))
if bsURL == "" {
bsURL = "http://127.0.0.1:4000/api/v2/stats"
}
_, image := fetchBlockscoutCoinMarket(ctx, bsURL)
return image
}
func fetchBlockscoutCoinMarket(ctx context.Context, url string) (price string, image string) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return "", ""
}
client := &http.Client{Timeout: 4 * time.Second}
resp, err := client.Do(req)
if err != nil {
return "", ""
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", ""
}
body, err := io.ReadAll(io.LimitReader(resp.Body, 1<<20))
if err != nil {
return "", ""
}
var payload blockscoutCoinStats
if err := json.Unmarshal(body, &payload); err != nil {
return "", ""
}
if payload.CoinPrice != nil {
price = strings.TrimSpace(*payload.CoinPrice)
}
if payload.CoinImage != nil {
image = strings.TrimSpace(*payload.CoinImage)
}
return price, image
}
func tokenAggregationAPIV1Base() string {
base := strings.TrimRight(strings.TrimSpace(firstNonEmptyEnv(
"TOKEN_AGGREGATION_API_BASE",
"TOKEN_AGGREGATION_URL",
"TOKEN_AGGREGATION_BASE_URL",
)), "/")
if base == "" {
return "http://127.0.0.1:3001/api/v1"
}
if strings.HasSuffix(base, "/api/v1") {
return base
}
return base + "/api/v1"
}
func fetchTokenAggregationEthUsd(ctx context.Context) string {
url := fmt.Sprintf("%s/tokens/%s?chainId=138", tokenAggregationAPIV1Base(), chain138WETHAddress)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return ""
}
client := &http.Client{Timeout: 5 * time.Second}
resp, err := client.Do(req)
if err != nil {
return ""
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return ""
}
body, err := io.ReadAll(io.LimitReader(resp.Body, 1<<20))
if err != nil {
return ""
}
var payload tokenAggregationTokenResponse
if err := json.Unmarshal(body, &payload); err != nil {
return ""
}
if payload.Token.Market.PriceUsd == nil || *payload.Token.Market.PriceUsd <= 0 {
return ""
}
return formatUsdPrice(*payload.Token.Market.PriceUsd)
}
func formatUsdPrice(value float64) string {
return fmt.Sprintf("%.2f", value)
}

View File

@@ -0,0 +1,133 @@
package rest
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/require"
)
func TestEnrichNativeCoinMarketFromBlockscout(t *testing.T) {
tokenAgg := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
}))
defer tokenAgg.Close()
t.Setenv("TOKEN_AGGREGATION_BASE_URL", tokenAgg.URL)
blockscout := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
"coin_price": "1701.77",
"coin_image": "https://example.com/eth.png",
}))
}))
defer blockscout.Close()
t.Setenv("BLOCKSCOUT_STATS_URL", blockscout.URL)
stats := explorerStats{}
enrichNativeCoinMarket(context.Background(), &stats)
require.NotNil(t, stats.CoinPrice)
require.Equal(t, "1701.77", *stats.CoinPrice)
require.NotNil(t, stats.CoinImage)
require.Equal(t, "https://example.com/eth.png", *stats.CoinImage)
}
func TestEnrichNativeCoinMarketFallsBackToTokenAggregation(t *testing.T) {
blockscout := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
"coin_price": nil,
}))
}))
defer blockscout.Close()
tokenAgg := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
require.Contains(t, r.URL.Path, chain138WETHAddress)
w.Header().Set("Content-Type", "application/json")
require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
"token": map[string]any{
"market": map[string]any{
"priceUsd": 1678.67,
},
},
}))
}))
defer tokenAgg.Close()
t.Setenv("BLOCKSCOUT_STATS_URL", blockscout.URL)
t.Setenv("TOKEN_AGGREGATION_BASE_URL", tokenAgg.URL)
stats := explorerStats{}
enrichNativeCoinMarket(context.Background(), &stats)
require.NotNil(t, stats.CoinPrice)
require.Equal(t, "1678.67", *stats.CoinPrice)
}
func TestEnrichNativeCoinMarketPrefersTokenAggregationWithHostOnlyBaseURL(t *testing.T) {
blockscout := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
"coin_price": "1740.00",
}))
}))
defer blockscout.Close()
tokenAgg := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "/api/v1/tokens/"+chain138WETHAddress, r.URL.Path)
w.Header().Set("Content-Type", "application/json")
require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
"token": map[string]any{
"market": map[string]any{
"priceUsd": 1732.18,
},
},
}))
}))
defer tokenAgg.Close()
t.Setenv("BLOCKSCOUT_STATS_URL", blockscout.URL)
t.Setenv("TOKEN_AGGREGATION_BASE_URL", tokenAgg.URL)
stats := explorerStats{}
enrichNativeCoinMarket(context.Background(), &stats)
require.NotNil(t, stats.CoinPrice)
require.Equal(t, "1732.18", *stats.CoinPrice)
}
func TestEnrichNativeCoinMarketPrefersTokenAggregationOverBlockscout(t *testing.T) {
blockscout := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
"coin_price": "1740.00",
"coin_image": "https://example.com/eth.png",
}))
}))
defer blockscout.Close()
tokenAgg := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
require.Contains(t, r.URL.Path, chain138WETHAddress)
w.Header().Set("Content-Type", "application/json")
require.NoError(t, json.NewEncoder(w).Encode(map[string]any{
"token": map[string]any{
"market": map[string]any{
"priceUsd": 1732.18,
},
},
}))
}))
defer tokenAgg.Close()
t.Setenv("BLOCKSCOUT_STATS_URL", blockscout.URL)
t.Setenv("TOKEN_AGGREGATION_BASE_URL", tokenAgg.URL)
stats := explorerStats{}
enrichNativeCoinMarket(context.Background(), &stats)
require.NotNil(t, stats.CoinPrice)
require.Equal(t, "1732.18", *stats.CoinPrice)
require.NotNil(t, stats.CoinImage)
require.Equal(t, "https://example.com/eth.png", *stats.CoinImage)
}

View File

@@ -1,95 +1,52 @@
{
"name": "MetaMask Multi-Chain Networks (Chain 138 + Ethereum + ALL Mainnet + Cronos)",
"version": {
"major": 1,
"minor": 1,
"patch": 0
},
"name": "MetaMask Multi-Chain Networks (13 chains)",
"version": {"major": 1, "minor": 2, "patch": 1},
"defaultChainId": 138,
"explorerUrl": "https://explorer.d-bis.org",
"tokenListUrl": "https://explorer.d-bis.org/api/config/token-list",
"generatedBy": "DBIS Explorer",
"chains": [
{
"chainId": "0x8a",
"chainIdDecimal": 138,
"chainName": "DeFi Oracle Meta Mainnet",
"rpcUrls": [
"https://rpc-http-pub.d-bis.org",
"https://rpc.d-bis.org",
"https://rpc2.d-bis.org",
"https://rpc.defi-oracle.io"
],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"blockExplorerUrls": [
"https://explorer.d-bis.org"
],
"shortName": "dbis",
"rpcUrls": ["https://rpc-http-pub.d-bis.org"],
"nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18},
"blockExplorerUrls": ["https://explorer.d-bis.org"],
"infoURL": "https://d-bis.org",
"explorerApiUrl": "https://explorer.d-bis.org/api/v2",
"testnet": false,
"iconUrls": [
"https://explorer.d-bis.org/token-icons/chain-138.png",
"https://explorer.d-bis.org/api/v1/report/logo/chain-138",
"https://explorer.d-bis.org/token-icons/chain-138.png",
"https://explorer.d-bis.org/favicon.ico"
],
"oracles": [
{"name": "ETH/USD (proxy)", "address": "0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6", "decimals": 8},
{"name": "ETH/USD (aggregator)", "address": "0x99b3511a2d315a497c8112c1fdd8d508d4b1e506", "decimals": 8}
]
},
{
"chainId": "0x1",
"chainIdDecimal": 1,
"chainName": "Ethereum Mainnet",
"rpcUrls": [
"https://eth.llamarpc.com",
"https://rpc.ankr.com/eth",
"https://ethereum.publicnode.com",
"https://1rpc.io/eth"
],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"blockExplorerUrls": [
"https://etherscan.io"
],
"iconUrls": [
"https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"
]
"rpcUrls": ["https://eth.llamarpc.com", "https://rpc.ankr.com/eth", "https://ethereum.publicnode.com", "https://1rpc.io/eth"],
"nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18},
"blockExplorerUrls": ["https://etherscan.io"],
"iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png"],
"oracles": [{"name": "ETH/USD", "address": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", "decimals": 8}]
},
{
"chainId": "0x9f2c4",
"chainIdDecimal": 651940,
"chainName": "ALL Mainnet",
"rpcUrls": [
"https://mainnet-rpc.alltra.global"
],
"nativeCurrency": {
"name": "Ether",
"symbol": "ETH",
"decimals": 18
},
"blockExplorerUrls": [
"https://alltra.global"
],
"iconUrls": [
"https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"
]
},
{
"chainId": "0x19",
"chainIdDecimal": 25,
"chainName": "Cronos Mainnet",
"rpcUrls": [
"https://evm.cronos.org",
"https://cronos-rpc.publicnode.com"
],
"nativeCurrency": {
"name": "CRO",
"symbol": "CRO",
"decimals": 18
},
"blockExplorerUrls": [
"https://cronos.org/explorer"
],
"iconUrls": [
"https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong"
]
}
{"chainId": "0x9f2c4", "chainIdDecimal": 651940, "chainName": "ALL Mainnet", "rpcUrls": ["https://mainnet-rpc.alltra.global"], "nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18}, "blockExplorerUrls": ["https://alltra.global"], "iconUrls": ["https://alltra.global/favicon.ico"], "oracles": []},
{"chainId": "0x19", "chainIdDecimal": 25, "chainName": "Cronos Mainnet", "rpcUrls": ["https://evm.cronos.org", "https://cronos-rpc.publicnode.com"], "nativeCurrency": {"name": "CRO", "symbol": "CRO", "decimals": 18}, "blockExplorerUrls": ["https://cronos.org/explorer"], "iconUrls": ["https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong"], "oracles": []},
{"chainId": "0x38", "chainIdDecimal": 56, "chainName": "BNB Smart Chain", "rpcUrls": ["https://bsc-dataseed.binance.org", "https://bsc-dataseed1.defibit.io", "https://bsc-dataseed1.ninicoin.io"], "nativeCurrency": {"name": "BNB", "symbol": "BNB", "decimals": 18}, "blockExplorerUrls": ["https://bscscan.com"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/smartchain/info/logo.png"], "oracles": []},
{"chainId": "0x64", "chainIdDecimal": 100, "chainName": "Gnosis Chain", "rpcUrls": ["https://rpc.gnosischain.com", "https://gnosis-rpc.publicnode.com", "https://1rpc.io/gnosis"], "nativeCurrency": {"name": "xDAI", "symbol": "xDAI", "decimals": 18}, "blockExplorerUrls": ["https://gnosisscan.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/xdai/info/logo.png"], "oracles": []},
{"chainId": "0x89", "chainIdDecimal": 137, "chainName": "Polygon", "rpcUrls": ["https://polygon-rpc.com", "https://polygon.llamarpc.com", "https://polygon-bor-rpc.publicnode.com"], "nativeCurrency": {"name": "MATIC", "symbol": "MATIC", "decimals": 18}, "blockExplorerUrls": ["https://polygonscan.com"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/polygon/info/logo.png"], "oracles": []},
{"chainId": "0xa", "chainIdDecimal": 10, "chainName": "Optimism", "rpcUrls": ["https://mainnet.optimism.io", "https://optimism.llamarpc.com", "https://optimism-rpc.publicnode.com"], "nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18}, "blockExplorerUrls": ["https://optimistic.etherscan.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/optimism/info/logo.png"], "oracles": []},
{"chainId": "0xa4b1", "chainIdDecimal": 42161, "chainName": "Arbitrum One", "rpcUrls": ["https://arb1.arbitrum.io/rpc", "https://arbitrum.llamarpc.com", "https://arbitrum-one-rpc.publicnode.com"], "nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18}, "blockExplorerUrls": ["https://arbiscan.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/arbitrum/info/logo.png"], "oracles": []},
{"chainId": "0x2105", "chainIdDecimal": 8453, "chainName": "Base", "rpcUrls": ["https://mainnet.base.org", "https://base.llamarpc.com", "https://base-rpc.publicnode.com"], "nativeCurrency": {"name": "Ether", "symbol": "ETH", "decimals": 18}, "blockExplorerUrls": ["https://basescan.org"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/base/info/logo.png"], "oracles": []},
{"chainId": "0xa86a", "chainIdDecimal": 43114, "chainName": "Avalanche C-Chain", "rpcUrls": ["https://api.avax.network/ext/bc/C/rpc", "https://avalanche-c-chain-rpc.publicnode.com", "https://1rpc.io/avax/c"], "nativeCurrency": {"name": "AVAX", "symbol": "AVAX", "decimals": 18}, "blockExplorerUrls": ["https://snowtrace.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/avalanchec/info/logo.png"], "oracles": []},
{"chainId": "0xa4ec", "chainIdDecimal": 42220, "chainName": "Celo", "rpcUrls": ["https://forno.celo.org", "https://celo-mainnet-rpc.publicnode.com", "https://1rpc.io/celo"], "nativeCurrency": {"name": "CELO", "symbol": "CELO", "decimals": 18}, "blockExplorerUrls": ["https://celoscan.io"], "iconUrls": ["https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/celo/info/logo.png"], "oracles": []},
{"chainId": "0x457", "chainIdDecimal": 1111, "chainName": "Wemix", "rpcUrls": ["https://api.wemix.com", "https://wemix-mainnet-rpc.publicnode.com"], "nativeCurrency": {"name": "WEMIX", "symbol": "WEMIX", "decimals": 18}, "blockExplorerUrls": ["https://scan.wemix.com"], "iconUrls": ["https://scan.wemix.com/favicon.ico"], "oracles": []}
]
}

View File

@@ -3,9 +3,9 @@
"version": {
"major": 1,
"minor": 3,
"patch": 5
"patch": 4
},
"timestamp": "2026-06-02T15:13:02.229Z",
"timestamp": "2026-04-04T04:23:46.263Z",
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/chain138-list.svg",
"keywords": [
"chain138",
@@ -1552,6 +1552,287 @@
"wrapped"
]
},
{
"chainId": 138,
"address": "0xD51482e567c03899eecE3CAe8a058161FD56069D",
"name": "AUD Cash Electronic Money (Compliant)",
"symbol": "cAUDC",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/cAUDC.svg",
"tags": [
"gru",
"compliant",
"electronic-money"
]
},
{
"chainId": 138,
"address": "0x54dBd40cF05e15906A2C21f600937e96787f5679",
"name": "CAD Cash Electronic Money (Compliant)",
"symbol": "cCADC",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/cCADC.svg",
"tags": [
"gru",
"compliant",
"electronic-money"
]
},
{
"chainId": 138,
"address": "0x873990849DDa5117d7C644f0aF24370797C03885",
"name": "CHF Cash Electronic Money (Compliant)",
"symbol": "cCHFC",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/cCHFC.svg",
"tags": [
"gru",
"compliant",
"electronic-money"
]
},
{
"chainId": 138,
"address": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a",
"name": "EUR Cash Electronic Money (Compliant)",
"symbol": "cEURC",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/cEURC.svg",
"tags": [
"gru",
"compliant",
"electronic-money"
]
},
{
"chainId": 138,
"address": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72",
"name": "EUR Treasury / Government Bond (Compliant)",
"symbol": "cEURT",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/cEURT.svg",
"tags": [
"gru",
"compliant",
"treasury-bond"
]
},
{
"chainId": 138,
"address": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2",
"name": "GBP Cash Electronic Money (Compliant)",
"symbol": "cGBPC",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/cGBPC.svg",
"tags": [
"gru",
"compliant",
"electronic-money"
]
},
{
"chainId": 138,
"address": "0x350f54e4D23795f86A9c03988c7135357CCaD97c",
"name": "GBP Treasury / Government Bond (Compliant)",
"symbol": "cGBPT",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/cGBPT.svg",
"tags": [
"gru",
"compliant",
"treasury-bond"
]
},
{
"chainId": 138,
"address": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770",
"name": "JPY Cash Electronic Money (Compliant)",
"symbol": "cJPYC",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/Order-of-Hospitallers/proxmox-cp/main/token-lists/logos/gru/cJPYC.svg",
"tags": [
"gru",
"compliant",
"electronic-money"
]
},
{
"chainId": 138,
"address": "0xf22258f57794CC8E06237084b353Ab30fFfa640b",
"name": "USD Cash Electronic Money (Compliant)",
"symbol": "cUSDC",
"decimals": 6,
"logoURI": "https://explorer.d-bis.org/token-icons/cUSDC.png",
"tags": [
"gru",
"compliant",
"electronic-money",
"fiat",
"cash"
],
"extensions": {
"assetClass": "Cash & Equivalents",
"assetGroup": "MMF / Repo",
"instrumentType": "eMoney",
"underlying": "USD",
"gruLayer": "M1",
"rwaEligible": false,
"category": "gru-emoney",
"currency": "USD",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents"
}
},
{
"chainId": 138,
"address": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22",
"name": "USD Treasury / Government Bond (Compliant)",
"symbol": "cUSDT",
"decimals": 6,
"logoURI": "https://explorer.d-bis.org/token-icons/cUSDT.png",
"tags": [
"gru",
"compliant",
"treasury-bond",
"fiat",
"cash"
],
"extensions": {
"assetClass": "Cash & Equivalents",
"assetGroup": "MMF / Repo",
"instrumentType": "eMoney",
"underlying": "USD",
"gruLayer": "M1",
"rwaEligible": false,
"category": "gru-emoney",
"currency": "USD",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents"
}
},
{
"chainId": 138,
"address": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b",
"name": "XAU Commodity (Compliant)",
"symbol": "cXAUC",
"decimals": 6,
"logoURI": "https://explorer.d-bis.org/token-icons/cXAUC.png",
"tags": [
"gru",
"compliant"
],
"extensions": {
"unitOfAccount": "troy_ounce",
"unitDescription": "1 full token (10^decimals base units) = 1 troy oz fine gold",
"assetClass": "Commodities",
"assetGroup": "Precious Metals",
"instrumentType": "eMoney",
"underlying": "Gold",
"gruLayer": "M1",
"rwaEligible": false,
"category": "gru-emoney",
"cashLike": false
}
},
{
"chainId": 138,
"address": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E",
"name": "XAU Commodity (Compliant)",
"symbol": "cXAUT",
"decimals": 6,
"logoURI": "https://explorer.d-bis.org/token-icons/cXAUT.png",
"tags": [
"gru",
"compliant"
],
"extensions": {
"unitOfAccount": "troy_ounce",
"unitDescription": "1 full token (10^decimals base units) = 1 troy oz fine gold",
"assetClass": "Commodities",
"assetGroup": "Precious Metals",
"instrumentType": "eMoney",
"underlying": "Gold",
"gruLayer": "M1",
"rwaEligible": false,
"category": "gru-emoney",
"cashLike": false
}
},
{
"chainId": 138,
"address": "0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6",
"name": "ETH/USD Price Feed",
"symbol": "ETH-USD",
"decimals": 8,
"logoURI": "https://ipfs.io/ipfs/QmPZuycjyJEe2otREuQ5HirvPJ8X6Yc6MBtwz1VhdD79pY",
"tags": [
"oracle",
"price-feed"
]
},
{
"chainId": 138,
"address": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03",
"name": "Chainlink Token",
"symbol": "LINK",
"decimals": 18,
"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A",
"tags": [
"defi",
"oracle",
"ccip"
]
},
{
"chainId": 138,
"address": "0x71D6687F38b93CCad569Fa6352c876eea967201b",
"name": "USD Coin (Official Mirror)",
"symbol": "USDC",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png",
"tags": [
"reference-asset",
"defi"
]
},
{
"chainId": 138,
"address": "0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1",
"name": "Tether USD (Official Mirror)",
"symbol": "USDT",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png",
"tags": [
"reference-asset",
"defi"
]
},
{
"chainId": 138,
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"name": "Wrapped Ether",
"symbol": "WETH",
"decimals": 18,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"defi",
"wrapped"
]
},
{
"chainId": 138,
"address": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F",
"name": "Wrapped Ether v10",
"symbol": "WETH10",
"decimals": 18,
"logoURI": "https://ipfs.io/ipfs/QmanDFPHxnbKd6SSNzzXHf9GbpL9dLXSphxDZSPPYE6ds4",
"tags": [
"defi",
"wrapped"
]
},
{
"chainId": 1111,
"address": "0xE3F5a90F9cb311505cd691a46596599aA1A0AD7D",
@@ -2359,542 +2640,6 @@
"defi",
"bridge"
]
},
{
"chainId": 138,
"address": "0xD51482e567c03899eecE3CAe8a058161FD56069D",
"name": "Australian Dollar (Compliant)",
"symbol": "cAUDC",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "tokenized-fiat",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "AUD",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cAUDC",
"x402Ready": false,
"fwdCanon": false
}
},
{
"chainId": 138,
"address": "0x54dBd40cF05e15906A2C21f600937e96787f5679",
"name": "Canadian Dollar (Compliant)",
"symbol": "cCADC",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "tokenized-fiat",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "CAD",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cCADC",
"x402Ready": false,
"fwdCanon": false
}
},
{
"chainId": 138,
"address": "0x873990849DDa5117d7C644f0aF24370797C03885",
"name": "Swiss Franc (Compliant)",
"symbol": "cCHFC",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "tokenized-fiat",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "CHF",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cCHFC",
"x402Ready": false,
"fwdCanon": false
}
},
{
"chainId": 138,
"address": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a",
"name": "Euro Coin (Compliant)",
"symbol": "cEURC",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "tokenized-fiat",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "EUR",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cEURC",
"x402Ready": false,
"fwdCanon": false
}
},
{
"chainId": 138,
"address": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72",
"name": "Tether EUR (Compliant)",
"symbol": "cEURT",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "tokenized-fiat",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "EUR",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cEURT",
"x402Ready": false,
"fwdCanon": false
}
},
{
"chainId": 138,
"address": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2",
"name": "Pound Sterling (Compliant)",
"symbol": "cGBPC",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "tokenized-fiat",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "GBP",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cGBPC",
"x402Ready": false,
"fwdCanon": false
}
},
{
"chainId": 138,
"address": "0x350f54e4D23795f86A9c03988c7135357CCaD97c",
"name": "Tether GBP (Compliant)",
"symbol": "cGBPT",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "tokenized-fiat",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "GBP",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cGBPT",
"x402Ready": false,
"fwdCanon": false
}
},
{
"chainId": 138,
"address": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770",
"name": "Japanese Yen (Compliant)",
"symbol": "cJPYC",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "tokenized-fiat",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "JPY",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cJPYC",
"x402Ready": false,
"fwdCanon": false
}
},
{
"chainId": 138,
"address": "0xf22258f57794CC8E06237084b353Ab30fFfa640b",
"name": "Compliant USD Coin",
"symbol": "cUSDC",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "gru-emoney",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "USD",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cUSDC",
"x402Ready": false,
"fwdCanon": false,
"assetClass": "Cash & Equivalents",
"assetGroup": "MMF / Repo",
"instrumentType": "eMoney",
"underlying": "USD",
"gruLayer": "M1",
"rwaEligible": false
}
},
{
"chainId": 138,
"address": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22",
"name": "Compliant Tether USD",
"symbol": "cUSDT",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru"
],
"extensions": {
"category": "gru-emoney",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "USD",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v1",
"gruFamily": "cUSDT",
"x402Ready": false,
"fwdCanon": false,
"assetClass": "Cash & Equivalents",
"assetGroup": "MMF / Repo",
"instrumentType": "eMoney",
"underlying": "USD",
"gruLayer": "M1",
"rwaEligible": false
}
},
{
"chainId": 138,
"address": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b",
"name": "Gold (Compliant)",
"symbol": "cXAUC",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"defi",
"compliant",
"gru"
],
"extensions": {
"category": "gru-emoney",
"instrument": "commodity-referenced-token",
"settlement": "commodity",
"cashLike": false,
"backing": "commodity-reserves",
"gruVersion": "v1",
"gruFamily": "cXAUC",
"walletClass": "token",
"commodity": "gold",
"unit": "troy_ounce",
"assetClass": "Commodities",
"assetGroup": "Precious Metals",
"instrumentType": "eMoney",
"underlying": "Gold",
"gruLayer": "M1",
"rwaEligible": false
}
},
{
"chainId": 138,
"address": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E",
"name": "Tether XAU (Compliant)",
"symbol": "cXAUT",
"decimals": 6,
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
"tags": [
"defi",
"compliant",
"gru"
],
"extensions": {
"category": "gru-emoney",
"instrument": "commodity-referenced-token",
"settlement": "commodity",
"cashLike": false,
"backing": "commodity-reserves",
"gruVersion": "v1",
"gruFamily": "cXAUT",
"walletClass": "token",
"commodity": "gold",
"unit": "troy_ounce",
"assetClass": "Commodities",
"assetGroup": "Precious Metals",
"instrumentType": "eMoney",
"underlying": "Gold",
"gruLayer": "M1",
"rwaEligible": false
}
},
{
"chainId": 138,
"address": "0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6",
"name": "ETH/USD Price Feed",
"symbol": "ETH-USD",
"decimals": 8,
"logoURI": "https://ipfs.io/ipfs/QmPZuycjyJEe2otREuQ5HirvPJ8X6Yc6MBtwz1VhdD79pY",
"tags": [
"oracle",
"pricefeed"
]
},
{
"chainId": 138,
"address": "0xc5b802662447d1ae492a1618c3ad7161a449ebc9",
"name": "Base Metals Group Index 1 (M00)",
"symbol": "LiBMG1",
"decimals": 6,
"tags": [
"rwa",
"index",
"m00"
],
"extensions": {
"category": "rwa-index",
"gruLayer": "M00",
"rwaEligible": true,
"notEmoney": true,
"assetClass": "Commodities",
"assetGroup": "Industrial Metals",
"instrumentType": "Basket Index",
"underlying": "Base Metals",
"collateralType": "physical"
}
},
{
"chainId": 138,
"address": "0x2ca3b3e7f4f216015833b0b334273d44493c0c45",
"name": "Base Metals Group Index 2 (M00)",
"symbol": "LiBMG2",
"decimals": 6,
"tags": [
"rwa",
"index",
"m00"
],
"extensions": {
"category": "rwa-index",
"gruLayer": "M00",
"rwaEligible": true,
"notEmoney": true,
"assetClass": "Commodities",
"assetGroup": "Industrial Metals",
"instrumentType": "Basket Index",
"underlying": "Battery Materials",
"collateralType": "physical"
}
},
{
"chainId": 138,
"address": "0xb03d872196c0e84fe6fae841335001db44bda6c7",
"name": "Base Metals Group Index 3 (M00)",
"symbol": "LiBMG3",
"decimals": 6,
"tags": [
"rwa",
"index",
"m00"
],
"extensions": {
"category": "rwa-index",
"gruLayer": "M00",
"rwaEligible": true,
"notEmoney": true,
"assetClass": "Commodities",
"assetGroup": "Industrial Metals",
"instrumentType": "Basket Index",
"underlying": "Building Metals",
"collateralType": "physical"
}
},
{
"chainId": 138,
"address": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03",
"name": "Chainlink Token",
"symbol": "LINK",
"decimals": 18,
"logoURI": "https://explorer.d-bis.org/api/v1/report/logo/LINK",
"tags": [
"defi",
"oracle",
"ccip"
]
},
{
"chainId": 138,
"address": "0x148b0f5c6fc8c5975e9406635654d88b20db2ed6",
"name": "Precious Metals Group Index (M00)",
"symbol": "LiPMG",
"decimals": 6,
"tags": [
"rwa",
"index",
"m00"
],
"extensions": {
"category": "rwa-index",
"gruLayer": "M00",
"rwaEligible": true,
"notEmoney": true,
"assetClass": "Commodities",
"assetGroup": "Precious Metals",
"instrumentType": "Basket Index",
"underlying": "Precious Metals",
"collateralType": "physical"
}
},
{
"chainId": 138,
"address": "0xff862f0d1f96aa4882a0c2d6b4a3516fd8d68e75",
"name": "XAU Liquidity Index (M00, not cXAUC eMoney)",
"symbol": "LiXAU",
"decimals": 6,
"tags": [
"rwa",
"index",
"m00"
],
"extensions": {
"category": "rwa-index",
"gruLayer": "M00",
"rwaEligible": true,
"notEmoney": true,
"assetClass": "Commodities",
"assetGroup": "Precious Metals",
"instrumentType": "Commodity Index",
"underlying": "Gold",
"collateralType": "physical"
}
},
{
"chainId": 138,
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"name": "Wrapped Ether",
"symbol": "WETH",
"decimals": 18,
"logoURI": "https://explorer.d-bis.org/api/v1/report/logo/ETH",
"tags": [
"defi",
"wrapped"
],
"extensions": {
"category": "wrapped-native",
"instrument": "wrapped-native",
"settlement": "crypto-native",
"cashLike": false,
"backing": "native-gas-asset",
"walletClass": "token",
"alias": "WETH9",
"aliasNote": "Expose WETH9 as a compatibility alias on s"
}
},
{
"chainId": 138,
"address": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F",
"name": "Wrapped Ether v10",
"symbol": "WETH10",
"decimals": 18,
"logoURI": "https://explorer.d-bis.org/api/v1/report/logo/ETH",
"tags": [
"defi",
"wrapped"
],
"extensions": {
"category": "wrapped-native",
"instrument": "wrapped-native",
"settlement": "crypto-native",
"cashLike": false,
"backing": "native-gas-asset",
"walletClass": "token"
}
}
]
}

View File

@@ -9,7 +9,7 @@ require (
github.com/ethereum/go-ethereum v1.13.5
github.com/golang-jwt/jwt/v4 v4.5.2
github.com/gorilla/websocket v1.5.1
github.com/jackc/pgx/v5 v5.5.1
github.com/jackc/pgx/v5 v5.5.5
github.com/redis/go-redis/v9 v9.17.2
github.com/stretchr/testify v1.11.1
golang.org/x/crypto v0.36.0
@@ -33,6 +33,7 @@ require (
github.com/ethereum/c-kzg-4844 v0.4.0 // indirect
github.com/go-ole/go-ole v1.2.5 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/holiman/uint256 v1.2.3 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect
@@ -40,6 +41,8 @@ require (
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect
github.com/rogpeppe/go-internal v1.10.0 // indirect
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
github.com/supranational/blst v0.3.11 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
@@ -51,6 +54,5 @@ require (
golang.org/x/sys v0.31.0 // indirect
golang.org/x/text v0.23.0 // indirect
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
google.golang.org/protobuf v1.33.0 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
)

View File

@@ -75,13 +75,11 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
@@ -98,14 +96,14 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA=
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.5.1 h1:5I9etrGkLrN+2XPCsi6XLlV5DITbSL/xBZdmAxFcXPI=
github.com/jackc/pgx/v5 v5.5.1/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -120,8 +118,6 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
@@ -129,26 +125,28 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg=
github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y=
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/redis/go-redis/v9 v9.17.2 h1:P2EGsA4qVIM3Pp+aPocCJ7DguDHhqrXNhVcEp4ViluI=
github.com/redis/go-redis/v9 v9.17.2/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
@@ -198,8 +196,8 @@ golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=