Skip to content

Commit 6943fb5

Browse files
committed
add getSlotLeader
1 parent 08bc9af commit 6943fb5

File tree

4 files changed

+245
-0
lines changed

4 files changed

+245
-0
lines changed

client/rpc_get_slot_leader.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package client
2+
3+
import (
4+
"context"
5+
6+
"github.com/blocto/solana-go-sdk/rpc"
7+
)
8+
9+
type GetSlotLeaderConfig struct {
10+
Commitment *rpc.Commitment
11+
MinContextSlot *uint64
12+
}
13+
14+
func (c GetSlotLeaderConfig) toRpc() rpc.GetSlotLeaderConfig {
15+
return rpc.GetSlotLeaderConfig{
16+
Commitment: c.Commitment,
17+
MinContextSlot: c.MinContextSlot,
18+
}
19+
}
20+
21+
// GetSlotLeader returns the current slot leader
22+
func (c *Client) GetSlotLeader(ctx context.Context) (string, error) {
23+
return process(
24+
func() (rpc.JsonRpcResponse[string], error) {
25+
return c.RpcClient.GetSlotLeader(ctx)
26+
},
27+
forward[string],
28+
)
29+
}
30+
31+
// GetSlotWithConfig returns the current slot leader
32+
func (c *Client) GetSlotLeaderWithConfig(ctx context.Context, cfg GetSlotLeaderConfig) (string, error) {
33+
return process(
34+
func() (rpc.JsonRpcResponse[string], error) {
35+
return c.RpcClient.GetSlotLeaderWithConfig(ctx, cfg.toRpc())
36+
},
37+
forward[string],
38+
)
39+
}

client/rpc_get_slot_leader_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/blocto/solana-go-sdk/internal/client_test"
8+
"github.com/blocto/solana-go-sdk/pkg/pointer"
9+
"github.com/blocto/solana-go-sdk/rpc"
10+
)
11+
12+
func TestClient_GetSlotLeader(t *testing.T) {
13+
client_test.TestAll(
14+
t,
15+
[]client_test.Param{
16+
{
17+
RequestBody: `{"jsonrpc":"2.0", "id":1, "method":"getSlotLeader"}`,
18+
ResponseBody: `{"jsonrpc":"2.0","result":"q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot","id":1}`,
19+
F: func(url string) (any, error) {
20+
c := NewClient(url)
21+
return c.GetSlotLeader(context.TODO())
22+
},
23+
ExpectedValue: "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot",
24+
ExpectedError: nil,
25+
},
26+
},
27+
)
28+
}
29+
30+
func TestClient_GetSlotLeaderWithConfig(t *testing.T) {
31+
client_test.TestAll(
32+
t,
33+
[]client_test.Param{
34+
{
35+
RequestBody: `{"jsonrpc":"2.0", "id":1, "method":"getSlotLeader","params":[{"commitment": "processed"}]}`,
36+
ResponseBody: `{"jsonrpc":"2.0","result":"q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot","id":1}`,
37+
F: func(url string) (any, error) {
38+
c := NewClient(url)
39+
return c.GetSlotLeaderWithConfig(
40+
context.TODO(),
41+
GetSlotLeaderConfig{
42+
Commitment: pointer.Get(rpc.CommitmentProcessed),
43+
},
44+
)
45+
},
46+
ExpectedValue: "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot",
47+
ExpectedError: nil,
48+
},
49+
{
50+
RequestBody: `{"jsonrpc":"2.0", "id":1, "method":"getSlotLeader","params":[{"minContextSlot":0}]}`,
51+
ResponseBody: `{"jsonrpc":"2.0","result":"q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot","id":1}`,
52+
F: func(url string) (any, error) {
53+
c := NewClient(url)
54+
return c.GetSlotLeaderWithConfig(
55+
context.TODO(),
56+
GetSlotLeaderConfig{
57+
MinContextSlot: pointer.Get[uint64](0),
58+
},
59+
)
60+
},
61+
ExpectedValue: "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot",
62+
ExpectedError: nil,
63+
},
64+
{
65+
RequestBody: `{"jsonrpc":"2.0", "id":1, "method":"getSlotLeader","params":[{"commitment": "confirmed","minContextSlot":10}]}`,
66+
ResponseBody: `{"jsonrpc":"2.0","result":"q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot","id":1}`,
67+
F: func(url string) (any, error) {
68+
c := NewClient(url)
69+
return c.GetSlotLeaderWithConfig(
70+
context.TODO(),
71+
GetSlotLeaderConfig{
72+
Commitment: pointer.Get(rpc.CommitmentConfirmed),
73+
MinContextSlot: pointer.Get[uint64](10),
74+
},
75+
)
76+
},
77+
ExpectedValue: "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot",
78+
ExpectedError: nil,
79+
},
80+
},
81+
)
82+
}

rpc/get_slot_leader.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package rpc
2+
3+
import (
4+
"context"
5+
)
6+
7+
type GetSlotLeaderResponse JsonRpcResponse[string]
8+
9+
// GetSlotLeaderConfig is a option config for `getSlotLeader`
10+
type GetSlotLeaderConfig struct {
11+
Commitment *Commitment `json:"commitment,omitempty"`
12+
MinContextSlot *uint64 `json:"minContextSlot,omitempty"`
13+
}
14+
15+
// GetSlotLeader returns the current slot leader
16+
func (c *RpcClient) GetSlotLeader(ctx context.Context) (JsonRpcResponse[string], error) {
17+
return call[JsonRpcResponse[string]](c, ctx, "getSlotLeader")
18+
}
19+
20+
// GetSlotWithConfig returns the current slot leader
21+
func (c *RpcClient) GetSlotLeaderWithConfig(ctx context.Context, cfg GetSlotLeaderConfig) (JsonRpcResponse[string], error) {
22+
return call[JsonRpcResponse[string]](c, ctx, "getSlotLeader", cfg)
23+
}

rpc/get_slot_leader_test.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package rpc
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/blocto/solana-go-sdk/internal/client_test"
8+
"github.com/blocto/solana-go-sdk/pkg/pointer"
9+
)
10+
11+
func TestGetSlotLeader(t *testing.T) {
12+
client_test.TestAll(
13+
t,
14+
[]client_test.Param{
15+
{
16+
RequestBody: `{"jsonrpc":"2.0", "id":1, "method":"getSlotLeader"}`,
17+
ResponseBody: `{"jsonrpc":"2.0","result":"q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot","id":1}`,
18+
F: func(url string) (any, error) {
19+
c := NewRpcClient(url)
20+
return c.GetSlotLeader(context.TODO())
21+
},
22+
ExpectedValue: JsonRpcResponse[string]{
23+
JsonRpc: "2.0",
24+
Id: 1,
25+
Error: nil,
26+
Result: "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot",
27+
},
28+
ExpectedError: nil,
29+
},
30+
},
31+
)
32+
}
33+
34+
func TestGetSlotLeaderWithConfig(t *testing.T) {
35+
client_test.TestAll(
36+
t,
37+
[]client_test.Param{
38+
{
39+
RequestBody: `{"jsonrpc":"2.0", "id":1, "method":"getSlotLeader","params":[{"commitment": "processed"}]}`,
40+
ResponseBody: `{"jsonrpc":"2.0","result":"q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot","id":1}`,
41+
F: func(url string) (any, error) {
42+
c := NewRpcClient(url)
43+
return c.GetSlotLeaderWithConfig(
44+
context.TODO(),
45+
GetSlotLeaderConfig{
46+
Commitment: pointer.Get(CommitmentProcessed),
47+
},
48+
)
49+
},
50+
ExpectedValue: JsonRpcResponse[string]{
51+
JsonRpc: "2.0",
52+
Id: 1,
53+
Error: nil,
54+
Result: "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot",
55+
},
56+
ExpectedError: nil,
57+
},
58+
{
59+
RequestBody: `{"jsonrpc":"2.0", "id":1, "method":"getSlotLeader","params":[{"minContextSlot":0}]}`,
60+
ResponseBody: `{"jsonrpc":"2.0","result":"q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot","id":1}`,
61+
F: func(url string) (any, error) {
62+
c := NewRpcClient(url)
63+
return c.GetSlotLeaderWithConfig(
64+
context.TODO(),
65+
GetSlotLeaderConfig{
66+
MinContextSlot: pointer.Get[uint64](0),
67+
},
68+
)
69+
},
70+
ExpectedValue: JsonRpcResponse[string]{
71+
JsonRpc: "2.0",
72+
Id: 1,
73+
Error: nil,
74+
Result: "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot",
75+
},
76+
ExpectedError: nil,
77+
},
78+
{
79+
RequestBody: `{"jsonrpc":"2.0", "id":1, "method":"getSlotLeader","params":[{"commitment": "confirmed","minContextSlot":10}]}`,
80+
ResponseBody: `{"jsonrpc":"2.0","result":"q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot","id":1}`,
81+
F: func(url string) (any, error) {
82+
c := NewRpcClient(url)
83+
return c.GetSlotLeaderWithConfig(
84+
context.TODO(),
85+
GetSlotLeaderConfig{
86+
Commitment: pointer.Get(CommitmentConfirmed),
87+
MinContextSlot: pointer.Get[uint64](10),
88+
},
89+
)
90+
},
91+
ExpectedValue: JsonRpcResponse[string]{
92+
JsonRpc: "2.0",
93+
Id: 1,
94+
Error: nil,
95+
Result: "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot",
96+
},
97+
ExpectedError: nil,
98+
},
99+
},
100+
)
101+
}

0 commit comments

Comments
 (0)