forked from gagliardetto/solana-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaccount.go
112 lines (95 loc) · 2.07 KB
/
account.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package solana
import (
"fmt"
)
// Wallet is a wrapper around a PrivateKey
type Wallet struct {
PrivateKey PrivateKey
}
func NewWallet() *Wallet {
privateKey, err := NewRandomPrivateKey()
if err != nil {
panic(fmt.Sprintf("failed to generate private key: %s", err))
}
return &Wallet{
PrivateKey: privateKey,
}
}
func WalletFromPrivateKeyBase58(privateKey string) (*Wallet, error) {
k, err := PrivateKeyFromBase58(privateKey)
if err != nil {
return nil, fmt.Errorf("account from private key: private key from b58: %w", err)
}
return &Wallet{
PrivateKey: k,
}, nil
}
func (a *Wallet) PublicKey() PublicKey {
return a.PrivateKey.PublicKey()
}
type AccountMeta struct {
PublicKey PublicKey
IsWritable bool
IsSigner bool
}
// Meta intializes a new AccountMeta with the provided pubKey.
func Meta(
pubKey PublicKey,
) *AccountMeta {
return &AccountMeta{
PublicKey: pubKey,
}
}
// WRITE sets IsWritable to true.
func (meta *AccountMeta) WRITE() *AccountMeta {
meta.IsWritable = true
return meta
}
// SIGNER sets IsSigner to true.
func (meta *AccountMeta) SIGNER() *AccountMeta {
meta.IsSigner = true
return meta
}
func NewAccountMeta(
pubKey PublicKey,
WRITE bool,
SIGNER bool,
) *AccountMeta {
return &AccountMeta{
PublicKey: pubKey,
IsWritable: WRITE,
IsSigner: SIGNER,
}
}
func (a *AccountMeta) less(act *AccountMeta) bool {
if a.IsSigner && !act.IsSigner {
return true
} else if !a.IsSigner && act.IsSigner {
return false
}
if a.IsWritable {
return true
}
return false
}
type AccountMetaSlice []*AccountMeta
func (slice *AccountMetaSlice) Append(account *AccountMeta) {
*slice = append(*slice, account)
}
func (slice *AccountMetaSlice) SetAccounts(accounts []*AccountMeta) error {
*slice = accounts
return nil
}
func (slice AccountMetaSlice) GetAccounts() []*AccountMeta {
return slice
}
// GetSigners returns the accounts that are signers.
func (slice AccountMetaSlice) GetSigners() []*AccountMeta {
signers := make([]*AccountMeta, 0)
for _, ac := range slice {
if ac.IsSigner {
signers = append(signers, ac)
}
}
return signers
}