github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/rpc/apis.go (about) 1 package rpc 2 3 import ( 4 "strings" 5 6 "github.com/ethereum/go-ethereum/rpc" 7 "github.com/fibonacci-chain/fbc/app/rpc/namespaces/eth/txpool" 8 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context" 9 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server" 10 "github.com/fibonacci-chain/fbc/libs/tendermint/libs/log" 11 evmtypes "github.com/fibonacci-chain/fbc/x/evm/types" 12 "github.com/spf13/viper" 13 "golang.org/x/time/rate" 14 15 "github.com/fibonacci-chain/fbc/app/crypto/ethsecp256k1" 16 "github.com/fibonacci-chain/fbc/app/rpc/backend" 17 "github.com/fibonacci-chain/fbc/app/rpc/namespaces/debug" 18 "github.com/fibonacci-chain/fbc/app/rpc/namespaces/eth" 19 "github.com/fibonacci-chain/fbc/app/rpc/namespaces/eth/filters" 20 "github.com/fibonacci-chain/fbc/app/rpc/namespaces/net" 21 "github.com/fibonacci-chain/fbc/app/rpc/namespaces/personal" 22 "github.com/fibonacci-chain/fbc/app/rpc/namespaces/web3" 23 rpctypes "github.com/fibonacci-chain/fbc/app/rpc/types" 24 cosmost "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types" 25 ) 26 27 // RPC namespaces and API version 28 const ( 29 Web3Namespace = "web3" 30 EthNamespace = "eth" 31 PersonalNamespace = "personal" 32 NetNamespace = "net" 33 TxpoolNamespace = "txpool" 34 DebugNamespace = "debug" 35 36 apiVersion = "1.0" 37 ) 38 39 var ethBackend *backend.EthermintBackend 40 41 func CloseEthBackend() { 42 if ethBackend != nil { 43 ethBackend.Close() 44 } 45 } 46 47 // GetAPIs returns the list of all APIs from the Ethereum namespaces 48 func GetAPIs(clientCtx context.CLIContext, log log.Logger, keys ...ethsecp256k1.PrivKey) []rpc.API { 49 nonceLock := new(rpctypes.AddrLocker) 50 rateLimiters := getRateLimiter() 51 disableAPI := getDisableAPI() 52 ethBackend = backend.New(clientCtx, log, rateLimiters, disableAPI) 53 ethAPI := eth.NewAPI(clientCtx, log, ethBackend, nonceLock, keys...) 54 if evmtypes.GetEnableBloomFilter() { 55 ethBackend.StartBloomHandlers(evmtypes.BloomBitsBlocks, evmtypes.GetIndexer().GetDB()) 56 } 57 58 apis := []rpc.API{ 59 { 60 Namespace: Web3Namespace, 61 Version: apiVersion, 62 Service: web3.NewAPI(log), 63 Public: true, 64 }, 65 { 66 Namespace: EthNamespace, 67 Version: apiVersion, 68 Service: ethAPI, 69 Public: true, 70 }, 71 { 72 Namespace: EthNamespace, 73 Version: apiVersion, 74 Service: filters.NewAPI(clientCtx, log, ethBackend), 75 Public: true, 76 }, 77 { 78 Namespace: NetNamespace, 79 Version: apiVersion, 80 Service: net.NewAPI(clientCtx, log), 81 Public: true, 82 }, 83 { 84 Namespace: TxpoolNamespace, 85 Version: apiVersion, 86 Service: txpool.NewAPI(clientCtx, log, ethBackend), 87 Public: true, 88 }, 89 } 90 91 if viper.GetBool(FlagPersonalAPI) { 92 apis = append(apis, rpc.API{ 93 Namespace: PersonalNamespace, 94 Version: apiVersion, 95 Service: personal.NewAPI(ethAPI, log), 96 Public: false, 97 }) 98 } 99 100 if viper.GetBool(FlagDebugAPI) && viper.GetString(server.FlagPruning) == cosmost.PruningOptionNothing { 101 apis = append(apis, rpc.API{ 102 Namespace: DebugNamespace, 103 Version: apiVersion, 104 Service: debug.NewAPI(clientCtx, log, ethBackend), 105 Public: true, 106 }) 107 } 108 109 return apis 110 } 111 112 func getRateLimiter() map[string]*rate.Limiter { 113 rateLimitApi := viper.GetString(FlagRateLimitAPI) 114 rateLimitCount := viper.GetInt(FlagRateLimitCount) 115 rateLimitBurst := viper.GetInt(FlagRateLimitBurst) 116 if rateLimitApi == "" || rateLimitCount == 0 { 117 return nil 118 } 119 rateLimiters := make(map[string]*rate.Limiter) 120 apis := strings.Split(rateLimitApi, ",") 121 for _, api := range apis { 122 rateLimiters[api] = rate.NewLimiter(rate.Limit(rateLimitCount), rateLimitBurst) 123 } 124 return rateLimiters 125 } 126 127 func getDisableAPI() map[string]bool { 128 disableAPI := viper.GetString(FlagDisableAPI) 129 apiMap := make(map[string]bool) 130 apis := strings.Split(disableAPI, ",") 131 for _, api := range apis { 132 apiMap[api] = true 133 } 134 return apiMap 135 }