diff --git a/client/explorer/explorer.go b/client/explorer/explorer.go index ce9fff24..c259d602 100644 --- a/client/explorer/explorer.go +++ b/client/explorer/explorer.go @@ -1,35 +1,41 @@ -package exchange +package explorer import ( "context" - "fmt" + log "github.com/InjectiveLabs/suplog" + "github.com/pkg/errors" + "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "github.com/InjectiveLabs/sdk-go/client/common" explorerPB "github.com/InjectiveLabs/sdk-go/exchange/explorer_rpc/pb" - log "github.com/InjectiveLabs/suplog" - "github.com/pkg/errors" - "google.golang.org/grpc" ) type ExplorerClient interface { QueryClient() *grpc.ClientConn - GetTxByTxHash(ctx context.Context, hash string) (*explorerPB.GetTxByTxHashResponse, error) - GetTxs(ctx context.Context, req *explorerPB.GetTxsRequest) (*explorerPB.GetTxsResponse, error) - GetBlock(ctx context.Context, blockHeight string) (*explorerPB.GetBlockResponse, error) - GetBlocks(ctx context.Context) (*explorerPB.GetBlocksResponse, error) GetAccountTxs(ctx context.Context, req *explorerPB.GetAccountTxsRequest) (*explorerPB.GetAccountTxsResponse, error) + FetchContractTxs(ctx context.Context, req *explorerPB.GetContractTxsRequest) (*explorerPB.GetContractTxsResponse, error) + FetchContractTxsV2(ctx context.Context, req *explorerPB.GetContractTxsV2Request) (*explorerPB.GetContractTxsV2Response, error) + GetBlocks(ctx context.Context) (*explorerPB.GetBlocksResponse, error) + GetBlock(ctx context.Context, blockHeight string) (*explorerPB.GetBlockResponse, error) + FetchValidators(ctx context.Context) (*explorerPB.GetValidatorsResponse, error) + FetchValidator(ctx context.Context, address string) (*explorerPB.GetValidatorResponse, error) + FetchValidatorUptime(ctx context.Context, address string) (*explorerPB.GetValidatorUptimeResponse, error) + GetTxs(ctx context.Context, req *explorerPB.GetTxsRequest) (*explorerPB.GetTxsResponse, error) + GetTxByTxHash(ctx context.Context, hash string) (*explorerPB.GetTxByTxHashResponse, error) GetPeggyDeposits(ctx context.Context, req *explorerPB.GetPeggyDepositTxsRequest) (*explorerPB.GetPeggyDepositTxsResponse, error) GetPeggyWithdrawals(ctx context.Context, req *explorerPB.GetPeggyWithdrawalTxsRequest) (*explorerPB.GetPeggyWithdrawalTxsResponse, error) GetIBCTransfers(ctx context.Context, req *explorerPB.GetIBCTransferTxsRequest) (*explorerPB.GetIBCTransferTxsResponse, error) - StreamTxs(ctx context.Context) (explorerPB.InjectiveExplorerRPC_StreamTxsClient, error) - StreamBlocks(ctx context.Context) (explorerPB.InjectiveExplorerRPC_StreamBlocksClient, error) GetWasmCodes(ctx context.Context, req *explorerPB.GetWasmCodesRequest) (*explorerPB.GetWasmCodesResponse, error) GetWasmCodeByID(ctx context.Context, req *explorerPB.GetWasmCodeByIDRequest) (*explorerPB.GetWasmCodeByIDResponse, error) GetWasmContracts(ctx context.Context, req *explorerPB.GetWasmContractsRequest) (*explorerPB.GetWasmContractsResponse, error) GetWasmContractByAddress(ctx context.Context, req *explorerPB.GetWasmContractByAddressRequest) (*explorerPB.GetWasmContractByAddressResponse, error) GetCW20Balance(ctx context.Context, req *explorerPB.GetCw20BalanceRequest) (*explorerPB.GetCw20BalanceResponse, error) + FetchRelayers(ctx context.Context, marketIDs []string) (*explorerPB.RelayersResponse, error) + FetchBankTransfers(ctx context.Context, req *explorerPB.GetBankTransfersRequest) (*explorerPB.GetBankTransfersResponse, error) + StreamTxs(ctx context.Context) (explorerPB.InjectiveExplorerRPC_StreamTxsClient, error) + StreamBlocks(ctx context.Context) (explorerPB.InjectiveExplorerRPC_StreamBlocksClient, error) Close() } @@ -96,7 +102,6 @@ func (c *explorerClient) GetTxByTxHash(ctx context.Context, hash string) (*explo res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetTxByTxHash, &req) if err != nil { - fmt.Println(err) return &explorerPB.GetTxByTxHashResponse{}, err } @@ -107,7 +112,6 @@ func (c *explorerClient) GetAccountTxs(ctx context.Context, req *explorerPB.GetA res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetAccountTxs, req) if err != nil { - fmt.Println(err) return &explorerPB.GetAccountTxsResponse{}, err } @@ -120,7 +124,6 @@ func (c *explorerClient) GetBlocks(ctx context.Context) (*explorerPB.GetBlocksRe res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetBlocks, &req) if err != nil { - fmt.Println(err) return &explorerPB.GetBlocksResponse{}, err } @@ -135,18 +138,62 @@ func (c *explorerClient) GetBlock(ctx context.Context, blockHeight string) (*exp res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetBlock, &req) if err != nil { - fmt.Println(err) return &explorerPB.GetBlockResponse{}, err } return res, nil } +func (c *explorerClient) FetchValidators(ctx context.Context) (*explorerPB.GetValidatorsResponse, error) { + req := &explorerPB.GetValidatorsRequest{} + + res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetValidators, req) + + if err != nil { + return &explorerPB.GetValidatorsResponse{}, err + } + + return res, nil +} + +func (c *explorerClient) FetchValidator( + ctx context.Context, + address string, +) (*explorerPB.GetValidatorResponse, error) { + req := &explorerPB.GetValidatorRequest{ + Address: address, + } + + res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetValidator, req) + + if err != nil { + return &explorerPB.GetValidatorResponse{}, err + } + + return res, nil +} + +func (c *explorerClient) FetchValidatorUptime( + ctx context.Context, + address string, +) (*explorerPB.GetValidatorUptimeResponse, error) { + req := &explorerPB.GetValidatorUptimeRequest{ + Address: address, + } + + res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetValidatorUptime, req) + + if err != nil { + return &explorerPB.GetValidatorUptimeResponse{}, err + } + + return res, nil +} + func (c *explorerClient) GetTxs(ctx context.Context, req *explorerPB.GetTxsRequest) (*explorerPB.GetTxsResponse, error) { res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetTxs, req) if err != nil { - fmt.Println(err) return &explorerPB.GetTxsResponse{}, err } @@ -157,7 +204,6 @@ func (c *explorerClient) GetPeggyDeposits(ctx context.Context, req *explorerPB.G res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetPeggyDepositTxs, req) if err != nil { - fmt.Println(err) return &explorerPB.GetPeggyDepositTxsResponse{}, err } @@ -168,7 +214,6 @@ func (c *explorerClient) GetPeggyWithdrawals(ctx context.Context, req *explorerP res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetPeggyWithdrawalTxs, req) if err != nil { - fmt.Println(err) return &explorerPB.GetPeggyWithdrawalTxsResponse{}, err } @@ -179,7 +224,6 @@ func (c *explorerClient) GetIBCTransfers(ctx context.Context, req *explorerPB.Ge res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetIBCTransferTxs, req) if err != nil { - fmt.Println(err) return &explorerPB.GetIBCTransferTxsResponse{}, err } @@ -192,7 +236,6 @@ func (c *explorerClient) StreamTxs(ctx context.Context) (explorerPB.InjectiveExp stream, err := common.ExecuteStreamCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.StreamTxs, &req) if err != nil { - fmt.Println(err) return nil, err } @@ -205,7 +248,6 @@ func (c *explorerClient) StreamBlocks(ctx context.Context) (explorerPB.Injective stream, err := common.ExecuteStreamCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.StreamBlocks, &req) if err != nil { - fmt.Println(err) return nil, err } @@ -216,7 +258,6 @@ func (c *explorerClient) GetWasmCodes(ctx context.Context, req *explorerPB.GetWa res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetWasmCodes, req) if err != nil { - fmt.Println(err) return &explorerPB.GetWasmCodesResponse{}, err } @@ -227,7 +268,6 @@ func (c *explorerClient) GetWasmCodeByID(ctx context.Context, req *explorerPB.Ge res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetWasmCodeByID, req) if err != nil { - fmt.Println(err) return &explorerPB.GetWasmCodeByIDResponse{}, err } @@ -238,7 +278,6 @@ func (c *explorerClient) GetWasmContracts(ctx context.Context, req *explorerPB.G res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetWasmContracts, req) if err != nil { - fmt.Println(err) return &explorerPB.GetWasmContractsResponse{}, err } @@ -249,7 +288,6 @@ func (c *explorerClient) GetWasmContractByAddress(ctx context.Context, req *expl res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetWasmContractByAddress, req) if err != nil { - fmt.Println(err) return &explorerPB.GetWasmContractByAddressResponse{}, err } @@ -260,13 +298,68 @@ func (c *explorerClient) GetCW20Balance(ctx context.Context, req *explorerPB.Get res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetCw20Balance, req) if err != nil { - fmt.Println(err) return &explorerPB.GetCw20BalanceResponse{}, err } return res, nil } +func (c *explorerClient) FetchContractTxs( + ctx context.Context, + req *explorerPB.GetContractTxsRequest, +) (*explorerPB.GetContractTxsResponse, error) { + res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetContractTxs, req) + + if err != nil { + return &explorerPB.GetContractTxsResponse{}, err + } + + return res, nil +} + +func (c *explorerClient) FetchContractTxsV2( + ctx context.Context, + req *explorerPB.GetContractTxsV2Request, +) (*explorerPB.GetContractTxsV2Response, error) { + res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetContractTxsV2, req) + + if err != nil { + return &explorerPB.GetContractTxsV2Response{}, err + } + + return res, nil +} + +func (c *explorerClient) FetchRelayers( + ctx context.Context, + marketIDs []string, +) (*explorerPB.RelayersResponse, error) { + req := &explorerPB.RelayersRequest{ + MarketIDs: marketIDs, + } + + res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.Relayers, req) + + if err != nil { + return &explorerPB.RelayersResponse{}, err + } + + return res, nil +} + +func (c *explorerClient) FetchBankTransfers( + ctx context.Context, + req *explorerPB.GetBankTransfersRequest, +) (*explorerPB.GetBankTransfersResponse, error) { + res, err := common.ExecuteCall(ctx, c.network.ExplorerCookieAssistant, c.explorerClient.GetBankTransfers, req) + + if err != nil { + return &explorerPB.GetBankTransfersResponse{}, err + } + + return res, nil +} + func (c *explorerClient) Close() { c.conn.Close() } diff --git a/examples/explorer/16_GetContractTxs/example.go b/examples/explorer/16_GetContractTxs/example.go new file mode 100644 index 00000000..2848519b --- /dev/null +++ b/examples/explorer/16_GetContractTxs/example.go @@ -0,0 +1,48 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "github.com/InjectiveLabs/sdk-go/client/common" + "github.com/InjectiveLabs/sdk-go/client/explorer" + explorerPB "github.com/InjectiveLabs/sdk-go/exchange/explorer_rpc/pb" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + + explorerClient, err := explorer.NewExplorerClient(network) + if err != nil { + log.Fatalf("Failed to create explorer client: %v", err) + } + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Example contract address (replace with an actual contract address) + contractAddress := "inj1ady3s7whq30l4fx8sj3x6muv5mx4dfdlcpv8n7" + + req := &explorerPB.GetContractTxsRequest{ + Address: contractAddress, + Limit: 10, // Fetch 10 transactions + } + + response, err := explorerClient.FetchContractTxs(ctx, req) + if err != nil { + log.Fatalf("Failed to fetch contract transactions: %v", err) + } + + fmt.Println("Total Contract Transactions:", len(response.Data)) + for _, tx := range response.Data { + fmt.Printf("Tx Hash: %s, Block: %d\n", tx.Hash, tx.BlockNumber) + } + + fmt.Printf("\n\n") + fmt.Println("Full response:") + str, _ := json.MarshalIndent(response, "", " ") + fmt.Print(string(str)) +} diff --git a/examples/explorer/17_GetContractTxsV2/example.go b/examples/explorer/17_GetContractTxsV2/example.go new file mode 100644 index 00000000..7735a2e8 --- /dev/null +++ b/examples/explorer/17_GetContractTxsV2/example.go @@ -0,0 +1,49 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "github.com/InjectiveLabs/sdk-go/client/common" + "github.com/InjectiveLabs/sdk-go/client/explorer" + explorerPB "github.com/InjectiveLabs/sdk-go/exchange/explorer_rpc/pb" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + + explorerClient, err := explorer.NewExplorerClient(network) + if err != nil { + log.Fatalf("Failed to create explorer client: %v", err) + } + defer explorerClient.Close() + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Example contract address (replace with an actual contract address) + contractAddress := "inj1ady3s7whq30l4fx8sj3x6muv5mx4dfdlcpv8n7" + + req := &explorerPB.GetContractTxsV2Request{ + Address: contractAddress, + Limit: 10, // Fetch 10 transactions + } + + response, err := explorerClient.FetchContractTxsV2(ctx, req) + if err != nil { + log.Fatalf("Failed to fetch contract transactions V2: %v", err) + } + + fmt.Println("Total Contract Transactions:", len(response.Data)) + for _, tx := range response.Data { + fmt.Printf("Tx Hash: %s, Block: %d\n", tx.Hash, tx.BlockNumber) + } + + fmt.Printf("\n\n") + fmt.Println("Full response:") + str, _ := json.MarshalIndent(response, "", " ") + fmt.Print(string(str)) +} diff --git a/examples/explorer/18_GetValidators/example.go b/examples/explorer/18_GetValidators/example.go new file mode 100644 index 00000000..b3965f89 --- /dev/null +++ b/examples/explorer/18_GetValidators/example.go @@ -0,0 +1,34 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "github.com/InjectiveLabs/sdk-go/client/common" + "github.com/InjectiveLabs/sdk-go/client/explorer" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + + explorerClient, err := explorer.NewExplorerClient(network) + if err != nil { + log.Fatalf("Failed to create explorer client: %v", err) + } + defer explorerClient.Close() + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + response, err := explorerClient.FetchValidators(ctx) + if err != nil { + log.Fatalf("Failed to fetch validators: %v", err) + } + + fmt.Println("Full response:") + str, _ := json.MarshalIndent(response, "", " ") + fmt.Print(string(str)) +} diff --git a/examples/explorer/19_GetValidator/example.go b/examples/explorer/19_GetValidator/example.go new file mode 100644 index 00000000..d65d7ea7 --- /dev/null +++ b/examples/explorer/19_GetValidator/example.go @@ -0,0 +1,37 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "github.com/InjectiveLabs/sdk-go/client/common" + "github.com/InjectiveLabs/sdk-go/client/explorer" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + + explorerClient, err := explorer.NewExplorerClient(network) + if err != nil { + log.Fatalf("Failed to create explorer client: %v", err) + } + defer explorerClient.Close() + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Example validator address (replace with an actual validator address) + validatorAddress := "injvaloper1kk523rsm9pey740cx4plalp40009ncs0wrchfe" + + response, err := explorerClient.FetchValidator(ctx, validatorAddress) + if err != nil { + log.Fatalf("Failed to fetch validator: %v", err) + } + + fmt.Println("Validator:") + str, _ := json.MarshalIndent(response, "", " ") + fmt.Print(string(str)) +} diff --git a/examples/explorer/20_GetValidatorUptime/example.go b/examples/explorer/20_GetValidatorUptime/example.go new file mode 100644 index 00000000..91f53729 --- /dev/null +++ b/examples/explorer/20_GetValidatorUptime/example.go @@ -0,0 +1,37 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "github.com/InjectiveLabs/sdk-go/client/common" + "github.com/InjectiveLabs/sdk-go/client/explorer" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + + explorerClient, err := explorer.NewExplorerClient(network) + if err != nil { + log.Fatalf("Failed to create explorer client: %v", err) + } + defer explorerClient.Close() + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Example validator address (replace with an actual validator address) + validatorAddress := "injvaloper1kk523rsm9pey740cx4plalp40009ncs0wrchfe" + + response, err := explorerClient.FetchValidatorUptime(ctx, validatorAddress) + if err != nil { + log.Fatalf("Failed to fetch validator uptime: %v", err) + } + + fmt.Println("Validator uptime:") + str, _ := json.MarshalIndent(response, "", " ") + fmt.Print(string(str)) +} diff --git a/examples/explorer/21_Relayers/example.go b/examples/explorer/21_Relayers/example.go new file mode 100644 index 00000000..b74f56b0 --- /dev/null +++ b/examples/explorer/21_Relayers/example.go @@ -0,0 +1,37 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "github.com/InjectiveLabs/sdk-go/client/common" + "github.com/InjectiveLabs/sdk-go/client/explorer" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + + explorerClient, err := explorer.NewExplorerClient(network) + if err != nil { + log.Fatalf("Failed to create explorer client: %v", err) + } + defer explorerClient.Close() + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Pass an empty list of market IDs + var marketIds []string + + response, err := explorerClient.FetchRelayers(ctx, marketIds) + if err != nil { + log.Fatalf("Failed to fetch relayers: %v", err) + } + + fmt.Println("Relayers:") + str, _ := json.MarshalIndent(response, "", " ") + fmt.Print(string(str)) +} diff --git a/examples/explorer/22_GetBankTransfers/example.go b/examples/explorer/22_GetBankTransfers/example.go new file mode 100644 index 00000000..748ff717 --- /dev/null +++ b/examples/explorer/22_GetBankTransfers/example.go @@ -0,0 +1,40 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "time" + + "github.com/InjectiveLabs/sdk-go/client/common" + "github.com/InjectiveLabs/sdk-go/client/explorer" + explorerPB "github.com/InjectiveLabs/sdk-go/exchange/explorer_rpc/pb" +) + +func main() { + network := common.LoadNetwork("testnet", "lb") + + explorerClient, err := explorer.NewExplorerClient(network) + if err != nil { + log.Fatalf("Failed to create explorer client: %v", err) + } + defer explorerClient.Close() + + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + req := &explorerPB.GetBankTransfersRequest{ + Senders: []string{"inj17xpfvakm2amg962yls6f84z3kell8c5l6s5ye9"}, + Limit: 5, // Limit number of transfers + } + + response, err := explorerClient.FetchBankTransfers(ctx, req) + if err != nil { + log.Fatalf("Failed to fetch bank transfers: %v", err) + } + + fmt.Println("Bank transfers:") + str, _ := json.MarshalIndent(response, "", " ") + fmt.Print(string(str)) +} diff --git a/examples/explorer/5_TxsRequest/example.go b/examples/explorer/5_TxsRequest/example.go index dd57bfe8..33425b1d 100644 --- a/examples/explorer/5_TxsRequest/example.go +++ b/examples/explorer/5_TxsRequest/example.go @@ -5,10 +5,9 @@ import ( "encoding/json" "fmt" - explorerPB "github.com/InjectiveLabs/sdk-go/exchange/explorer_rpc/pb" - "github.com/InjectiveLabs/sdk-go/client/common" explorerclient "github.com/InjectiveLabs/sdk-go/client/explorer" + explorerPB "github.com/InjectiveLabs/sdk-go/exchange/explorer_rpc/pb" ) func main() {