forked from dmitrymomot/solana-go-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rpc.go
76 lines (66 loc) · 1.68 KB
/
rpc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package client
import (
"encoding/base64"
"fmt"
"strconv"
"github.com/EntySquare/solana-go-sdk/common"
"github.com/EntySquare/solana-go-sdk/rpc"
)
func process[A any, B any](fetch func() (rpc.JsonRpcResponse[A], error), convert func(A) (B, error)) (B, error) {
var output B
res, err := fetch()
if err != nil {
return output, err
}
if err = res.GetError(); err != nil {
return output, err
}
return convert(res.GetResult())
}
func value[T any](v rpc.ValueWithContext[T]) (T, error) {
return v.Value, nil
}
func forward[T any](v T) (T, error) {
return v, nil
}
type TokenAmount struct {
Amount uint64
Decimals uint8
UIAmountString string
}
func newTokenAmount(amount string, decimals uint8, uiAmountString string) (TokenAmount, error) {
u64Amount, err := strconv.ParseUint(amount, 10, 64)
if err != nil {
return TokenAmount{}, fmt.Errorf("failed to convert amount to u64")
}
return TokenAmount{
Amount: u64Amount,
Decimals: decimals,
UIAmountString: uiAmountString,
}, nil
}
type ReturnData struct {
ProgramId common.PublicKey
Data []byte
}
func convertReturnData(d rpc.ReturnData) (ReturnData, error) {
programId := common.PublicKeyFromString(d.ProgramId)
s, ok := d.Data.([]any)
if !ok {
return ReturnData{}, fmt.Errorf("failed to get data")
}
if len(s) != 2 {
return ReturnData{}, fmt.Errorf("unexpected slice lentgh")
}
if s[1].(string) != "base64" {
return ReturnData{}, fmt.Errorf("unexpected encoding method")
}
data, err := base64.StdEncoding.DecodeString(s[0].(string))
if err != nil {
return ReturnData{}, fmt.Errorf("failed to decode data")
}
return ReturnData{
ProgramId: programId,
Data: data,
}, nil
}