github.com/cryptohub-digital/blockbook-fork@v0.0.0-20230713133354-673c927af7f1/bchain/coins/blockchain.go (about) 1 package coins 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "io/ioutil" 8 "math/big" 9 "reflect" 10 "time" 11 12 "github.com/cryptohub-digital/blockbook-fork/bchain" 13 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/avalanche" 14 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/bch" 15 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/bellcoin" 16 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/bitcore" 17 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/bitzeny" 18 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/bsc" 19 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/btc" 20 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/btg" 21 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/cpuchain" 22 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/dash" 23 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/dcr" 24 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/deeponion" 25 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/digibyte" 26 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/divi" 27 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/dogecoin" 28 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/ecash" 29 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/eth" 30 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/firo" 31 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/flo" 32 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/fujicoin" 33 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/gamecredits" 34 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/grs" 35 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/koto" 36 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/liquid" 37 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/litecoin" 38 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/monacoin" 39 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/monetaryunit" 40 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/myriad" 41 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/namecoin" 42 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/nuls" 43 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/omotenashicoin" 44 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/pivx" 45 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/polis" 46 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/qtum" 47 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/ravencoin" 48 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/ritocoin" 49 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/snowgem" 50 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/trezarcoin" 51 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/unobtanium" 52 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/vertcoin" 53 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/viacoin" 54 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/vipstarcoin" 55 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/xcb" 56 "github.com/cryptohub-digital/blockbook-fork/bchain/coins/zec" 57 58 "github.com/cryptohub-digital/blockbook-fork/common" 59 "github.com/juju/errors" 60 ) 61 62 type blockChainFactory func(config json.RawMessage, pushHandler func(bchain.NotificationType)) (bchain.BlockChain, error) 63 64 // BlockChainFactories is a map of constructors of coin RPC interfaces 65 var BlockChainFactories = make(map[string]blockChainFactory) 66 67 func init() { 68 BlockChainFactories["Bitcoin"] = btc.NewBitcoinRPC 69 BlockChainFactories["Testnet"] = btc.NewBitcoinRPC 70 BlockChainFactories["Signet"] = btc.NewBitcoinRPC 71 BlockChainFactories["Regtest"] = btc.NewBitcoinRPC 72 BlockChainFactories["Zcash"] = zec.NewZCashRPC 73 BlockChainFactories["Zcash Testnet"] = zec.NewZCashRPC 74 BlockChainFactories["Ethereum"] = eth.NewEthereumRPC 75 BlockChainFactories["Ethereum Archive"] = eth.NewEthereumRPC 76 BlockChainFactories["Ethereum Classic"] = eth.NewEthereumRPC 77 BlockChainFactories["Ethereum Testnet Ropsten"] = eth.NewEthereumRPC 78 BlockChainFactories["Ethereum Testnet Ropsten Archive"] = eth.NewEthereumRPC 79 BlockChainFactories["Ethereum Testnet Goerli"] = eth.NewEthereumRPC 80 BlockChainFactories["Ethereum Testnet Goerli Archive"] = eth.NewEthereumRPC 81 BlockChainFactories["Ethereum Testnet Sepolia"] = eth.NewEthereumRPC 82 BlockChainFactories["Ethereum Testnet Sepolia Archive"] = eth.NewEthereumRPC 83 BlockChainFactories["Bcash"] = bch.NewBCashRPC 84 BlockChainFactories["Bcash Testnet"] = bch.NewBCashRPC 85 BlockChainFactories["Bgold"] = btg.NewBGoldRPC 86 BlockChainFactories["Bgold Testnet"] = btg.NewBGoldRPC 87 BlockChainFactories["Dash"] = dash.NewDashRPC 88 BlockChainFactories["Dash Testnet"] = dash.NewDashRPC 89 BlockChainFactories["Decred"] = dcr.NewDecredRPC 90 BlockChainFactories["Decred Testnet"] = dcr.NewDecredRPC 91 BlockChainFactories["GameCredits"] = gamecredits.NewGameCreditsRPC 92 BlockChainFactories["Koto"] = koto.NewKotoRPC 93 BlockChainFactories["Koto Testnet"] = koto.NewKotoRPC 94 BlockChainFactories["Litecoin"] = litecoin.NewLitecoinRPC 95 BlockChainFactories["Litecoin Testnet"] = litecoin.NewLitecoinRPC 96 BlockChainFactories["Dogecoin"] = dogecoin.NewDogecoinRPC 97 BlockChainFactories["Dogecoin Testnet"] = dogecoin.NewDogecoinRPC 98 BlockChainFactories["Vertcoin"] = vertcoin.NewVertcoinRPC 99 BlockChainFactories["Vertcoin Testnet"] = vertcoin.NewVertcoinRPC 100 BlockChainFactories["Namecoin"] = namecoin.NewNamecoinRPC 101 BlockChainFactories["Monacoin"] = monacoin.NewMonacoinRPC 102 BlockChainFactories["Monacoin Testnet"] = monacoin.NewMonacoinRPC 103 BlockChainFactories["MonetaryUnit"] = monetaryunit.NewMonetaryUnitRPC 104 BlockChainFactories["DigiByte"] = digibyte.NewDigiByteRPC 105 BlockChainFactories["DigiByte Testnet"] = digibyte.NewDigiByteRPC 106 BlockChainFactories["Myriad"] = myriad.NewMyriadRPC 107 BlockChainFactories["Liquid"] = liquid.NewLiquidRPC 108 BlockChainFactories["Groestlcoin"] = grs.NewGroestlcoinRPC 109 BlockChainFactories["Groestlcoin Testnet"] = grs.NewGroestlcoinRPC 110 BlockChainFactories["Groestlcoin Signet"] = grs.NewGroestlcoinRPC 111 BlockChainFactories["Groestlcoin Regtest"] = grs.NewGroestlcoinRPC 112 BlockChainFactories["PIVX"] = pivx.NewPivXRPC 113 BlockChainFactories["PIVX Testnet"] = pivx.NewPivXRPC 114 BlockChainFactories["Polis"] = polis.NewPolisRPC 115 BlockChainFactories["Firo"] = firo.NewFiroRPC 116 BlockChainFactories["Fujicoin"] = fujicoin.NewFujicoinRPC 117 BlockChainFactories["Flo"] = flo.NewFloRPC 118 BlockChainFactories["Bellcoin"] = bellcoin.NewBellcoinRPC 119 BlockChainFactories["Qtum"] = qtum.NewQtumRPC 120 BlockChainFactories["Viacoin"] = viacoin.NewViacoinRPC 121 BlockChainFactories["Qtum Testnet"] = qtum.NewQtumRPC 122 BlockChainFactories["NULS"] = nuls.NewNulsRPC 123 BlockChainFactories["VIPSTARCOIN"] = vipstarcoin.NewVIPSTARCOINRPC 124 BlockChainFactories["Flux"] = zec.NewZCashRPC 125 BlockChainFactories["Ravencoin"] = ravencoin.NewRavencoinRPC 126 BlockChainFactories["Ritocoin"] = ritocoin.NewRitocoinRPC 127 BlockChainFactories["Divi"] = divi.NewDiviRPC 128 BlockChainFactories["CPUchain"] = cpuchain.NewCPUchainRPC 129 BlockChainFactories["Unobtanium"] = unobtanium.NewUnobtaniumRPC 130 BlockChainFactories["DeepOnion"] = deeponion.NewDeepOnionRPC 131 BlockChainFactories["SnowGem"] = snowgem.NewSnowGemRPC 132 BlockChainFactories["Bitcore"] = bitcore.NewBitcoreRPC 133 BlockChainFactories["Omotenashicoin"] = omotenashicoin.NewOmotenashiCoinRPC 134 BlockChainFactories["Omotenashicoin Testnet"] = omotenashicoin.NewOmotenashiCoinRPC 135 BlockChainFactories["BitZeny"] = bitzeny.NewBitZenyRPC 136 BlockChainFactories["Trezarcoin"] = trezarcoin.NewTrezarcoinRPC 137 BlockChainFactories["ECash"] = ecash.NewECashRPC 138 BlockChainFactories["Avalanche"] = avalanche.NewAvalancheRPC 139 BlockChainFactories["Avalanche Archive"] = avalanche.NewAvalancheRPC 140 BlockChainFactories["BNB Smart Chain"] = bsc.NewBNBSmartChainRPC 141 BlockChainFactories["BNB Smart Chain Archive"] = bsc.NewBNBSmartChainRPC 142 BlockChainFactories["Core Coin"] = xcb.NewCoreblockchainRPC 143 144 } 145 146 // GetCoinNameFromConfig gets coin name and coin shortcut from config file 147 func GetCoinNameFromConfig(configFileContent []byte) (string, string, string, error) { 148 var cn struct { 149 CoinName string `json:"coin_name"` 150 CoinShortcut string `json:"coin_shortcut"` 151 CoinLabel string `json:"coin_label"` 152 } 153 err := json.Unmarshal(configFileContent, &cn) 154 if err != nil { 155 return "", "", "", errors.Annotatef(err, "Error parsing config file ") 156 } 157 return cn.CoinName, cn.CoinShortcut, cn.CoinLabel, nil 158 } 159 160 // NewBlockChain creates bchain.BlockChain and bchain.Mempool for the coin passed by the parameter coin 161 func NewBlockChain(coin string, configfile string, pushHandler func(bchain.NotificationType), metrics *common.Metrics) (bchain.BlockChain, bchain.Mempool, error) { 162 data, err := ioutil.ReadFile(configfile) 163 if err != nil { 164 return nil, nil, errors.Annotatef(err, "Error reading file %v", configfile) 165 } 166 var config json.RawMessage 167 err = json.Unmarshal(data, &config) 168 if err != nil { 169 return nil, nil, errors.Annotatef(err, "Error parsing file %v", configfile) 170 } 171 bcf, ok := BlockChainFactories[coin] 172 if !ok { 173 return nil, nil, errors.New(fmt.Sprint("Unsupported coin '", coin, "'. Must be one of ", reflect.ValueOf(BlockChainFactories).MapKeys())) 174 } 175 bc, err := bcf(config, pushHandler) 176 if err != nil { 177 return nil, nil, err 178 } 179 err = bc.Initialize() 180 if err != nil { 181 return nil, nil, err 182 } 183 mempool, err := bc.CreateMempool(bc) 184 if err != nil { 185 return nil, nil, err 186 } 187 return &blockChainWithMetrics{b: bc, m: metrics}, &mempoolWithMetrics{mempool: mempool, m: metrics}, nil 188 } 189 190 type blockChainWithMetrics struct { 191 b bchain.BlockChain 192 m *common.Metrics 193 } 194 195 func (c *blockChainWithMetrics) observeRPCLatency(method string, start time.Time, err error) { 196 var e string 197 if err != nil { 198 e = "failure" 199 } 200 c.m.RPCLatency.With(common.Labels{"method": method, "error": e}).Observe(float64(time.Since(start)) / 1e6) // in milliseconds 201 } 202 203 func (c *blockChainWithMetrics) Initialize() error { 204 return c.b.Initialize() 205 } 206 207 func (c *blockChainWithMetrics) CreateMempool(chain bchain.BlockChain) (bchain.Mempool, error) { 208 return c.b.CreateMempool(chain) 209 } 210 211 func (c *blockChainWithMetrics) InitializeMempool(addrDescForOutpoint bchain.AddrDescForOutpointFunc, onNewTxAddr bchain.OnNewTxAddrFunc, onNewTx bchain.OnNewTxFunc) error { 212 return c.b.InitializeMempool(addrDescForOutpoint, onNewTxAddr, onNewTx) 213 } 214 215 func (c *blockChainWithMetrics) Shutdown(ctx context.Context) error { 216 return c.b.Shutdown(ctx) 217 } 218 219 func (c *blockChainWithMetrics) IsTestnet() bool { 220 return c.b.IsTestnet() 221 } 222 223 func (c *blockChainWithMetrics) GetNetworkName() string { 224 return c.b.GetNetworkName() 225 } 226 227 func (c *blockChainWithMetrics) GetCoinName() string { 228 return c.b.GetCoinName() 229 } 230 231 func (c *blockChainWithMetrics) GetSubversion() string { 232 return c.b.GetSubversion() 233 } 234 235 func (c *blockChainWithMetrics) GetChainInfo() (v *bchain.ChainInfo, err error) { 236 defer func(s time.Time) { c.observeRPCLatency("GetChainInfo", s, err) }(time.Now()) 237 return c.b.GetChainInfo() 238 } 239 240 func (c *blockChainWithMetrics) GetBestBlockHash() (v string, err error) { 241 defer func(s time.Time) { c.observeRPCLatency("GetBestBlockHash", s, err) }(time.Now()) 242 return c.b.GetBestBlockHash() 243 } 244 245 func (c *blockChainWithMetrics) GetBestBlockHeight() (v uint32, err error) { 246 defer func(s time.Time) { c.observeRPCLatency("GetBestBlockHeight", s, err) }(time.Now()) 247 return c.b.GetBestBlockHeight() 248 } 249 250 func (c *blockChainWithMetrics) GetBlockHash(height uint32) (v string, err error) { 251 defer func(s time.Time) { c.observeRPCLatency("GetBlockHash", s, err) }(time.Now()) 252 return c.b.GetBlockHash(height) 253 } 254 255 func (c *blockChainWithMetrics) GetBlockHeader(hash string) (v *bchain.BlockHeader, err error) { 256 defer func(s time.Time) { c.observeRPCLatency("GetBlockHeader", s, err) }(time.Now()) 257 return c.b.GetBlockHeader(hash) 258 } 259 260 func (c *blockChainWithMetrics) GetBlock(hash string, height uint32) (v *bchain.Block, err error) { 261 defer func(s time.Time) { c.observeRPCLatency("GetBlock", s, err) }(time.Now()) 262 return c.b.GetBlock(hash, height) 263 } 264 265 func (c *blockChainWithMetrics) GetBlockInfo(hash string) (v *bchain.BlockInfo, err error) { 266 defer func(s time.Time) { c.observeRPCLatency("GetBlockInfo", s, err) }(time.Now()) 267 return c.b.GetBlockInfo(hash) 268 } 269 270 func (c *blockChainWithMetrics) GetBlockRaw(hash string) (v string, err error) { 271 defer func(s time.Time) { c.observeRPCLatency("GetBlockRaw", s, err) }(time.Now()) 272 return c.b.GetBlockRaw(hash) 273 } 274 275 func (c *blockChainWithMetrics) GetMempoolTransactions() (v []string, err error) { 276 defer func(s time.Time) { c.observeRPCLatency("GetMempoolTransactions", s, err) }(time.Now()) 277 return c.b.GetMempoolTransactions() 278 } 279 280 func (c *blockChainWithMetrics) GetTransaction(txid string) (v *bchain.Tx, err error) { 281 defer func(s time.Time) { c.observeRPCLatency("GetTransaction", s, err) }(time.Now()) 282 return c.b.GetTransaction(txid) 283 } 284 285 func (c *blockChainWithMetrics) GetTransactionSpecific(tx *bchain.Tx) (v json.RawMessage, err error) { 286 defer func(s time.Time) { c.observeRPCLatency("GetTransactionSpecific", s, err) }(time.Now()) 287 return c.b.GetTransactionSpecific(tx) 288 } 289 290 func (c *blockChainWithMetrics) GetTransactionForMempool(txid string) (v *bchain.Tx, err error) { 291 defer func(s time.Time) { c.observeRPCLatency("GetTransactionForMempool", s, err) }(time.Now()) 292 return c.b.GetTransactionForMempool(txid) 293 } 294 295 func (c *blockChainWithMetrics) EstimateSmartFee(blocks int, conservative bool) (v big.Int, err error) { 296 defer func(s time.Time) { c.observeRPCLatency("EstimateSmartFee", s, err) }(time.Now()) 297 return c.b.EstimateSmartFee(blocks, conservative) 298 } 299 300 func (c *blockChainWithMetrics) EstimateFee(blocks int) (v big.Int, err error) { 301 defer func(s time.Time) { c.observeRPCLatency("EstimateFee", s, err) }(time.Now()) 302 return c.b.EstimateFee(blocks) 303 } 304 305 func (c *blockChainWithMetrics) SendRawTransaction(tx string) (v string, err error) { 306 defer func(s time.Time) { c.observeRPCLatency("SendRawTransaction", s, err) }(time.Now()) 307 return c.b.SendRawTransaction(tx) 308 } 309 310 func (c *blockChainWithMetrics) GetMempoolEntry(txid string) (v *bchain.MempoolEntry, err error) { 311 defer func(s time.Time) { c.observeRPCLatency("GetMempoolEntry", s, err) }(time.Now()) 312 return c.b.GetMempoolEntry(txid) 313 } 314 315 func (c *blockChainWithMetrics) GetChainParser() bchain.BlockChainParser { 316 return c.b.GetChainParser() 317 } 318 319 func (c *blockChainWithMetrics) EthereumTypeGetBalance(addrDesc bchain.AddressDescriptor) (v *big.Int, err error) { 320 defer func(s time.Time) { c.observeRPCLatency("EthereumTypeGetBalance", s, err) }(time.Now()) 321 return c.b.EthereumTypeGetBalance(addrDesc) 322 } 323 324 func (c *blockChainWithMetrics) EthereumTypeGetNonce(addrDesc bchain.AddressDescriptor) (v uint64, err error) { 325 defer func(s time.Time) { c.observeRPCLatency("EthereumTypeGetNonce", s, err) }(time.Now()) 326 return c.b.EthereumTypeGetNonce(addrDesc) 327 } 328 329 func (c *blockChainWithMetrics) EthereumTypeEstimateGas(params map[string]interface{}) (v uint64, err error) { 330 defer func(s time.Time) { c.observeRPCLatency("EthereumTypeEstimateGas", s, err) }(time.Now()) 331 return c.b.EthereumTypeEstimateGas(params) 332 } 333 334 func (c *blockChainWithMetrics) GetContractInfo(contractDesc bchain.AddressDescriptor) (v *bchain.ContractInfo, err error) { 335 defer func(s time.Time) { c.observeRPCLatency("GetContractInfo", s, err) }(time.Now()) 336 return c.b.GetContractInfo(contractDesc) 337 } 338 339 func (c *blockChainWithMetrics) EthereumTypeGetErc20ContractBalance(addrDesc, contractDesc bchain.AddressDescriptor) (v *big.Int, err error) { 340 defer func(s time.Time) { c.observeRPCLatency("EthereumTypeGetErc20ContractBalance", s, err) }(time.Now()) 341 return c.b.EthereumTypeGetErc20ContractBalance(addrDesc, contractDesc) 342 } 343 344 // GetTokenURI returns URI of non fungible or multi token defined by token id 345 func (c *blockChainWithMetrics) GetTokenURI(contractDesc bchain.AddressDescriptor, tokenID *big.Int) (v string, err error) { 346 defer func(s time.Time) { c.observeRPCLatency("GetTokenURI", s, err) }(time.Now()) 347 return c.b.GetTokenURI(contractDesc, tokenID) 348 } 349 350 func (c *blockChainWithMetrics) CoreCoinTypeGetBalance(addrDesc bchain.AddressDescriptor) (v *big.Int, err error) { 351 defer func(s time.Time) { c.observeRPCLatency("CoreCoinTypeGetBalance", s, err) }(time.Now()) 352 return c.b.CoreCoinTypeGetBalance(addrDesc) 353 } 354 355 func (c *blockChainWithMetrics) CoreCoinTypeGetNonce(addrDesc bchain.AddressDescriptor) (v uint64, err error) { 356 defer func(s time.Time) { c.observeRPCLatency("CoreCoinTypeGetNonce", s, err) }(time.Now()) 357 return c.b.CoreCoinTypeGetNonce(addrDesc) 358 } 359 360 func (c *blockChainWithMetrics) CoreCoinTypeEstimateEnergy(params map[string]interface{}) (v uint64, err error) { 361 defer func(s time.Time) { c.observeRPCLatency("CoreCoinTypeEstimateEnergy", s, err) }(time.Now()) 362 return c.b.CoreCoinTypeEstimateEnergy(params) 363 } 364 365 func (c *blockChainWithMetrics) CoreCoinTypeGetCrc20ContractBalance(addrDesc, contractDesc bchain.AddressDescriptor) (v *big.Int, err error) { 366 defer func(s time.Time) { c.observeRPCLatency("CoreCoinTypeGetCrc20ContractBalance", s, err) }(time.Now()) 367 return c.b.CoreCoinTypeGetCrc20ContractBalance(addrDesc, contractDesc) 368 } 369 370 type mempoolWithMetrics struct { 371 mempool bchain.Mempool 372 m *common.Metrics 373 } 374 375 func (c *mempoolWithMetrics) observeRPCLatency(method string, start time.Time, err error) { 376 var e string 377 if err != nil { 378 e = "failure" 379 } 380 c.m.RPCLatency.With(common.Labels{"method": method, "error": e}).Observe(float64(time.Since(start)) / 1e6) // in milliseconds 381 } 382 383 func (c *mempoolWithMetrics) Resync() (count int, err error) { 384 defer func(s time.Time) { c.observeRPCLatency("ResyncMempool", s, err) }(time.Now()) 385 count, err = c.mempool.Resync() 386 if err == nil { 387 c.m.MempoolSize.Set(float64(count)) 388 } 389 return count, err 390 } 391 392 func (c *mempoolWithMetrics) GetTransactions(address string) (v []bchain.Outpoint, err error) { 393 defer func(s time.Time) { c.observeRPCLatency("GetMempoolTransactions", s, err) }(time.Now()) 394 return c.mempool.GetTransactions(address) 395 } 396 397 func (c *mempoolWithMetrics) GetAddrDescTransactions(addrDesc bchain.AddressDescriptor) (v []bchain.Outpoint, err error) { 398 defer func(s time.Time) { c.observeRPCLatency("GetMempoolTransactionsForAddrDesc", s, err) }(time.Now()) 399 return c.mempool.GetAddrDescTransactions(addrDesc) 400 } 401 402 func (c *mempoolWithMetrics) GetAllEntries() (v bchain.MempoolTxidEntries) { 403 defer func(s time.Time) { c.observeRPCLatency("GetAllEntries", s, nil) }(time.Now()) 404 return c.mempool.GetAllEntries() 405 } 406 407 func (c *mempoolWithMetrics) GetTransactionTime(txid string) uint32 { 408 return c.mempool.GetTransactionTime(txid) 409 } 410 411 func (c *mempoolWithMetrics) GetTxidFilterEntries(filterScripts string, fromTimestamp uint32) (bchain.MempoolTxidFilterEntries, error) { 412 return c.mempool.GetTxidFilterEntries(filterScripts, fromTimestamp) 413 }